通常我们在构建应用(Pod)时,总会传递一些敏感信息到Pod 的容器内。比如建立数据库的用户名、密码等。这些信息保存在Docker的镜像里总不太灵活。这时候我们就可以使用Kubernetes 的Secret 。
Secret的特点是以密文方式存储数据,避免直接在配置文件中保存敏感信息,Secret会以Volume的形式被mount到Pod,容器可以通过文件又或者是环境变量的方式使用Secret中的敏感数据。
使用Secret
- 通过--form-literal
#创建一个叫form-secret 的secret ,并且添加两个键(account、password),值为(admin、123456)
ubuntu@server:~$ sudo kubectl create secret generic form-secret --from-literal=account=admin --from-literal=password=123456
secret/form-secret created
#验证form-secret是否创建成功
ubuntu@server:~$ sudo kubectl get secret
NAME TYPE DATA AGE
default-token-2tjxh kubernetes.io/service-account-token 3 38d
form-secret Opaque 2 18m
- 通过 --from-file
#先创建account.dat 和password.dat 文件
ubuntu@server:~$ echo 'file-account' >> account.dat
ubuntu@server:~$ echo 'abcdefg' >> password.dat
#创建一个叫file-secret 的secret ,把account.dat 和password.dat 文件导进去。
ubuntu@server:~$ sudo kubectl create secret generic file-secret --from-file=account.dat --from-file=password.dat
secret/file-secret created
- 通过--from-env
#创建文件 vim secret-env.dat
#secret-env.dat. 内容
account=env-account
password=654321
#把secret-env.dat 导进去
ubuntu@server:~$ sudo kubectl create secret generic secret-env --from-env-file=secret-env.dat
secret/secret-env created
- 通过yaml 文件引入
#首先需要把值转换成base64
echo -n yamlAdmin|base64
eWFtbEFkbWlu
echo -n 222222|base64
MjIyMjIy
#创建文件vim secret-file.yaml
#secret-file.yaml 内容
apiVersion: v1
kind: Secret
metadata:
name: yaml-secret
data:
account: eWFtbEFkbWlu
password: MjIyMjIy
引入
ubuntu@server:~$ sudo kubectl apply -f secret-file.yaml
secret/yaml-secret created
查看Secret
#查看已经创建的Secret 列表
ubuntu@server:~$ sudo kubectl get secrets
NAME TYPE DATA AGE
default-token-2tjxh kubernetes.io/service-account-token 3 39d
form-secret Opaque 2 3h56m
file-secret Opaque 2 3h34m
yaml-secret Opaque 2 42s
#查看某一个Secret
ubuntu@server:~$ sudo kubectl describe secret yaml-secret
Name: yaml-secret
Namespace: default
Labels:
Annotations:
Type: Opaque
Data
====
password: 6 bytes
account: 9 bytes
在Pod中使用Secret
1、通过Volume 获得Secret
#vim secret-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-pod
spec:
containers:
- name: secret-pod
image: busybox
args:
- /bin/sh
- -c
- sleep 10;sleep 300000
volumeMounts:
- name: volume
mountPath: "/etc/volume" #将volume mount到容器路径/etc/volume
volumes:
- name: volume
secret:
secretName: yaml-secret
引入并且查看结果
#引入并创建Pod
ubuntu@server:~$ sudo kubectl apply -f secret-pod.yaml
pod/secret-pod created
#进入到容器内部
ubuntu@server:~$ sudo kubectl exec -it secret-pod /bin/sh
/etc/volume # ls /etc/volume/
account password
#执行如下命令并查看结果
cat /etc/volume/account
#结果
yamlAdmin
cat /etc/volume/password
#结果
222222
结果:Kubenetes会在指定的路径/etc/volume 下为每条敏感数据创建一个文件,以明文存放在文件中。
当Secret 有需要更新时,可以通过如下命令进行更新。 更新后将会自动反馈到Pod容器内。
#获得gg2022 的base64值
ubuntu@server:~$ echo -n gg2022|base64
Z2cyMDIy
#vi secret-file.yaml
apiVersion: v1
kind: Secret
metadata:
name: yaml-secret
data:
account: eWFtbEFkbWlu
password: Z2cyMDIy #这里把Z2cyMDIy 赋值到password里
#重新引入到Pod
ubuntu@server:~$ sudo kubectl apply -f secret-file.yaml
secret/yaml-secret configured
#大约数秒后,我们再进入到容器去查看结果
ubuntu@server:/etc$ sudo kubectl exec -it secret-pod /bin/sh
cat /etc/volume/password
#输出的结果已经变为gg2022
gg2022
2、通过环境变量读取Secret
#vim env-pod.yaml
#env-pod 的内容
apiVersion: v1
kind: Pod
metadata:
name: env-pod
spec:
containers:
- name: env-pod
image: busybox
args:
- /bin/sh
- -c
- sleep 10; sleep 300000
env:
- name: SECRET_ACCOUNT
valueFrom:
secretKeyRef:
name: yaml-secret
key: account
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: yaml-secret
key: password
对env-pod.yaml 文件进行引入并创建Pod
ubuntu@server:~$ sudo kubectl apply -f env-pod.yaml
pod/env-pod created
进入到Pod容器内,读取自动加载好的环境变量
ubuntu@server:~$ sudo kubectl exec -it env-pod /bin/sh
#读取环境变量的值
echo $SECRET_ACCOUNT
yamlAdmin
echo $SECRET_PASSWORD
gg2022
在实际场景中,我会偏向通过yaml方式创建Secret。
除了Secret,Kubenetes 还提供了ConfigMap的方式来创建容器数据。ConfigMap 与Secret 的用法非常相似,区别点在于ConfigMap可以通过明文方式存储数据,适合存放非敏感数据,例如配置信息。
基于两者用法是一致,只是命令的关键字不同,此文就不再详述ConfigMap的用法。