學(xué)習(xí)本節(jié)內(nèi)容前确买,希望你已經(jīng)對(duì)以下內(nèi)容有所了解:
Secret對(duì)象與ConfigMap對(duì)象類似,但它主要用于存儲(chǔ)以下敏感信息纱皆,例如密碼湾趾,OAuth token和SSH key等等。將這些信息存儲(chǔ)在secret中派草,和直接存儲(chǔ)在Pod的定義中搀缠,或Docker鏡像定義中相比,更加安全和靈活近迁。
1. Secret類型
Secret有三種類型:
- Opaque:使用base64編碼存儲(chǔ)信息艺普,可以通過(guò)
base64 --decode
解碼獲得原始數(shù)據(jù),因此安全性弱。 - kubernetes.io/dockerconfigjson:用于存儲(chǔ)docker registry的認(rèn)證信息歧譬。
- kubernetes.io/service-account-token:用于被 serviceaccount 引用岸浑。serviceaccout 創(chuàng)建時(shí) Kubernetes 會(huì)默認(rèn)創(chuàng)建對(duì)應(yīng)的 secret。Pod 如果使用了 serviceaccount瑰步,對(duì)應(yīng)的 secret 會(huì)自動(dòng)掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中矢洲。
2. Opaque Secret
Opaque類型的Secret,其value為base64編碼后的值缩焦。
2.1 從文件中創(chuàng)建Secret
分別創(chuàng)建兩個(gè)名為username.txt和password.txt的文件:
$ echo -n "admin" > ./username.txt
$ echo -n "1f2d1e2e67df" > ./password.txt
使用kubectl create secret
命令創(chuàng)建secret:
$ kubectl create secret generic db-user-pass --from-file=./username.txt --from-file=./password.txt
secret "db-user-pass" created
2.2 使用描述文件創(chuàng)建Secret
首先使用base64對(duì)數(shù)據(jù)進(jìn)行編碼:
$ echo -n 'admin' | base64
YWRtaW4=
$ echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
創(chuàng)建一個(gè)類型為Secret的描述文件:
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
$ kubectl create -f ./secret.yaml
secret "mysecret" created
查看此Secret:
$ kubectl get secret mysecret -o yaml
apiVersion: v1
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
kind: Secret
metadata:
creationTimestamp: 2016-01-22T18:41:56Z
name: mysecret
namespace: default
resourceVersion: "164619"
selfLink: /api/v1/namespaces/default/secrets/mysecret
uid: cfee02d6-c137-11e5-8d73-42010af00002
type: Opaque
2.3 Secret的使用
創(chuàng)建好Secret之后读虏,可以通過(guò)兩種方式使用:
- 以Volume方式
- 以環(huán)境變量方式
2.3.1 將Secret掛載到Volume中
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
進(jìn)入Pod查看掛載的Secret:
# ls /etc/secrets
password username
# cat /etc/secrets/username
admin
# cat /etc/secrets/password
1f2d1e2e67df
也可以只掛載Secret中特定的key:
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
在這種情況下:
- username 存儲(chǔ)在/etc/foo/my-group/my-username中
- password未被掛載
2.3.2 將Secret設(shè)置為環(huán)境變量
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
restartPolicy: Never
3. kubernetes.io/dockerconfigjson
kubernetes.io/dockerconfigjson用于存儲(chǔ)docker registry的認(rèn)證信息,可以直接使用kubectl create secret
命令創(chuàng)建:
$ kubectl create secret docker-registry myregistrykey --docker-server=DOCKER_REGISTRY_SERVER --docker-username=DOCKER_USER --docker-password=DOCKER_PASSWORD --docker-email=DOCKER_EMAIL
secret "myregistrykey" created.
查看secret的內(nèi)容:
$ kubectl get secret myregistrykey -o yaml
apiVersion: v1
data:
.dockercfg: eyJjY3IuY2NzLnRlbmNlbnR5dW4uY29tL3RlbmNlbnR5dW4iOnsidXNlcm5hbWUiOiIzMzIxMzM3OTk0IiwicGFzc3dvcmQiOiIxMjM0NTYuY29tIiwiZW1haWwiOiIzMzIxMzM3OTk0QHFxLmNvbSIsImF1dGgiOiJNek15TVRNek56azVORG94TWpNME5UWXVZMjl0In19
kind: Secret
metadata:
creationTimestamp: 2017-08-04T02:06:05Z
name: myregistrykey
namespace: default
resourceVersion: "1374279324"
selfLink: /api/v1/namespaces/default/secrets/myregistrykey
uid: 78f6a423-78b9-11e7-a70a-525400bc11f0
type: kubernetes.io/dockercfg
通過(guò) base64 對(duì) secret 中的內(nèi)容解碼:
$ echo "eyJjY3IuY2NzLnRlbmNlbnR5dW4uY29tL3RlbmNlbnR5dW4iOnsidXNlcm5hbWUiOiIzMzIxMzM3OTk0IiwicGFzc3dvcmQiOiIxMjM0NTYuY29tIiwiZW1haWwiOiIzMzIxMzM3OTk0QHFxLmNvbSIsImF1dGgiOiJNek15TVRNek56azVORG94TWpNME5UWXVZMjl0XXXX" | base64 --decode
{"ccr.ccs.tencentyun.com/XXXXXXX":{"username":"3321337XXX","password":"123456.com","email":"3321337XXX@qq.com","auth":"MzMyMTMzNzk5NDoxMjM0NTYuY29t"}}
也可以直接讀取 ~/.dockercfg 的內(nèi)容來(lái)創(chuàng)建:
$ kubectl create secret docker-registry myregistrykey \
--from-file="~/.dockercfg"
在創(chuàng)建 Pod 的時(shí)候袁滥,通過(guò) imagePullSecrets 來(lái)引用剛創(chuàng)建的 myregistrykey:
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: foo
image: janedoe/awesomeapp:v1
imagePullSecrets:
- name: myregistrykey
4. kubernetes.io/service-account-token
用于被 serviceaccount 引用盖桥。serviceaccout 創(chuàng)建時(shí) Kubernetes 會(huì)默認(rèn)創(chuàng)建對(duì)應(yīng)的 secret。Pod 如果使用了 serviceaccount题翻,對(duì)應(yīng)的 secret 會(huì)自動(dòng)掛載到 Pod 的 /run/secrets/kubernetes.io/serviceaccount 目錄中揩徊。
$ kubectl run nginx --image nginx
deployment "nginx" created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-3137573019-md1u2 1/1 Running 0 13s
$ kubectl exec nginx-3137573019-md1u2 ls /run/secrets/kubernetes.io/serviceaccount
ca.crt
namespace
token