10.3 在Pod中使用Secret
10.3.1 Volume方式
apiVersion: v1
kind: Pod
metaata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
volumeMounts:
- name: foo
mountPath: "/etc/foo" # 在容器内部的该路径下
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret # 指定有前面创建的mysecret
kubectl apply -f mypod.yml
pod "mypod" created
kubeusr@GalaxyKubernetesMaster:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod / ContainerCreating 7s
producer-consumer / Running 18h
kubeusr@GalaxyKubernetesMaster:~$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mypod / Running 14s
producer-consumer / Running 18h
kubeusr@GalaxyKubernetesMaster:~$ kubectl exec -it mypod sh # 进入容器
/ # cd /etc/foo # 进入
/etc/foo # ls
password username
/etc/foo # cat /etc/foo/password # 可以直接查看内容,是名文。
K8s会在指定的路径下为每条敏感数据创建一个文件,文件名是数据条目的Key, /etc/foo/username和 etc/foo/password, value是以明文的形式存放在文件中。
我们也可以自定义存放数据的文件名,配置文件如下改动:这时,数据将存放在/etc/foo/my-group/myt-username中。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
- key: password
path: my-group/my-password
以Voluime方式使用secret支持动态更新:Secret更新后,容器中的数据也会更新。
10.3.2 环境变量方式
通过volume方式使用secret,容器必须从文件读取数据,稍显麻烦。
K8s支持通过环境变量使用secret。
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: busybox
args:
- /bin/sh
- -c
- sleep ; touch /tmp/healthy; sleep
env:
- name: SECRET_USERNAME # 环境变量名字
valueFrom:
secretKeyRef:
name: mysecret # 从哪个secret来
key: username # key
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password
通过环境变量SECRET_USERNAME 和 SECRET_PASSWORD就可以读取到secret的数据,但是注意: 环境变量的方式不支持Secret动态更新。
-su: kubeusr@GalaxyKubernetesMaster:~$: command not found
kubeusr@GalaxyKubernetesMaster:~$ pod "mypod" created