一、以文件形式挂载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 getkubectl 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 getkubectl 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