一、以文件形式挂载Secret¶
1.将这些字符串转换为 base64
[root@k8s-master01 conf]# echo -n 'admin' | base64
YWRtaW4=
[root@k8s-master01 conf]# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
注意:Secret 数据的 JSON 和 YAML 序列化结果是以 base64 编码的。 换行符在这些字符串中无效,必须省略。 在 Darwin/macOS 上使用 base64 工具时,用户不应该使用 -b 选项分割长行。 相反地,Linux 用户应该在 base64 地命令中添加 -w 0 选项, 或者在 -w 选项不可用的情况下,输入 base64 | tr -d '\n'。
2.创建清单
$ vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
3.创建 Secret
$ kubectl apply -f secret.yaml
4.检查 Secret 是否已创建
[root@k8s-master01 conf]# kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 15m
default-token-8s8wl kubernetes.io/service-account-token 3 52d
mysecret Opaque 2 47s
5.查看 Secret 的细节
[root@k8s-master01 conf]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
username: 5 bytes
password: 12 bytes
注意:kubectl get 和 kubectl describe 命令默认不显示 Secret 的内容。 这是为了防止 Secret 被意外暴露或存储在终端日志中.
6.编写Pod的Yaml文件
$ vim mypod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
volumeMounts:
- mountPath: /etc/foo
name: foo
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
上面内容说明如下:
- 在spec.volumes下增加一个volume,命名随意,spec.volumes.secret.secretName必须和Secret对象的名字相同,并且在同一个Namespace中
- 将spec.containers.volumeMounts加到需要用到该Secret的容器中,并且设置spec.containers.volumeMounts.readOnly = true。
- 使用spec.containers.volumeMounts.mountPath指定Secret挂载目录
7.创建Pod
$ kubectl create -f mypod.yaml
8.在Pod中查看挂载的文件内容,由于没有指定挂载文件的名称,因此会用Secret数据中的Key名作为文件,和ConfigMap一致。
[root@k8s-master01 conf]# kubectl exec -it mypod -- sh
/ # cat /etc/foo/password
1f2d1e2e67df
/ # cat /etc/foo/username
admin
二、自定义文件名挂载¶
1.将这些字符串转换为 base64
[root@k8s-master01 conf]# echo -n 'admin' | base64
YWRtaW4=
[root@k8s-master01 conf]# echo -n '1f2d1e2e67df' | base64
MWYyZDFlMmU2N2Rm
注意:Secret 数据的 JSON 和 YAML 序列化结果是以 base64 编码的。 换行符在这些字符串中无效,必须省略。 在 Darwin/macOS 上使用 base64 工具时,用户不应该使用 -b 选项分割长行。 相反地,Linux 用户应该在 base64 地命令中添加 -w 0 选项, 或者在 -w 选项不可用的情况下,输入 base64 | tr -d '\n'。
2.创建清单
$ vim secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: MWYyZDFlMmU2N2Rm
3.创建 Secret
$ kubectl apply -f secret.yaml
4.检查 Secret 是否已创建
[root@k8s-master01 conf]# kubectl get secrets
NAME TYPE DATA AGE
db-user-pass Opaque 2 15m
default-token-8s8wl kubernetes.io/service-account-token 3 52d
mysecret Opaque 2 47s
5.查看 Secret 的细节
[root@k8s-master01 conf]# kubectl describe secret mysecret
Name: mysecret
Namespace: default
Labels: <none>
Annotations: <none>
Type: Opaque
Data
====
username: 5 bytes
password: 12 bytes
注意:kubectl get 和 kubectl describe 命令默认不显示 Secret 的内容。 这是为了防止 Secret 被意外暴露或存储在终端日志中.
6.编写Pod的Yaml文件
$ vim mypod.yaml
apiVersion: v1
kind: Pod
metadata:
name: mypod
spec:
containers:
- name: mypod
image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
volumeMounts:
- mountPath: /etc/foo
name: foo
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username
上面内容说明如下:
- 在spec.volumes下增加一个volume,命名随意,spec.volumes.secret.secretName必须和Secret对象的名字相同,并且在同一个Namespace中
- 将spec.containers.volumeMounts加到需要用到该Secret的容器中,并且设置spec.containers.volumeMounts.readOnly = true。
- 使用spec.containers.volumeMounts.mountPath指定Secret挂载目录(不指定items为该路径)
- 使用spec.volumes.secret.items字段修改每个key的目标路径,即控制Secret Key在容器中的映射路径
7.创建Pod
$ kubectl create -f mypod.yaml
8.查看挂载文件,上述挂载方式将mysecret中的username存储到了/etc/foo/my-group/my-username文件中,而不是/etc/foo/username(不指定items为该路径)。由于items没有指定password,因此password不会被挂载,因为使用了spec.volumes.secret.items,只有在items中指定的key才会被挂载。
[root@k8s-master01 conf]# kubectl exec -it mypod -- sh
/ # ls /etc/foo/my-group/my-username
/etc/foo/my-group/my-username
/ # ls /etc/foo/username
ls: /etc/foo/username: No such file or directory