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