Kubernetes配置管理-Secret
定義:
- Secret 是 Kubernetes 中用於儲存敏感資料(如密碼、令牌、金鑰)物件。
- 對敏感資訊進行了額外的保護,防止未經授權的存取。
功能:
- 安全儲存: 以加密方式在 etcd 中儲存資料(需要啟用 etcd 加密)。
- 權限控制: 透過 Kubernetes 的 RBAC(基於角色的存取控制)限制對 Secret 的存取。
創建secret 分為以下幾種
- 直接透過 指令進行創建
- 透過 envfile 結合指令創建
- 透過 yaml 進行創建
範例檔案
透過 指令進行創建
kubectl create secret generic my-secret --from-literal=mysql.host=127.0.0.1 --from-literal=mysql.port=3306 --from-literal=mysql.pass=123456
# --from-literal 直接從指令中創建key值
透過 envfile 結合指令創建
kubectl create secret generic my-secret --from-file=envfile
透過 yaml 進行創建
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
stringData:
mysql.host: "127.0.0.1"
mysql.port: "3306"
mysql.pass: "123456"
使用方式
- 注入環境變量
- 掛載
注入環境變量
# 注入特定key
env:
- name: mysql.host # 請注意 這邊是掛載進容器環境變量的名稱
valueFrom:
secretKeyRef:
name: my-secret # 輸入創建的secret名稱
key: mysql.host # 選擇要注入的key
# 注入全部key到環境變量
envFrom:
- secretRef:
name: my-secret
注意 已掛載在 「環境變量的secret
」 的Pod 「不會」自動更新,而可以通過以下幾個方法更新
- 手動重啟pod : 透過刪除Pod K8s會自動重新部署,並掛載最新的Secret
kubectl delete pod {podName}
- 滾動更新deploy: 如果Pod是透過Deploy 部署的話可以觸發滾動更新,會重新創建最新的Pod並掛載新的Secret。
kubectl rollout restart deploy {deployName}
掛載到特定目錄
# 注意 K8s 不提供Secret 將全部key 掛載到容器內
# 只能將key 拆開 若要掛載檔案 還是只能使用 configMap 會比較清晰好一點
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 1
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx:latest
volumeMounts:
- name: secret-volume
mountPath: "/data/htdocs/example/envfile"
volumes:
- name: secret-volume
secret:
secretName: my-secret
文末提供測試的yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 1
selector:
matchLabels:
app: nginx-demo
template:
metadata:
labels:
app: nginx-demo
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "200m"
memory: "256Mi"
# 將特定key 注入到容器內
# env:
# - name: mysql.host
# valueFrom:
# secretRef:
# name: my-secret
# 將所有key 注入到容器內
# envFrom:
# - secretRef:
# name: my-secret
# 掛載方式, 但注意 k8s針對secret 是不支持將全部掛載成一個檔案
# volumeMounts:
# - name: secret-volume
# mountPath: "/data/htdocs/example/envfile"
# volumes:
# - name: secret-volume
# secret:
# secretName: my-secret