使用組態檔管理密鑰
準備開始
您需要有一個 Kubernetes 叢集,並且必須將 kubectl 命令列工具設定為與您的叢集通訊。建議在至少有兩個節點且節點不充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個叢集,或者您可以使用這些 Kubernetes playground 之一
建立密鑰
您可以先在資訊清單中定義 Secret
物件,以 JSON 或 YAML 格式,然後建立該物件。Secret 資源包含兩個映射:data
和 stringData
。data
欄位用於儲存任意資料,使用 base64 編碼。stringData
欄位為了方便起見而提供,它允許您提供與未編碼字串相同的資料。data
和 stringData
的鍵必須由字母數字字元、-
、_
或 .
組成。
以下範例使用 data
欄位在密鑰中儲存兩個字串。
將字串轉換為 base64
echo -n 'admin' | base64 echo -n '1f2d1e2e67df' | base64
注意
密鑰資料的序列化 JSON 和 YAML 值編碼為 base64 字串。換行符號在這些字串中無效,必須省略。在 Darwin/macOS 上使用base64
公用程式時,使用者應避免使用-b
選項來分割長行。相反地,Linux 使用者應該新增選項-w 0
到base64
命令或管道base64 | tr -d '\n'
,如果-w
選項不可用。輸出類似於
YWRtaW4= MWYyZDFlMmU2N2Rm
建立資訊清單
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
請注意,密鑰物件的名稱必須是有效的 DNS 子網域名稱。
使用
kubectl apply
建立密鑰kubectl apply -f ./secret.yaml
輸出類似於
secret/mysecret created
若要驗證密鑰是否已建立並解碼密鑰資料,請參閱 使用 kubectl 管理密鑰。
建立密鑰時指定未編碼的資料
在某些情況下,您可能希望使用 stringData
欄位。此欄位允許您將非 base64 編碼的字串直接放入密鑰中,並且在建立或更新密鑰時將為您編碼字串。
一個實際的例子可能是您正在部署一個應用程式,該應用程式使用密鑰來儲存組態檔,並且您希望在部署過程中填入該組態檔的部分內容。
例如,如果您的應用程式使用以下組態檔
apiUrl: "https://my.api.com/api/v1"
username: "<user>"
password: "<password>"
您可以使用以下定義將其儲存在密鑰中
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
config.yaml: |
apiUrl: "https://my.api.com/api/v1"
username: <user>
password: <password>
注意
密鑰的stringData
欄位不適用於伺服器端套用。當您檢索密鑰資料時,命令會傳回編碼的值,而不是您在 stringData
中提供的純文字值。
例如,如果您執行以下命令
kubectl get secret mysecret -o yaml
輸出類似於
apiVersion: v1
data:
config.yaml: YXBpVXJsOiAiaHR0cHM6Ly9teS5hcGkuY29tL2FwaS92MSIKdXNlcm5hbWU6IHt7dXNlcm5hbWV9fQpwYXNzd29yZDoge3twYXNzd29yZH19
kind: Secret
metadata:
creationTimestamp: 2018-11-15T20:40:59Z
name: mysecret
namespace: default
resourceVersion: "7225"
uid: c280ad2e-e916-11e8-98f2-025000000001
type: Opaque
同時指定 data
和 stringData
如果您在 data
和 stringData
中都指定了一個欄位,則使用來自 stringData
的值。
例如,如果您定義以下密鑰
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
stringData:
username: administrator
注意
密鑰的stringData
欄位不適用於伺服器端套用。Secret
物件的建立方式如下
apiVersion: v1
data:
username: YWRtaW5pc3RyYXRvcg==
kind: Secret
metadata:
creationTimestamp: 2018-11-15T20:46:46Z
name: mysecret
namespace: default
resourceVersion: "7579"
uid: 91460ecb-e917-11e8-98f2-025000000001
type: Opaque
YWRtaW5pc3RyYXRvcg==
解碼為 administrator
。
編輯密鑰
若要編輯您使用 Manifest 建立的 Secret 中的資料,請修改 Manifest 中的 data
或 stringData
欄位,然後將該檔案套用至您的叢集。您可以編輯現有的 Secret
物件,除非它是不可變的。
例如,如果您想將先前範例中的密碼變更為 birdsarentreal
,請執行下列操作:
編碼新的密碼字串
echo -n 'birdsarentreal' | base64
輸出類似於
YmlyZHNhcmVudHJlYWw=
使用新的密碼字串更新
data
欄位apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: YmlyZHNhcmVudHJlYWw=
將 Manifest 套用至您的叢集
kubectl apply -f ./secret.yaml
輸出類似於
secret/mysecret configured
Kubernetes 會更新現有的 Secret
物件。詳細來說,kubectl
工具會注意到有一個同名的現有 Secret
物件。kubectl
會提取現有的物件、規劃變更,然後將已變更的 Secret
物件提交至您的叢集控制平面。
如果您指定了 kubectl apply --server-side
,則 kubectl
會改用伺服器端套用。
清除
若要刪除您已建立的 Secret
kubectl delete secret mysecret
下一步
- 深入瞭解 Secret 概念
- 瞭解如何使用 kubectl 管理 Secret
- 瞭解如何使用 kustomize 管理 Secret