前言
使用场景:凭证
作用:解决了密码、token、秘钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或pod spec 中。可以以volume或环境变量的方式使用。
pod可以用三种方式来使用secret:
• 作为挂载到一个或多个容器上的卷中的文件
• 作为容器的环境变量
• 由kubelet在为pod拉取镜像时使用
secret有三种类型:
opaque:base64编码格式,数据也通过base64解码得到原始数据,加密性很弱
dockerconfigjson:用来存储私有的docker registry 的认证信息。
service-account-token:用于被serviceaccount引用。
配置实践
1、创建secret加密数据
[root@k8s-master ~]# cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
[root@k8s-master ~]# kubectl apply -f secret.yaml
secret/mysecret created
[root@k8s-master ~]# kubectl get secrets
NAME TYPE DATA AGE
mysecret Opaque 2 10s
2、创建secret以环境变量形式存在pod中
[root@k8s-master ~]# cat secret-val.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: nginx:1.15
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret
key: username
optional: false # 此值为默认值;意味着 "mysecret"
# 必须存在且包含名为 "username" 的主键
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
optional: false # 此值为默认值;意味着 "mysecret"
# 必须存在且包含名为 "password" 的主键
restartPolicy: Never
[root@k8s-master ~]# kubectl apply -f secret-val.yaml
pod/secret-env-pod created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
secret-env-pod 1/1 Running 0 17s
[root@k8s-master ~]# kubectl exec -it secret-env-pod bash
root@secret-env-pod:/# echo $SECRET_PASSWORD
1f2d1e2e67df
root@secret-env-pod:/# echo $SECRET_USERNAME
admin
root@secret-env-pod:/# exit
Exit
3、以volume形式挂载在pod中
[root@k8s-master ~]# cat secret-vol.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: nginx:1.15
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
optional: false # 默认设置,意味着 "mysecret" 必须已经存在
[root@k8s-master ~]# kubectl apply -f secret-vol.yaml
pod/mypod created
[root@k8s-master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod 1/1 Running 0 5s
secret-env-pod 1/1 Running 0 5m24s
[root@k8s-master ~]# kubectl exec -it mypod bash
root@mypod:/# cd /etc/foo/
root@mypod:/etc/foo# ls
password username
root@mypod:/etc/foo# cat password
1f2d1e2e67dfroot@mypod:/etc/foo#
root@mypod:/etc/foo# cat username
adminroot@mypod:/etc/foo#
root@mypod:/etc/foo# exit
exit