Secret

本頁面說明 Kubernetes 的 Secret (密鑰) 物件及其在 Google Kubernetes Engine 中的用途。

什麼是 Secret?

Secret 是一種安全性物件,能在您的叢集裡儲存機密資料,例如密碼、OAuth 憑證和安全殼層金鑰等。將機密資料儲存在 Secret 裡,比儲存在明文 ConfigMaps 或以 Pod 規格儲存更為安全。使用 Secret 可讓您控管機密資料的使用方式,並降低未授權使用者看到資料的風險。

您也可以使用您在 Cloud KMS 中管理的金鑰,在應用程式層加密 Secret 物件。詳情請參閱應用程式層 Secret 加密

建立 Secret 物件

請使用下列指令建立 Secret:

kubectl create secret [TYPE] [NAME] [DATA]

[TYPE] 可以是下列其中一項:

  • generic:從本機檔案、目錄或常值建立 Secret。
  • docker-registry:建立搭配 Docker 登錄檔使用的 dockercfg Secret,用於驗證 Docker 登錄檔。
  • tls:從特定的公開/私密金鑰組建立傳輸層安全標準 (TLS) 密鑰。該公開/私密金鑰組必須事先存在。公用金鑰憑證必須是 .PEM 編碼並與指定的私密金鑰相符。

大多數的 Secret 都使用 generic 類型。

[DATA] 可以是下列其中一項:

  • 一或多個設定檔所在目錄的路徑,以 --from-file--from-env-file 標記表示
  • 鍵/值組合,使用 --from-literal 標記指定每個組合

如要進一步瞭解 kubectl create,請參閱參考說明文件

或者,您也可以在 YAML 資訊清單檔案中定義 Secret 物件,並使用 kubectl create -f [FILE] 來部署該物件,藉此建立 Secret。如需範例,請參閱使用 Secret 安全地發佈憑證

依據檔案

如要從一或多個檔案建立 Secret,請使用 --from-file--from-env-file。該檔案必須是明文,但檔案的附檔名則不重要。

--from-file

如果您使用 --from-file 建立 Secret,則整份檔案的內容就是 Secret 的值。如果 Secret 的值包含多個鍵/值組合,請改用 --from-env-file

您可以傳入一或多個檔案:

kubectl create secret [TYPE] [NAME] --from-file [/PATH/TO/FILE] --from-file [/PATH/TO/FILE2]

您也可以傳入含有多個檔案的目錄:

kubectl create secret [TYPE] [NAME] --from-file [/PATH/TO/DIRECTORY]

舉例來說,下列指令會從 username.txtpassword.txt 這兩個檔案建立名稱為 credentials 的 Secret,並將金鑰分別設為 和 password.txt

kubectl create secret generic credentials --from-file ./username.txt --from-file ./password.txt

Secret 值在 Kubernetes 中為 Base 64 編碼。

執行 kubectl get secret credentials -o yaml 後會傳回下列輸出內容。

apiVersion: v1
data:
  password.txt: MTIzNAo=
  username.txt: YWRtaW4K
kind: Secret
metadata:
  creationTimestamp: ...
  name: credentials
  namespace: default
  resourceVersion: "2011810"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: ...
type: Opaque

預設情況下,金鑰為檔案名稱。您可以使用 --from-file 的延伸語法來覆寫金鑰:

kubectl create secret [TYPE] [NAME] --from-file=KEY=[/PATH/TO/DIRECTORY]

以下範例與前一個範例相同,但其金鑰則設為 usernamepassword,而非使用檔案名稱。

kubectl create secret generic credentials --from-file=username=./username.txt --from-file=password=./password.txt

--from-env-file

如要將多個鍵/值組合載入到單一 Secret 物件,請將鍵/值組合儲存在一個或多個明文檔案中,並使用 --from-env-file 載入 (不要使用 --from-file)。您可以透過多次指定標記來載入多個檔案。適用與 --from-file 同樣的限制

舉例來說,下列指令會使用內含多個鍵/值組合的單一檔案 credentials.txt,建立名稱為 credentials 的 Secret。

# Each of these key-value pairs is loaded into the Secret
username=jane
password=d7xnNss7EGCFZusG

在 Kubernetes 中的 Secret 值為 base64 編碼。

kubectl create secret generic credentials --from-env-file ./credentials.txt

執行 kubectl get secret credentials -o yaml 後會傳回下列輸出內容。

apiVersion: v1
data:
  password: ZDd4bk5zczdFR0NGWnVzRw==
  username: amFuZQ==
kind: Secret
metadata:
  creationTimestamp: 2019-06-04T15:39:27Z
  name: credentials
  namespace: default
  resourceVersion: "14507319"
  selfLink: /api/v1/namespaces/default/secrets/credentials
  uid: efce376b-86de-11e9-9742-42010a80022f
type: Opaque

限制

kubectl 會忽略符號連結、裝置和管道等非標準檔案, 也會忽略子目錄;kubectl create secret 不會遞迴到子目錄。

依據常值

如要從常值建立 Secret,請使用 --from-literal

舉例來說,下列指令會用兩個鍵/值組合建立名稱為 literal-token 的一般 Secret:

kubectl create secret generic literal-token --from-literal user=admin --from-literal password=1234

您要為每個鍵/值組合指定 --from-literal。這些值是自動 base64 編碼。

執行 kubectl get secret literal-token -o yaml 後會傳回下列輸出內容:

apiVersion: v1
data:
  password: MTIzNA==
  user: YWRtaW4=
kind: Secret
metadata:
  creationTimestamp: ...
  name: literal-token
  namespace: default
  resourceVersion: "2012831"
  selfLink: /api/v1/namespaces/default/secrets/literal-token
  uid: ...
type: Opaque

在上述的輸出結果中,您會發現 passworduser 是 base64 編碼。base64 編碼可讓無法處理某些字元的應用程式和服務處理資訊。base64 編碼不提供安全防護。

使用密鑰

如要在您的工作負載使用 Secret,您可以指定參照 Secret 值的環境變數,或掛接含有 Secret 的磁碟區。

如要瞭解如何使用 Secret,請參閱使用 Secret 物件

後續步驟