使用組態檔管理密鑰

使用資源組態檔建立密鑰物件。

準備開始

您需要有一個 Kubernetes 叢集,並且必須將 kubectl 命令列工具設定為與您的叢集通訊。建議在至少有兩個節點且節點不充當控制平面主機的叢集上執行本教學課程。如果您還沒有叢集,可以使用 minikube 建立一個叢集,或者您可以使用這些 Kubernetes playground 之一

建立密鑰

您可以先在資訊清單中定義 Secret 物件,以 JSON 或 YAML 格式,然後建立該物件。Secret 資源包含兩個映射:datastringDatadata 欄位用於儲存任意資料,使用 base64 編碼。stringData 欄位為了方便起見而提供,它允許您提供與未編碼字串相同的資料。datastringData 的鍵必須由字母數字字元、-_. 組成。

以下範例使用 data 欄位在密鑰中儲存兩個字串。

  1. 將字串轉換為 base64

    echo -n 'admin' | base64
    echo -n '1f2d1e2e67df' | base64
    

    輸出類似於

    YWRtaW4=
    MWYyZDFlMmU2N2Rm
    
  2. 建立資訊清單

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: MWYyZDFlMmU2N2Rm
    

    請注意,密鑰物件的名稱必須是有效的 DNS 子網域名稱

  3. 使用 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 中提供的純文字值。

例如,如果您執行以下命令

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

同時指定 datastringData

如果您在 datastringData 中都指定了一個欄位,則使用來自 stringData 的值。

例如,如果您定義以下密鑰

apiVersion: v1
kind: Secret
metadata:
  name: mysecret
type: Opaque
data:
  username: YWRtaW4=
stringData:
  username: administrator

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 中的 datastringData 欄位,然後將該檔案套用至您的叢集。您可以編輯現有的 Secret 物件,除非它是不可變的

例如,如果您想將先前範例中的密碼變更為 birdsarentreal,請執行下列操作:

  1. 編碼新的密碼字串

    echo -n 'birdsarentreal' | base64
    

    輸出類似於

    YmlyZHNhcmVudHJlYWw=
    
  2. 使用新的密碼字串更新 data 欄位

    apiVersion: v1
    kind: Secret
    metadata:
      name: mysecret
    type: Opaque
    data:
      username: YWRtaW4=
      password: YmlyZHNhcmVudHJlYWw=
    
  3. 將 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

下一步

上次修改時間:2023 年 10 月 9 日下午 9:53 PST:Update managing-secret-using-config-file.md (cf83760309)