應用啟動過程中可能需要一些敏感信息,比如訪問數據庫的用戶名密碼或者秘鑰。將這些信息直接保存在容器鏡像中顯然不妥,Kubernetes 提供的解決方案是 Secret。
Secret 會以密文的方式存儲數據,避免了直接在配置文件中保存敏感信息。Secret 會以 Volume 的形式被 mount 到 Pod,容器可通過文件的方式使用 Secret 中的敏感數據;此外,容器也可以環境變量的方式使用這些數據。
Secret 可通過命令行或 YAML 創建。比如希望 Secret 中包含如下信息:
-
用戶名
admin
-
密碼
123456
1.創建 Secret方式
有四種方法創建 Secret:
1.1 通過 --from-literal
:
kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123456
每個 --from-literal
對應一個信息條目。
1.2 通過 --from-file
:
echo -n admin > ./username echo -n 123456 > ./password kubectl create secret generic mysecret --from-file=./username --from-file=./password
每個文件內容對應一個信息條目。
1.3通過 --from-env-file
:
cat << EOF > env.txt username=admin password=123456 EOF kubectl create secret generic mysecret --from-env-file=env.txt
文件 env.txt
中每行 Key=Value 對應一個信息條目。
1.4通過 YAML 配置文件:
文件中的敏感數據必須是通過 base64 編碼后的結果。
執行 kubectl apply
創建 Secret:
2.查看secret
2.1通過 kubectl get secret
查看存在的 secret
顯示有兩個數據條目
2.2通過kubectl describe secret
查看條目的 Key
2.3通過kubectl edit secret mysecret 查看vlaue
2.4通過base64將value反解碼
3.vloume方式secret的使用
Pod 可以通過 Volume 或者環境變量的方式使用 Secret,先學習 Volume 方式。
Pod 的配置文件如下所示:
① 定義 volume foo
,來源為 secret mysecret
。
② 將 foo
mount 到容器路徑 /etc/foo
,可指定讀寫權限為 readOnly
。
創建 Pod 並在容器中讀取 Secret:
可以看到,Kubernetes 會在指定的路徑 /etc/foo
下為每條敏感數據創建一個文件,文件名就是數據條目的 Key,這里是 /etc/foo/username
和 /etc/foo/password
,Value 則以明文存放在文件中。
我們也可以自定義存放數據的文件名,比如將配置文件改為:
這時數據將分別存放在 /etc/foo/my-group/my-username
和 /etc/foo/my-group/my-password
中。
以 Volume 方式使用的 Secret 支持動態更新:Secret 更新后,容器中的數據也會更新。
將 password 更新為 abcdef
,base64 編碼為 YWJjZGVm
4.環境變量中使用secret
通過 Volume 使用 Secret,容器必須從文件讀取數據,會稍顯麻煩,Kubernetes 還支持通過環境變量使用 Secre
創建 Pod 並讀取 Secret。
通過環境變量 SECRET_USERNAME
和 SECRET_PASSWORD
成功讀取到 Secret 的數據。
需要注意的是,環境變量讀取 Secret 很方便,但無法支撐 Secret 動態更新。
Secret 可以為 Pod 提供密碼、Token、私鑰等敏感數據;對於一些非敏感數據,比如應用的配置信息,則可以用 ConfigMap