一、自定义Secret文件权限

Secret在挂载使用时可以更改文件的权限(默认是0644),比如将上述的文件挂载权限自定义为0666(对应Linux的文件权限为rw-rw-rw-)。

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
      defaultMode: 0666

上面内容说明如下:

  • 在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.验证,观察到实际权限为666

[root@k8s-master01 conf]# kubectl exec -it mypod -- sh
/ # ls /etc/foo/..data/my-group/my-username -l
-rw-rw-rw-    1 root     root             5 May  3 06:34 /etc/foo/..data/my-group/my-username

二、使用valueFrom定义单个环境变量

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: secert-env-pod
spec:
  containers:
  - name: mycontainer
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    env:
      - name: SECRET_USERNAME
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: username
      - name: SECRET_PASSWORD
        valueFrom:
          secretKeyRef:
            name: mysecret
            key: password
  restartPolicy: Never

上面内容说明如下:

  • 每个容器添加对应的Secret Key环境变量env.valueFrom.secretKeyRef,定义SECRET_USERNAME和SECRET_PASSWORD两个环境变量,其值来自于名字为mysecret的Secret

7.创建Pod

$ kubectl create -f mypod.yaml

8.挂载成功后,可以在容器中使用此变量

[root@k8s-master01 conf]# kubectl exec -it secert-env-pod -c mycontainer -- sh
/ # echo $SECRET_USERNAME
admin
/ # echo $SECRET_PASSWORD
1f2d1e2e67df

三、使用envFrom定义多个环境变量

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: secert-env-pod
spec:
  containers:
  - name: mycontainer
    image: registry.cn-hangzhou.aliyuncs.com/zq-demo/nginx:1.14.2
    envFrom:
    - secretRef:
        name: mysecret
      prefix: fromCm_
  restartPolicy: Never

上面内容说明如下:

  • spec.containers.envFrom.prefix用于在默认键(username和password)前面加上前缀fromCm_

7.创建Pod

$ kubectl create -f mypod.yaml

8.挂载成功后,可以在容器中使用此变量

[root@k8s-master01 conf]# kubectl exec -it secert-env-pod -c mycontainer -- sh
/ # echo $fromCm_username
admin
/ # echo $fromCm_password
1f2d1e2e67df