前言
Secret 是一種包含少量敏感信息例如密碼、令牌或密鑰的對象。 這樣的信息可能會被放在 Pod 規(guī)約中或者鏡像中。 用戶可以創(chuàng)建 Secret,同時系統(tǒng)也創(chuàng)建了一些 Secret。
一、使用 kubectl 管理 Secret
1.1、創(chuàng)建 Secret
一個 Secret 可以包含 Pod 訪問數(shù)據(jù)庫所需的用戶憑證。 例如,由用戶名和密碼組成的數(shù)據(jù)庫連接字符串。 你可以在本地計算機上,將用戶名存儲在文件 ./username.txt
中,將密碼存儲在文件 ./password.txt
中。
echo -n 'admin' > ./username.txt
echo -n '1f2d1e2e67df' > ./password.txt
在這些命令中,-n
標志確保生成的文件在文本末尾不包含額外的換行符。 這一點很重要,因為當 kubectl 讀取文件并將內容編碼為 base64 字符串時,多余的換行符也會被編碼。
kubectl create secret
命令將這些文件打包成一個 Secret 并在 API 服務器上創(chuàng)建對象。
$ kubectl create secret generic db-user-pass \
--from-file=./username.txt \
--from-file=./password.txt
輸出類似于:
secret/db-user-pass created
默認密鑰名稱是文件名。 可以使用 --from-file=[key=]source
來設置密鑰名稱。
例如:
$ kubectl create secret generic db-user-pass \
--from-file=username=./username.txt \
--from-file=password=./password.txt
不需要對文件中包含的密碼字符串中的特殊字符進行轉義。
還可以使用 --from-literal=<key>=<value
> 標簽提供 Secret 數(shù)據(jù)。 可以多次使用此標簽,提供多個鍵值對。
需要注意,特殊字符(例如:$,\,*,= 和 !)由你的 shell 解釋執(zhí)行,而且需要轉義。
在大多數(shù) shell 中,轉義密碼最簡便的方法是用單引號括起來。 比如,如果你的密碼是 S!B\*d$zDsb=
, 可以像下面一樣執(zhí)行命令:
$ kubectl create secret generic db-user-pass \
--from-literal=username=devuser \
--from-literal=password='S!B\*d$zDsb='
1.2、驗證 Secret
檢查 secret 是否已創(chuàng)建:
$ kubectl get secrets
輸出類似于:
NAME TYPE DATA AGE
db-user-pass Opaque 2 51s
你可以查看 Secret 的描述:
$ kubectl describe secrets/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 被意外暴露或存儲在終端日志中。
1.3、解碼 Secret
要查看創(chuàng)建的 Secret 的內容,運行以下命令:
$ kubectl get secret db-user-pass -o jsonpath='{.data}'
這里會輸出你的賬號和密碼,我就不貼了。
現(xiàn)在你可以解碼 password 的數(shù)據(jù):
# 這是一個用于文檔說明的示例。
# 如果你這樣做,數(shù)據(jù) 'MWYyZDFlMmU2N2Rm' 可以存儲在你的 shell 歷史中。
# 可以進入你電腦的人可以找到那個記住的命令并可以在你不知情的情況下 base-64 解碼這個 Secret。
# 通常最好將這些步驟結合起來,如頁面后面所示。
echo 'MWYyZDFlMmU2N2Rm' | base64 --decode
輸出類似于:
1f2d1e2e67df
為了避免在 shell 歷史記錄中存儲 Secret 的編碼值,可以執(zhí)行如下命令:
$ kubectl get secret db-user-pass -o jsonpath='{.data.password}' | base64 --decode
輸出應與上述類似。
1.4、清理
刪除創(chuàng)建的 Secret:
$ kubectl delete secret db-user-pass
二、使用配置文件管理 Secret
2.1、創(chuàng)建 Secret
你可以先用 JSON 或 YAML 格式在一個清單文件中定義 Secret 對象,然后創(chuàng)建該對象。 Secret 資源包含 2 個鍵值對:data 和 stringData。 data 字段用來存儲 base64 編碼的任意數(shù)據(jù)。 提供 stringData 字段是為了方便,它允許 Secret 使用未編碼的字符串。 data 和 stringData 的鍵必須由字母、數(shù)字、-、_ 或 . 組成。
我來使用 data 字段在 Secret 中存儲兩個字符串:
- 將這些字符串轉換為 base64:
echo -n 'admin' | base64
echo -n '1f2d1e2e67df' | base64
輸出類似于:
YWRtaW4=
MWYyZDFlMmU2N2Rm
- 創(chuàng)建清單:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
Secret 對象的名稱必須是有效的 DNS 子域名。
- 使用
kubectl apply
創(chuàng)建 Secret:
$ kubectl apply -f ./secret.yaml
輸出類似于:
secret/mysecret created
2.2、創(chuàng)建 Secret 時提供未編碼的數(shù)據(jù)
對于某些場景,你可能希望使用 stringData 字段。 這個字段可以將一個非 base64 編碼的字符串直接放入 Secret 中, 當創(chuàng)建或更新該 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 數(shù)據(jù)時,此命令將返回編碼的值,并不是你在 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:
2.3、同時指定 data 和 stringData
如果在 data 和 stringData 中設置了同一個字段,則使用來自 stringData 中的值。
可以定義以下 Secret:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
stringData:
username: administrator
所創(chuàng)建的 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。
2.4、清理
刪除你創(chuàng)建的 Secret:文章來源:http://www.zghlxwxcb.cn/news/detail-783119.html
$ kubectl delete secret mysecret
三、使用 Kustomize 管理 Secret
從 kubernetes v1.14 開始,kubectl 支持使用 Kustomize 管理對象。 Kustomize 提供了資源生成器(Generators)來創(chuàng)建 Secret 和 ConfigMap。 Kustomize 生成器應該在某個目錄的 kustomization.yaml 文件中指定。 生成 Secret 后,你可以使用 kubectl apply 在 API 服務器上創(chuàng)建該 Secret。
3.1、創(chuàng)建 Kustomization 文件
你可以在 kustomization.yaml
中定義 secreteGenerator 字段,并在定義中引用其它本地文件生成 Secret。 例如:下面的 kustomization 文件 引用了 ./username.txt
和 ./password.txt
文件:
secretGenerator:
- name: db-user-pass
files:
- username.txt
- password.txt
你也可以在 kustomization.yaml
文件中指定一些字面量定義 secretGenerator 字段。 例如:下面的 kustomization.yaml
文件中包含了 username 和 password 兩個字面量:
secretGenerator:
- name: db-user-pass
literals:
- username=admin
- password=1f2d1e2e67df
你也可以使用 .env 文件在 kustomization.yaml 中定義 secretGenerator。 例如:下面的 kustomization.yaml 文件從 .env.secret 文件獲取數(shù)據(jù)。
secretGenerator:
- name: db-user-pass
envs:
- .env.secret
注意,上面兩種情況,你都不需要使用 base64 編碼。
3.2、創(chuàng)建 Secret
在包含 kustomization.yaml 文件的目錄下使用 kubectl apply
命令創(chuàng)建 Secret。
$ kubectl apply -k .
輸出類似于:
secret/db-user-pass-96mffmfh4k created
請注意,生成 Secret 時,Secret 的名稱最終是由 name 字段和數(shù)據(jù)的哈希值拼接而成。 這將保證每次修改數(shù)據(jù)時生成一個新的 Secret。
3.3、檢查創(chuàng)建的 Secret
你可以檢查剛才創(chuàng)建的 Secret:
$ kubectl get secrets
輸出類似于:
NAME TYPE DATA AGE
db-user-pass-96mffmfh4k Opaque 2 51s
你可以看到 Secret 的描述:
$ kubectl describe secrets/db-user-pass-96mffmfh4k
輸出類似于:
Name: db-user-pass-96mffmfh4k
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
password.txt: 12 bytes
username.txt: 5 bytes
kubectl get
和 kubectl describe
命令默認不顯示 Secret 的內容。 這是為了防止 Secret 被意外暴露給旁觀者或存儲在終端日志中。
3.5、清理
刪除你創(chuàng)建的 Secret:
$ kubectl delete secret db-user-pass-96mffmfh4k
總結
通過 API 創(chuàng)建的 Pod 時,不會檢查應用的 secret 是否存在。一旦 Pod 被調度,kubelet 就會嘗試獲取該 secret 的值。如果獲取不到該 secret,或者暫時無法與 API server 建立連接,kubelet 將會定期重試。Kubelet 將會報告關于 pod 的事件,并解釋它無法啟動的原因。一旦獲取的 secret,kubelet將創(chuàng)建并裝載一個包含它的卷。在安裝所有pod的卷之前,都不會啟動 pod 的容器。文章來源地址http://www.zghlxwxcb.cn/news/detail-783119.html
到了這里,關于【云原生 | Kubernetes 系列】K8s 實戰(zhàn) 管理 Secret 詳解的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!