Kubernetes Secret
k8s-secret
甚麼是secret
在 Kubernetes 裡,Secret 就像是一個保險箱,可以放你任何不想公開的東西。比如說密碼、API 金鑰、憑證等,這樣的資料可能會被放在 Pod 裡,但你可以用 Secret 來避免直接在應用程式的程式碼中暴露這些機密資料。 可以說 Secret 就像是 ConfigMap 的一個好朋友,但更專門用來保護機密資料的地方。
為甚麼需要secret
最主要的用意是保護你的敏感資訊,不讓它們在 Pod 或容器中以明文流傳。這樣可以讓我們的應用程式變得更安全,減少機密資訊外洩的風險。還能讓你的秘密資料在不同 Pod 之間分享,並且保有安全性。
何時使用secret
- 保存必要應用程式的憑證,如 TLS 證書,以確保安全通信。
- 儲存應用程式所需的金鑰,包括外部服務的 API 金鑰,確保安全連接。
- 保管敏感的環境變數,如資料庫密碼等機密驗證資訊,維護應用程式安全性。
- 安全儲存驗證資訊,如 OAuth 令牌,用於與其他應用程式進行安全交互。
- 維持隱私的配置設定,如設定文件、金鑰路徑等,確保敏感資訊不外洩。
secret的類型有哪些
內建類型 | 用途 |
---|---|
Opaque | 使用者定義的任意資料 |
kubernetes.io/service-account-token | 服務帳戶令牌 |
kubernetes.io/dockercfg | ~/.dockercfg 檔案的序列化形式 |
kubernetes.io/dockerconfigjson | ~/.docker/config.json 檔案的序列化形式 |
kubernetes.io/basic-auth | 用於基本身份驗證的憑證 |
kubernetes.io/ssh-auth | 用於 SSH 身份驗證的憑證 |
kubernetes.io/tls | 用於 TLS 客戶端或伺服器端的資料 |
bootstrap.kubernetes.io/token | 啟動引導令牌資料 |
如何撰寫使用secret
建立secret
- 聲明式
apiVersion: v1
kind: Secret
metadata:
name: my-secret
data:
username: YWRtaW4= # Base64 編碼的 "admin"
password: c2VjcmV0cGFzc3dvcmQ= # Base64 編碼的 "secretpassword"
- 宣告式
- 從命令行傳遞資訊建立secret
kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=secretpassword
- 從檔案建立secret
kubectl create secret generic my-secret --from-file=path/to/username.txt --from-file=path/to/password.txt
使用secret
我們可以用剛剛創建的 my-secret
來做以下的範例
- secret作為環境變數
apiVersion: v1
kind: Pod
metadata:
name: secret-env-demo-pod
spec:
containers:
- name: demo-container
image: busybox
command: ["/bin/sh", "-c", "echo Username: $USERNAME && echo Password: $PASSWORD"]
env:
- name: USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
restartPolicy: Never
透過kubectl logs secret-env-demo-pod
查看log
Username: admin
Password: secretpassword
- 將secret掛載到一個或多個容器
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-demo-pod
spec:
containers:
- name: first-container
image: busybox
command: ["/bin/sh", "-c", "cat /etc/secret/username"]
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
- name: second-container
image: busybox
command: ["/bin/sh", "-c", "cat /etc/secret/password"]
volumeMounts:
- name: secret-volume
mountPath: /etc/secret
volumes:
- name: secret-volume
secret:
secretName: my-secret
使用以下命令檢查輸出
kubectl logs secret-volume-demo-pod -c first-container
kubectl logs secret-volume-demo-pod -c second-container
output
## first-container
admin
## second-container
secretpassword
- secret作為拉取private registry image時使用
apiVersion: v1
kind: Pod
metadata:
name: secret-imagepull-demo-pod
spec:
containers:
- name: demo-container
image: <private_registry_image>
imagePullSecrets:
- name: my-secret
secret有哪些特點
- 強大的資料加密:Secret 的一大優點在於它可以對敏感資料進行強大的加密保護。這保障了秘密資訊不會輕易被未授權的人看到,大幅減低了資訊外洩的風險。
- Base64 編碼的轉換:Secret 在儲存資料時會使用 Base64 編碼,但是請注意這並非最高等級的安全標準,它不能取代真正的加密方法。這樣的編碼能夠保護資料,但需要在操作時謹慎以保障資訊安全。
- 簡便的整合:透過 Secret,我們能夠輕鬆地將敏感資料整合到應用程式中,例如透過環境變數、掛載資料夾等方式,讓 Pod 可以無縫地使用這些敏感資料。
- 安全的資訊分享:Secret 也提供了一種安全的方式,讓不同的 Pod 或其他 Kubernetes 資源可以共用敏感資訊,同時保持資料的保密性。這讓不同部分的應用能夠互相協作,同時不會威脅資訊安全。