在前一篇 Day 16: ConfigMap 中,我們學到如何用 ConfigMap 來管理應用程式的設定檔。不過,如果今天要存放的不是一般設定,而是 密碼、API Key、TLS 憑證 這類敏感資訊,ConfigMap 就不太合適了。
這時候,就需要 Secret 上場了!
在真實世界中,應用程式往往需要連接資料庫、第三方服務或 API,而這些連線必須使用帳號密碼或金鑰。如果這些資訊:
Secret 的設計目的,就是要安全地管理敏感資訊。
1. 用途
- 管理敏感資料,例如:資料庫帳號密碼、OAuth Token、SSH Key、TLS 憑證等。
2. 與 ConfigMap 的差異
- ConfigMap:存放一般設定(不敏感)。
- Secret:存放敏感資訊,資料會用 Base64 編碼。
3. 存放形式
- Secret 會儲存在 Kubernetes 的 etcd 中。
- 可透過環境變數或 Volume 掛載方式,注入到 Pod 中。
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=123456
apiVersion: v1
kind: Secret
metadata:
name: db-secret
type: Opaque
data:
username: YWRtaW4=
password: MTIzNDU2
注意:data 欄位的值需要是 Base64 編碼。
apiVersion: v1
kind: Pod
metadata:
name: secret-env-demo
spec:
containers:
- name: app
image: nginx
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-demo
spec:
containers:
- name: app
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secret"
volumes:
- name: secret-volume
secret:
secretName: db-secret
kubectl create secret generic mysql-secret \
--from-literal=username=root \
--from-literal=password=MyStrongPassword
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-app
spec:
replicas: 1
selector:
matchLabels:
app: mysql-app
template:
metadata:
labels:
app: mysql-app
spec:
containers:
- name: mysql
image: mysql:8.0
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-secret
key: password
- name: MYSQL_USER
valueFrom:
secretKeyRef:
name: mysql-secret
key: username
kubectl exec -it <pod-name> -- printenv | grep MYSQL
可以看到 MYSQL_ROOT_PASSWORD
和 MYSQL_USER
已經成功注入。
在下一篇 Day 18: Volume 基礎:EmptyDir、HostPath 中,會更深入探討 Volume,而 Secret 也能以 Volume 的形式掛載到容器中,讓你更靈活地管理應用程式所需的敏感資料。