secret也是k8s中的一個資源對象,主要用於保存輕量的敏感信息,好比數據庫用戶名和密碼,令牌,認證密鑰等。docker
Secret有三種類型:數據庫
Service Account:用來訪問kubernetes API,由k8s自動建立,而且會自動掛載到pod的/run/secrets/kubernetes.io/serviceaccount 目錄中。 Opaque:base64編碼格式的Secret,用來存儲密碼,密鑰等。 kubernetes.io/dockerconfigjson: 用來存儲私有docker registry的認證信息。
secret能夠經過命令行或YAML文件來建立,假設咱們須要存放在secret對象中的信息:json
1, 用戶名:root
2,密碼:123456api
建立Secret有如下四種方法:
1.1 經過--from-literal(以文字的方法建立)安全
[root@master ~]# kubectl create secret generic mysecret --from-literal=username=root --from-literal=password=123456 secret/mysecret created
//查看建立的secret:
//查看該secret的詳細信息:app
特色:每一個--from-literal只能對應一條信息。比較繁瑣。ide
1.2 經過--from-file(以文件的方式建立)測試
[root@master ~]# echo root > username [root@master ~]# echo 123456 > password [root@master ~]# kubectl create secret generic newsecret --from-file=username --from-file=password secret/newsecret created
//查看建立的secret:編碼
[root@master ~]# kubectl get secrets | grep newsecret newsecret Opaque 2 64s
特色:一樣是每一個文件對應一條信息。每一個文件中只能保存一個,爲了保證機密性,導入後有必要將本地的文件刪除掉。加密
1.3 經過--from-env-file(以變量的方式建立)
[root@master ~]# cat > env.txt <<EOF > username=root > password=123456 > EOF
[root@master ~]# kubectl create secret generic env-secret --from-env-file=env.txt secret/env-secret created
特色:能夠在文件裏面保存多條信息,文件env.txt中每條key=value對應一條信息條目。
1.4 經過yaml配置文件:
#文件中的敏感數據必須是經過 base64 編碼後的結果。
[root@master ~]# echo root | base64 cm9vdAo= [root@master ~]# echo 123456 | base64 MTIzNDU2Cg==
#編寫yaml文件:
apiVersion: v1 kind: Secret metadata: name: secret-app data: #該字段爲存放數據的字段,與其餘資源對象不一樣,沒有spec字段。 username: cm9vdAo= password: MTIzNDU2Cg==
//建立secert:
[root@master ~]# kubectl apply -f secret.yaml secret/secret-app created
//反向解析加密數據:
[root@master ~]# echo -n cm9vdAo= | base64 --decode root [root@master ~]# echo -n MTIzNDU2Cg== | base64 --decode 123456
特色:便於保存,跨主機使用時會很是方便。
一,以volume方式使用secret:
pod經過volume的方式使用secret:
pod的配置文件以下所示:
apiVersion: v1 kind: Pod metadata: name: secret-pod spec: containers: - name: secret-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 3000 volumeMounts: - name: foo mountPath: /etc/foo readOnly: true volumes: - name: foo secret: secretName: secret-app
(1)定義volume foo,來源爲secret(secret-app)
(2)將foo mount到容器路徑/etc/foo,可指定讀寫權限爲readOnly。
//建立pod並在容器中讀取secret:
[root@master secret]# kubectl apply -f secret-pod.yaml pod/secret-pod created [root@master secret]# kubectl exec -it secret-pod /bin/sh / # cd /etc/foo/ /etc/foo # ls password username /etc/foo # cat password 123456 /etc/foo # cat username root
能夠看到,k8s會在指定路徑/etc/foo下爲每條敏感數據建立一個文件,文件名就是數據條目的key,這裏是/etc/foo/username和/etc/foo/password,value則以銘文存放在文件中。
(2)咱們也能夠自定義存放數據的文件名,完整的配置文件以下:
apiVersion: v1 kind: Pod metadata: name: secret-pod spec: containers: - name: secret-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 3000 volumeMounts: - name: foo mountPath: /etc/foo readOnly: true volumes: - name: foo secret: secretName: secret-app items: - key: username: path: my-group/my-username - key: password path: my-group/my-password
這時數據分別存放在/etc/foo/my-group/my-username和/etc/foo/my-group/my-password中。
//驗證數據存放位置:
[root@master secret]# kubectl delete -f secret-pod.yaml pod "secret-pod" deleted [root@master secret]# kubectl apply -f secret-pod.yaml pod/secret-pod created
[root@master secret]# kubectl exec -it secret-pod /bin/sh / # cd /etc/foo/ /etc/foo # ls my-group /etc/foo # cd my-group/ /etc/foo/..2020_02_03_05_37_09.892671465/my-group # cat my-password 123456 /etc/foo/..2020_02_03_05_37_09.892671465/my-group # cat my-username root
(3)以volume方式使用secret支持動態更新:secret更新後,容器中的數據也會更新。
//咱們有需求將password更新爲「123456.com」
[root@master secret]# echo 123456.com | base64 MTIzNDU2LmNvbQo=
修改secret配置文件:
apiVersion: v1 kind: Secret metadata: name: secret-app data: username: cm9vdAo= password: MTIzNDU2LmNvbQo=
//更新secret:
[root@master secret]# kubectl apply -f secret.yaml secret/secret-app configured
//驗證password是否更新成功:
[root@master secret]# kubectl exec -it secret-pod /bin/sh / # cd /etc/foo/my-group/ /etc/foo/..2020_02_03_05_40_42.995350019/my-group # cat my-password 123456.com
特色:若是secert的數據發生變化,引用數據的資源對象內的數據也會隨之改變,當secret更新-----pod也會更新。
二:以環境變量的方式使用
經過volume使用secret時,容器必須從文件讀取數據,會稍嫌麻煩,k8s還支持經過環境變量來使用secret。
pod配置文件示例以下:
apiVersion: v1 kind: Pod metadata: name: secret-pod spec: containers: - name: secret-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 3000 env: - name: SECRET_USERNAME valueFrom: secretKeyRef: name: secret-app key: username - name: SECRET_PASSWORD valueFrom: secretKeyRef: name: secret-app key: password
//建立pod並讀取secret:
[root@master secret]# kubectl apply -f secret-pod.yaml pod/secret-pod created [root@master secret]# kubectl exec -it secret-pod /bin/sh / # echo $SECRET_USERNAME root / # echo $SECRET_PASSWORD 123456.com
(2)驗證:接下來咱們修改secret中password的值,查看pod內的數據是否會改變?
通過測試,發現pod中的值是不會發生改變的。
特色:環境變量讀取secret很方便,但沒法支撐secret動態更新。
假設咱們須要存放在ConfigMap對象中的信息:
config1=xxx
config2=yyy
一樣擁有如下四種方法:
1.1 經過--from-literal建立:
[root@master configMap]# kubectl create configmap configmap1 --from-literal=config1=xxx --from-literal=config2=yyy configmap/configmap1 created
//查看configmap信息:
能夠看到保存的數據是以明文的方式存放。
特色:每一個--from-literal對應一條信息。
1.2 經過--from-file建立:
[root@master configMap]# echo xxx > config1 [root@master configMap]# echo yyy > config2
//建立configmap: [root@master configMap]# kubectl create configmap configmap2 --from-file=config1 --from-file=config2 configmap/configmap2 created
特色:每一個文件對應一條信息,每一個文件中只能保存一個,爲了機密性,導入後須要將本地的文件刪除掉。
1.3 經過--from-env-file的方式建立:
[root@master configMap]# cat > env.txt <<EOF > config1=xxx > config2=yyy > EOF
//建立configmap:
[root@master configMap]# kubectl create configmap configmap3 --from-env-file=env.txt configmap/configmap3 created
特色:能夠再文件裏面保存多條信息,文件env.txt中每條key=value 對應一條信息條目。
1.4 經過yaml配置文件:
#文件中的敏感數據必須是經過 base64 編碼後的結果。
configmap配置文件以下:
apiVersion: v1 kind: ConfigMap metadata: name: configmap-app data: config1: xxx #文件中的數據直接以明文輸入便可 config2: yyy
//建立configmap:
[root@master configMap]# kubectl apply -f configmap.yaml configmap/configmap-app created
特色:便於保存,跨主機使用時會很是方便。
與Secret同樣,pod也能夠經過volume或者環境變量的方式使用secret。
一:volume方式
yaml配置文件以下:
apiVersion: v1 kind: Pod metadata: name: configmap-pod spec: containers: - name: configmap-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 3000 volumeMounts: - name: foo mountPath: /etc/foo volumes: - name: foo configMap: name: configmap-app
//建立pod,並在pod中讀取數據:
[root@master configMap]# kubectl apply -f configmap-pod.yaml pod/configmap-pod created [root@master configMap]# kubectl exec -it configmap-pod /bin/sh / # cd /etc/foo/ /etc/foo # ls config1 config2 /etc/test # cat config1 xxx /etc/test # cat config2 yyy
二:env環境變量方式
yaml配置文件內容以下所示:
apiVersion: v1 kind: Pod metadata: name: configmap-pod spec: containers: - name: configmap-pod image: busybox args: - /bin/sh - -c - sleep 10; touch /tmp/healthy; sleep 3000 env: - name: CONFIG1 valueFrom: configMapKeyRef: name: configmap-app key: config1 - name: CONFIG2 valueFrom: configMapKeyRef: name: configmap-app key: config2
//建立pod並查看pod中的數據:
[root@master configMap]# kubectl delete -f configmap-pod.yaml pod "configmap-pod" deleted [root@master configMap]# kubectl apply -f configmap-pod.yaml pod/configmap-pod created
[root@master configMap]# kubectl exec -it configmap-pod /bin/sh / # echo $CONFIG1 xxx / # echo $CONFIG2 yyy
通過測試:一樣configmap和secret的兩種引用方式同樣,volume掛載的方式,若是configmap的數據更新,引用的資源對象內的數據也會更新,而以env環境變量的方式,則不支持動態更新(可本身進行測試驗證)。
注意:以上只是例子,要知道在大多數狀況下,配置信息都是以文件形式提供,因此建立ConfigMap時通常只採用--from-file或YAML方式,而讀取ConfigMap時一般採用volume方式。
小結:向pod傳遞配置信息。若是信息須要加密,可以使用Secret; 若是是通常的配置信息,則可以使用ConfigMap。Secret和ConfigMap支持四種定義方法,pod在使用它們時,能夠選擇volume方式或環境變量方式,不過只有volume方式支持動態更新。