1、啓動應用安全信息的保護:
Secret介紹:
應用啓動過程當中可能須要一些
敏感信息,好比訪問數據庫的用戶名密碼或者祕鑰。將這些信息直接保存在容器鏡像中顯然不妥,Kubernetes 提供的解決方案是 Secret。
Secret 會以密文的方式存儲數據,避免了直接在配置文件中保存敏感信息。Secret 會
以 Volume 的形式被 mount 到 Pod,容器可經過
文件的方式使用 Secret 中的敏感數據;此外,容器也能夠
環境變量的方式使用這些數據。
Secret 可經過命令行或 YAML 建立。好比但願 Secret 中包含以下信息:
-
用戶名
admin
-
密碼
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]#
2、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;api
一是由於延遲,等會就行安全
二是由於報錯,執行app
[root@cicd yml]# kubectl describe pod mypod3
進入mypod3查看詳細狀態信息,若是報錯根據報錯作出反應。post
建立完後,咱們進入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或者正在建立中。
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文件spa
幾秒鐘後出現此報錯:
cat: can't open 'my-password': No such file or directory
sh: getcwd: 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的。3d
而後建立 Pod。
[root@cicd yml]# kubectl apply -f pod4.yml
pod "mypod5" created
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、私鑰等敏感數據;