Secret是为了解决密码,token或秘钥等比较敏感的数据的配置问题,避免了直接将这些数据暴露在镜像或者Pod Spec中。
1.Secret的类型
Secret有三种类型:
- Opaque
基于base64编码,用来存储密码等,但是可以通过base64 --decode解码,加密性很弱。 - kubernetes.io/dockerconfigjson
用来存储私有docker registry的认证信息。 - kubernetes.io/service-account-token
用于被serviceaccount引用,用于集群间组件通信的令牌。
以下以Opaque类型为主做记录。
2.创建Secret
有四种方式可以创建Secret
- 通过--from-literal
kubectl create secret generic mysecret --from-literal=username=admin --from--literal=password=123456
一个--from-literal对应一个条目 - 通过--from-file
echo -n admin > ./username
echo -n 123456 > ./password
kubectl create secret generic mysecret1 --from-file=./username --from-file=./password
一个文件对应一个条目
- 通过--from-env-file
cat << EOF > env.txt
username=admin
password=123456
EOF
kubectl create secret generic mysecret2 --from-env-file=env.txt
env.txt中每一行key=value对应一个条目
- 通过yaml文件
apiVersion: v1
kind: Secret
metadata:
name: mysecret3
data:
username: YWRtaW4=
password: MTIzNDU2
其中data中的敏感数据必须是base64编码后的结果。
3.使用Secret
有两种方式使用Secret,分别为Volume和环境变量
3.1 Pod中Volume挂载使用Secret
创建yaml配置文件volume_secret.yaml
apiVersion: v1
kind: Pod
metadata:
name: volume_secret
spec:
containers:
- name: volume_secret
image: busybox
args:
- /bin/sh
- -c
- sleep 10; touch /tmp/test; sleep 30000
volumeMounts:
- name: secrets
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secrets
secret:
secretName: mysecret3
执行创建应用,然后进入busybox中:
kubectl exec -it volume_secret sh
查看/etc/secrets/username,/etc/secrets/password可得到Secret
可以看出,kubernetes会再指定的路径/etc/secrets为Secret中每一个条目数据创建一个文件,文件名就是条目的key,文件内容就是条目的value。
也可以指定存放数据的文件名,比如将上面的yaml文件修改为:
在最后添加:
secretName: mysecret3
items:
- key: username
path: /etc/test/my_username
- key: password
path: /etc/test/my_password
Volume方式使用的Secret支持动态更新,当Secret更新后,容器中的数据也会相应的更新。
3.2 环境变量方式使用Secret
创建env_secret.yaml文件:
apiVersion: v1
kind: Pod
metadata:
name: env-secret
spec:
containers:
- name: env-secret
image: busybox
args:
- /bin/sh
- -c
- sleep 10; touch /tmp/test; sleep 30000
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: mysecret3
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret3
key: password
执行应用进入容器中查看,通过环境变量SECRET_USERNAME和SECRET_PASSWORD可以读取到Secret的数据。
与volume不同的是,环境变量的方式读取Secret很方便,但是不能动态更新
网友评论