Chuyển đến nội dung chính

第 10 課:配置圖與秘密

使用 ConfigMap 管理配置,使用 Secrets 管理敏感資料。不可變的 ConfigMaps/Secrets、靜態金鑰加密、用於從 AWS Secrets Manager、GCP Secret Manager、HashiCorp Vault 同步的外部 Secrets Operator。

Kubernetes 中的設定對映與機密__HTMLTAG_1___

在生產環境中,應用程式需要從外部環境讀取配置,而不是將其硬編碼到容器映像中。 Kubernetes 提供了兩種專門的機制:用於通用配置資料的 ConfigMap 和用於敏感資料的 Secret。本課程將深入探討這兩個問題,包括靜態加密以及與外部秘密管理系統的整合。

ConfigMaps & Secrets trong Kubernetes

ConfigMaps:管理設定資料

什麼是 ConfigMap?

ConfigMap 是一個儲存鍵值設定資料的 Kubernetes 物件。這些資料與容器鏡像完全隔離,可讓您變更配置而無需重建鏡像。 ConfigMap 可以包含簡單的字串、多行設定文件,甚至整個檔案內容。

ConfigMap 符合:

  • 應用程式環境變數(資料庫主機、連接埠、功能標誌)
  • 設定檔內容(nginx.conf、application.properties)
  • 容器的命令列參數__HTMLTAG_23___
  • 其他非敏感設定__HTMLTAG_25___

從文字值建立 ConfigMap

程式碼區塊_0

從檔案建立 ConfigMap

程式碼區塊_1

ConfigMap YAML 定義

程式碼區塊_2

如何在 Pod 中使用 ConfigMap

1。 ConfigMap 中的環境變數

程式碼區塊_3

2。從 ConfigMap掛載磁碟區

程式碼區塊_4

3。來自 ConfigMap 的命令列參數

程式碼區塊_5

秘密:管理敏感資料

什麼是秘密以及為什麼 Base64 不加密?

Kubernetes 中的 Secret 儲存敏感數據,例如密碼、令牌和 TLS 憑證。要理解的一件重要的事情是:預設的秘密僅是 base64 編碼的,而不是編碼的。 Base64 只是一種透過文字通道傳輸二進位資料的編碼 - 任何人都可以輕鬆解碼它。

程式碼區塊_6

這意味著任何有權在 etcd 中或透過 Kubernetes API 讀取 Secret 的人都可以看到實際值。因此,需要額外的安全層,我們將在稍後討論。

秘密型別

1。不透明(通用)秘密

程式碼區塊_7

程式碼區塊_8

2。 TLS 秘密

程式碼區塊_9

程式碼區塊_10

3。 Docker 註冊表秘密

程式碼區塊_11

程式碼區塊_12

在 Pod 中使用 Secret

將 Secret 安裝為環境變數__HTMLTAG_62___

程式碼區塊_13

將 Secret 安裝為卷宗

程式碼區塊_14

不可變的設定映射與秘密

為什麼是不可變的?

在數千個 Pod 的大型叢集中,每個 ConfigMap/Secret 變更都會觸發所有 kubelet 的監視事件。這會給 kube-apiserver 帶來很大的負載。 Kubernetes 1.21+ 支援 不可變的 ConfigMap 和 Secrets — 對生產叢集的重要最佳化。

不可變的好處:

  • 卸載 kube-apiserver:kubelet 無需監視變更
  • 提高穩定性:防止可能破壞應用程式的意外更新
  • 大量 Pod 的效能顯著提升__HTMLTAG_81___

程式碼區塊_15

程式碼區塊_16

程式碼區塊_17

靜態秘密加密

預設儲存的問題

預設情況下,Secrets 以 base64 純文字形式保存在 etcd 中。任何有權讀取 etcd 或 etcd 備份的人都可以看到所有秘密值。這是生產中的嚴重安全風險。

加密配置

Kubernetes 透過 EncryptionConfiguration 支援靜態加密 — kube-apiserver 的設定文件,指定如何在儲存到 etcd 之前對資源進行加密。

程式碼區塊_18

程式碼區塊_19

外部機密業者

為什麼我們需要外部秘密操作員?

靜態加密可以保護 etcd 中的機密,但仍存在一個問題:機密仍在 Kubernetes 中管理。在企業環境中,機密通常在 AWS Secrets Manager、HashiCorp Vault、GCP Secret Manager、Azure Key Vault 中集中管理。 外部 Secrets Operator (ESO) 透過自動將外部系統的 Secret 同步到 Kubernetes Secret 來解決此問題。

設定外部機密運算子

程式碼區塊_20

SecretStore 和 ClusterSecretStore CRD

ESO 使用兩種主要類型的 CRD:SecretStore(命名空間範圍)和 ClusterSecretStore(叢集範圍)。您可以在此處設定與外部秘密後端的連線。

AWS Secrets Manager 的 ClusterSecretStore__HTMLTAG_114___

程式碼區塊_21

程式碼區塊_22

從 AWS Secrets Manager 同步的外部Secret

程式碼區塊_23

同步所有 AWS 金鑰

程式碼區塊_24

HashiCorp Vault 的 SecretStore

程式碼區塊_25

程式碼區塊_26

程式碼區塊_27

ConfigMap 和 Secret 的最佳實務__HTMLTAG_122___

1。不要向 Git 提交秘密

程式碼區塊_28

2。 RBAC 的秘密

程式碼區塊_29

3。秘密輪換

程式碼區塊_30

4。秘密命名空間隔離

程式碼區塊_31

5。秘密存取的審核日誌

程式碼區塊_32

摘要

ConfigMaps 和 Secrets 是 Kubernetes 中設定管理的基礎。要記住的重點:

    ___HTMLTAG_138__HTMLTAG_139___ConfigMap 用於非敏感配置,支援環境變數、磁碟區掛載和命令參數 ___HTMLTAG_142__HTMLTAG_143___秘密預設僅base64編碼 - 不加密,需要額外的安全層 ___HTMLTAG_146__HTMLTAG_147___不可變 ConfigMaps/Secrets 顯著提高大型叢集中的效能 ___HTMLTAG_150__HTMLTAG_151___加密設定 使用 AES-GCM/AES-CBC 加密 etcd 中的靜態金鑰 ___HTMLTAG_154__HTMLTAG_155___外部 Secrets Operator 是最佳生產解決方案:從 Vault、AWS Secrets Manager 同步,減少攻擊面__HTMLTAG_157___
  • 始終嚴格應用 RBAC,不要向 Git 提交機密,並製定輪換計劃