一、什么是?Secret?
Kubernetes(K8s)中的?Secret?是一種用于存儲和管理敏感信息(如密碼、令牌、證書、API 密鑰等)的資源對象。它避免了將敏感數據明文寫入配置文件、鏡像或代碼中,提供了一種更安全的方式來處理機密信息。
二、主要用途
- 安全需求:敏感信息(如數據庫密碼、API 令牌)不應以明文形式硬編碼在配置文件或鏡像中,否則可能導致泄露。
- 解耦配置與代碼:將敏感數據與應用邏輯分離,便于統一管理和更新。
- 標準化管理:K8s 提供內置機制管理 Secret,支持通過 API 或命令行動態創建、更新和分發。
三、核心特性
- 數據編碼:
- 默認使用?Base64 編碼存儲數據(非加密,需結合其他加密手段,如 etcd 加密或外部密鑰管理系統)。
- 數據以鍵值對(Key-Value)形式存儲,支持通過環境變量或 Volume 掛載到 Pod。
- 作用域:
- Secret 屬于特定?Namespace(命名空間),默認僅在所屬 Namespace 內可見。
- 類型:
- 常見三種內置 Secret 類型:
- Opaque(通用型):用于存儲任意鍵值對,默認類型。
- kubernetes.io/service-account-token:自動為 ServiceAccount 生成的令牌,用于訪問 API Server。
- kubernetes.io/tls:用于存儲 TLS 證書和私鑰,供 Ingress、Service 等使用。
四、?創建 Secret 的常用方式
4.1. 通過 kubectl 命令創建
通過 kubectl 命令創建,需要為其設置命令參數。
kubectl create secret --help
?
- generic:用來創建 Opaque 類型的 Secret。用于存儲任意鍵值對。
- tls:用來創建?kubernetes.io/tls 類型的?Secret。用于存儲 TLS 證書和私鑰。
- docker-registry:若要保存 docker 倉庫的認證信息的話,就必須使用此種類型來創建。
?4.1.1、直接指定字面量(適合小數據)
# 創建 Opaque 類型 Secret,鍵值對直接通過 --from-literal 指定
kubectl create secret generic my-secret \--from-literal=username=admin \--from-literal=password=123456
?
已用 Base64 編碼。
?4.1.2、從文件加載(適合文件型機密,如證書、密鑰)
vim username.txt
# 輸入 admin
vim password.txt
# 輸入 123456# 從單個文件創建(文件名作為鍵),值為文件內容
kubectl create secret generic db-credentials --from-file=username.txt --from-file=password.txt
?4.1.3、從目錄創建(目錄下所有文件作為鍵值對)
mkdir dir
cd dir
vim usr.txt
# 輸入 admin
vim pwd.txt
# 輸入 123456kubectl create secret generic app-secret --from-file=.
4.2、通過 YAML 清單創建
apiVersion: v1
kind: Secret
metadata:name: yml-secretnamespace: default
type: Opaque # 類型,可選 Opaque、service-account-token、tls 等
data:# 鍵值對需手動進行 Base64 編碼username: YWRtaW4= # 明文 "admin" 的 Base64 編碼password: MTIzNDU2 # 明文 "123456" 的 Base64 編碼
- 編碼方法:echo -n "明文" | base64?
- -n 不換行的意思。
- echo -n "密文" | base64 -d
- -d decode 的意思。
五、在 Pod 中使用 Secret
5.1、作為環境變量注入
apiVersion: v1
kind: Pod
metadata:name: secret-env-pod
spec:restartPolicy: Nevercontainers:- name: appimage: alpine:latest imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]env:- name: DB_USERNAME # 環境變量名valueFrom:secretKeyRef:name: my-secret # Secret 名稱key: username # Secret 中的鍵- name: DB_PASSWORDvalueFrom:secretKeyRef:name: my-secretkey: password
- ?進入容器查看環境變量
kubectl exec -it secret-env-pod -- /bin/sh
/ # env
5.2、作為 Volume 掛載
apiVersion: v1
kind: Pod
metadata:name: secret-volume-pod
spec:restartPolicy: Nevervolumes:- name: secret-volumesecret:secretName: yml-secret # 指定 Secret 名稱containers:- name: appimage: alpine:latest imagePullPolicy: IfNotPresentcommand: ["sleep", "3600"]volumeMounts:- name: secret-volume # 跟卷的名稱一致mountPath: "/etc/secrets" # 掛載路徑readOnly: true # 必須設為只讀
- ??進入容器查看掛載路徑
kubectl exec -it secret-volume-pod -- /bin/sh
?數據已幫我們解密。