k8s管理機密信息


 
 

一、啟動應用安全信息的保護:

 

Secret介紹:

應用啟動過程中可能需要一些 敏感信息,比如訪問數據庫的用戶名密碼或者秘鑰。將這些信息直接保存在容器鏡像中顯然不妥,Kubernetes 提供的解決方案是 Secret。
 
Secret 會以密文的方式存儲數據,避免了直接在配置文件中保存敏感信息。Secret 會 以 Volume 的形式被 mount 到 Pod,容器可通過 文件的方式使用 Secret 中的敏感數據;此外,容器也可以 環境變量的方式使用這些數據。
 
Secret 可通過命令行或 YAML 創建。比如希望 Secret 中包含如下信息:
  1. 用戶名  admin
  2. 密碼  123456

 

創建 Secret

四種方法創建 Secret:
 

1. 通過 --from-literal

kubectl create secret generic mysecret --from-literal=username=admin --from-literal=password=123
kubectl get secret
[root@cicd ~]# kubectl get secret
NAME                  TYPE                                  DATA      AGE
default-token-g44kp   kubernetes.io/service-account-token   3         3d
mysecret Opaque                             2         9s
每個  --from-literal 對應一個信息條目。
 

 

2. 通過 --from-file

echo -n admin > ./username
echo -n 123 > ./password
kubectl create secret generic yoursecret --from-file=./username --from-file=./password
每個文件內容對應一個信息條目。
[root@cicd yml]# cat username 
admin[root@cicd yml]# cat password 
123[root@cicd yml]# 
 

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 對應一個信息條目。

 

4. 通過 YAML 配置文件:

 
文件中的敏感數據必須是 通過 base64 編碼后的結果。
echo -n admin | base64

 YWRtaW4=

echo -n 123 | base64

YWJj
 然后編寫以下文件,添加關鍵參數。

[root@cicd yml]# cat secret.yml apiVersion: v1 kind: Secret metadata: name: yoursecret data: username: YWRtaW4
= password: YWJj

 data的數據以key:value的形式寫入。

 

執行  kubectl apply 創建 Secret
 

 

 

然后通過 base64 將 Value 反編碼:
[root@cicd yml]# echo -n YWRtaW4=|  base64 --decode      #-n 不換行
admin[root@cicd yml]# echo -n YWJj |  base64 --decode
abc[root@cicd yml]# 

 

 

二、secret在pod中的應用:

 

volume 方式使用 Secret

Pod 可以 通過 Volume 或者環境變量的方式使用 Secret,先學習 Volume 方式。
(1)Pod 的配置文件如下所示:
  cat pod2.yml
 

 

 
① 定義 volume foo,來源為 yoursecret
② 將 foo mount 到容器路徑 /etc/foo,可指定讀寫權限為 readOnly
 3.定義pod名稱
 4. 掛載的目錄名與宿主機映射的目錄同名。
 

 

創建 Pod 並在容器中讀取 Secret:

[root@cicd yml]# kubectl get pod
NAME       READY     STATUS              RESTARTS   AGE
mypod-c3   1/1       Running             3          2h
mypod-c4   1/1       Running             2          1h
mypod3 0/1 ContainerCreating   0          42s

可以看到mypod3正在創建,這一狀態的原因有2;

一是因為延遲,等會就行

二是因為報錯,執行

[root@cicd yml]# kubectl describe pod mypod3
進入mypod3查看詳細狀態信息,如果報錯根據報錯做出反應。

 

創建完后,我們進入mypod3驗證:

[root@cicd yml]# kubectl exec -it mypod3 sh

 

可以看到,Kubernetes 會 在指定的路徑 /etc/foo 下為每條敏感數據創建一個文件文件名就是數據條目的 Key,這里是 /etc/foo/username 和 /etc/foo/password, Value 則以明文存放在文件中。
 
 
 
(2)我們也可以 自定義存放數據的文件名,比如將配置文件改為:

 

這時數據將分別存放在 /etc/foo/my-group/my-username 和 /etc/foo/my-group/my-password 中。
 執行創建mypod4:
[root@cicd yml]# kubectl exec -it mypod4 sh
error: unable to upgrade connection: container not found ("mypod")
如果報此錯,則是因為創建的pod不成功,即error或者正在創建中。
 
創建完畢后,我們進入mypod4的/etc/foo路徑查看。

 

 

Volume 方式使用的 Secret 支持動態更新:Secret 更新后,容器中的數據也會更新。
 
將 password 更新為 mdzz,base64 編碼為 YWJjZGVm
[root@cicd yml]# echo -n mdzz | base64
bWR6eg==
 
更新 Secret。

重新執行secret.yml文件

 

幾秒鍾后出現此報錯:
cat: can't open 'my-password': No such file or directory
sh: getcwd: No such file or directory

這是因為改變的密碼正在生效,重新進入/etc/foo發現新的 password 已經同步好了。
 
/etc/foo/..2019_06_24_09_42_04.419998613/my-group # cat my-password 
mdzz/etc/foo/..2019_06_24_09_42_04.419998613/my-group # 
 

 

環境變量方式使用 Secret

通過 Volume 使用 Secret,容器必須從文件讀取數據,會稍顯麻煩, Kubernetes 還支持通過環境變量使用 Secret。
 
Pod 配置文件示例如下:

注意上圖里的key:username和key:password是對應secret.yml文件里的

所以一定要注意書寫,不然是無法通過環境變量方式使用secret的。

然后創建 Pod。
[root@cicd yml]# kubectl apply -f pod4.yml
pod "mypod5" created

通過環境變量 SECRET_USERNAME 和 SECRET_PASSWORD 成功讀取到 Secret 的數據。
[root@cicd yml]# kubectl get pod
NAME      READY     STATUS    RESTARTS   AGE
mypod5    1/1       Running   0          56s
[root@cicd yml]# kubectl exec -it mypod5 sh / # echo $SECRET_USERNAME
admin / # echo $SECRET_PASSWORD
mdzz

 

需要注意的是, 環境變量讀取 Secret 很方便,但無法支撐 Secret 動態更新
Secret 可以為 Pod 提供密碼、Token、私鑰等敏感數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM