使用 kubectl 管理密鑰
本頁說明如何使用 kubectl
命令列工具建立、編輯、管理與刪除 Kubernetes 密鑰。
準備開始
您需要有一個 Kubernetes 叢集,且 kubectl 命令列工具必須設定為與您的叢集通訊。建議在至少有兩個節點且未充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個叢集,或者您可以使用下列 Kubernetes playground 之一
建立密鑰
Secret
物件會儲存敏感資料,例如 Pod 用來存取服務的憑證。例如,您可能需要 Secret 來儲存存取資料庫所需的的使用者名稱和密碼。
您可以透過在指令中傳遞原始資料,或將憑證儲存在您在指令中傳遞的檔案中,來建立 Secret。以下指令會建立一個 Secret,其中儲存使用者名稱 admin
和密碼 S!B\*d$zDsb=
。
使用原始資料
執行以下指令
kubectl create secret generic db-user-pass \
--from-literal=username=admin \
--from-literal=password='S!B\*d$zDsb='
您必須使用單引號 ''
來跳脫字串中的特殊字元,例如 $
、\
、*
、=
和 !
。如果您不這樣做,您的 shell 會解譯這些字元。
注意
Secret 的stringData
欄位不適用於伺服器端套用。使用來源檔案
將憑證儲存在檔案中
echo -n 'admin' > ./username.txt echo -n 'S!B\*d$zDsb=' > ./password.txt
-n
旗標可確保產生的檔案在文字結尾處沒有多餘的換行字元。這很重要,因為當kubectl
讀取檔案並將內容編碼為 base64 字串時,額外的換行字元也會被編碼。您不需要跳脫檔案中字串的特殊字元。在
kubectl
指令中傳遞檔案路徑kubectl create secret generic db-user-pass \ --from-file=./username.txt \ --from-file=./password.txt
預設的鍵名稱是檔案名稱。您可以選擇性地使用
--from-file=[key=]source
設定鍵名稱。例如kubectl create secret generic db-user-pass \ --from-file=username=./username.txt \ --from-file=password=./password.txt
使用任一種方法,輸出結果都類似於
secret/db-user-pass created
驗證 Secret
檢查 Secret 是否已建立
kubectl get secrets
輸出結果類似於
NAME TYPE DATA AGE
db-user-pass Opaque 2 51s
檢視 Secret 的詳細資訊
kubectl describe secret db-user-pass
輸出結果類似於
Name: db-user-pass
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password: 12 bytes
username: 5 bytes
kubectl get
和 kubectl describe
指令預設會避免顯示 Secret
的內容。這是為了保護 Secret
免於意外洩露,或儲存在終端機記錄中。
解碼 Secret
檢視您建立的 Secret 內容
kubectl get secret db-user-pass -o jsonpath='{.data}'
輸出結果類似於
{ "password": "UyFCXCpkJHpEc2I9", "username": "YWRtaW4=" }
解碼
password
資料echo 'UyFCXCpkJHpEc2I9' | base64 --decode
輸出結果類似於
S!B\*d$zDsb=
注意
這是一個用於文件目的的範例。實際上,此方法可能會導致包含編碼資料的指令儲存在您的 shell 歷史記錄中。任何有權存取您電腦的人都可能找到該指令並解碼密碼。更好的方法是結合檢視和解碼指令。kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
編輯 Secret
您可以編輯現有的 Secret
物件,除非它是不可變的。若要編輯 Secret,請執行以下指令
kubectl edit secrets <secret-name>
這會開啟您的預設編輯器,並讓您更新 data
欄位中 base64 編碼的 Secret 值,如下列範例所示
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file, it will be
# reopened with the relevant failures.
#
apiVersion: v1
data:
password: UyFCXCpkJHpEc2I9
username: YWRtaW4=
kind: Secret
metadata:
creationTimestamp: "2022-06-28T17:44:13Z"
name: db-user-pass
namespace: default
resourceVersion: "12708504"
uid: 91becd59-78fa-4c85-823f-6d44436242ac
type: Opaque
清除
若要刪除 Secret,請執行以下指令
kubectl delete secret db-user-pass
下一步
- 閱讀更多關於 Secret 概念的資訊
- 瞭解如何使用組態檔管理 Secret
- 瞭解如何使用 kustomize 管理 Secret