使用配置檔案管理 Secret
準備工作
你必須擁有一個 Kubernetes 叢集,並且 kubectl 命令列工具必須配置為與你的叢集通訊。建議在至少有兩個不作為控制平面主機的節點組成的叢集上執行本教程。如果你還沒有叢集,你可以使用 minikube 建立一個,或者你可以使用這些 Kubernetes 試驗場之一。
建立 Secret
你可以先以 JSON 或 YAML 格式在清單中定義 Secret
物件,然後建立該物件。 Secret 資源包含兩個對映:data
和 stringData
。 data
欄位用於儲存使用 base64 編碼的任意資料。stringData
欄位是為了方便起見而提供的,它允許你提供未編碼的字串形式的相同資料。 data
和 stringData
的鍵必須由字母數字字元、-
、_
或 .
組成。
以下示例使用 data
欄位在 Secret 中儲存兩個字串。
將字串轉換為 base64
echo -n 'admin' | base64 echo -n '1f2d1e2e67df' | base64
注意
Secret 資料的序列化 JSON 和 YAML 值編碼為 base64 字串。這些字串中不允許有換行符,必須省略。在 Darwin/macOS 上使用base64
工具時,使用者應避免使用-b
選項來拆分長行。相反,如果-w
選項不可用,Linux 使用者**應**在base64
命令中新增-w 0
選項或使用管道base64 | tr -d '\n'
。輸出類似於:
YWRtaW4= MWYyZDFlMmU2N2Rm
建立清單
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: MWYyZDFlMmU2N2Rm
請注意,Secret 物件的名稱必須是有效的 DNS 子域名。
使用
kubectl apply
建立 Secretkubectl apply -f ./secret.yaml
輸出類似於:
secret/mysecret created
要驗證 Secret 是否已建立並解碼 Secret 資料,請參閱使用 kubectl 管理 Secret。
建立 Secret 時指定未編碼的資料
在某些場景下,你可能希望使用 stringData
欄位。該欄位允許你將非 base64 編碼的字串直接放入 Secret 中,當 Secret 建立或更新時,該字串將為你編碼。
一個實際的例子是,當你部署一個使用 Secret 儲存配置檔案的應用程式時,你希望在部署過程中填充該配置檔案的一部分。
例如,如果你的應用程式使用以下配置檔案:
apiUrl: "https://my.api.com/api/v1"
username: "<user>"
password: "<password>"
你可以使用以下定義將其儲存在 Secret 中:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
stringData:
config.yaml: |
apiUrl: "https://my.api.com/api/v1"
username: <user>
password: <password>
注意
Secret 的 `stringData` 欄位與伺服器端應用不相容。當你檢索 Secret 資料時,該命令返回編碼後的值,而不是你在 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
中的值。
例如,如果你定義以下 Secret:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
stringData:
username: administrator
注意
Secret 的 `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
。
編輯 Secret
要編輯使用清單建立的 Secret 中的資料,請修改清單中的 data
或 stringData
欄位,然後將檔案應用到叢集。你可以編輯現有的 Secret
物件,除非它不可變。
例如,如果你想將前面示例中的密碼更改為 birdsarentreal
,請執行以下操作:
編碼新密碼字串
echo -n 'birdsarentreal' | base64
輸出類似於:
YmlyZHNhcmVudHJlYWw=
使用新密碼字串更新
data
欄位apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: YWRtaW4= password: YmlyZHNhcmVudHJlYWw=
將清單應用到你的叢集
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