使用密钥
密钥创建后,可在工作负载环境变量和数据卷两个场景使用。
请勿对以下CCE系统使用的密钥做任何操作,详情请参见集群系统密钥说明。
- 请不要操作kube-system下的secrets。
- 请不要操作任何命名空间下的default-secret、paas.elb。其中,default-secret用于SWR的私有镜像拉取,paas.elb用于该命名空间下的服务对接ELB。
本节以下面这个Secret为例,具体介绍Secret的用法。
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque data: username: ****** #需要用Base64编码 password: ****** #需要用Base64编码
- 在Pod里使用密钥时,需要Pod和密钥处于同一集群和命名空间中。
- 当Secret 被更新时,Kubernetes会同时更新数据卷中的数据。
但对于以subPath形式挂载的Secret数据卷,当Secret 被更新时,Kubernetes无法自动更新数据卷中的数据。
使用密钥设置工作负载的环境变量
使用控制台方式
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏选择“工作负载”,单击右上角“创建工作负载”。
在创建工作负载时,在“容器配置”中找到“环境变量”,单击“新增变量”。
- 密钥导入:选择一个密钥,将密钥中所有键值都导入为环境变量。
- 密钥项键值导入:将密钥中某个键的值导入作为某个环境变量的值。
- 变量名称:工作负载中的环境变量名称,可自定义,默认为密钥中选择的键名。
- 变量/变量引用:选择一个密钥及需要导入的键名,将其对应的值导入为工作负载环境变量。
例如将mysecret这个密钥中“username”的值导入,作为工作负载环境变量“username”的值,导入后容器中将会有一个名为“username”的环境变量。
- 密钥导入:选择一个密钥,将密钥中所有键值都导入为环境变量。
- 配置其他工作负载参数后,单击“创建工作负载”。
等待工作负载正常运行后,您可登录容器执行以下语句,查看该密钥是否已被设置为工作负载的环境变量。
printenv username
如输出与Secret中的内容一致,则说明该密钥已被设置为工作负载的环境变量。
使用kubectl方式
- 请参见通过kubectl连接集群配置kubectl命令。
- 创建并编辑nginx-secret.yaml文件。
vi nginx-secret.yaml
YAML文件内容如下:
- 密钥导入:如果要将一个密钥中所有数据都添加到环境变量中,可以使用envFrom参数,密钥中的Key会成为工作负载中的环境变量名称。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-secret spec: replicas: 1 selector: matchLabels: app: nginx-secret template: metadata: labels: app: nginx-secret spec: containers: - name: container-1 image: nginx:latest envFrom: # 使用envFrom来指定环境变量引用的密钥 - secretRef: name: mysecret # 引用的密钥名称 imagePullSecrets: - name: default-secret
- 密钥键值导入:您可以在创建工作负载时将密钥设置为环境变量,使用valueFrom参数单独引用Secret中的Key/Value。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-secret spec: replicas: 1 selector: matchLabels: app: nginx-secret template: metadata: labels: app: nginx-secret spec: containers: - name: container-1 image: nginx:latest env: # 设置工作负载中的环境变量 - name: SECRET_USERNAME # 工作负载中的环境变量名称 valueFrom: # 使用valueFrom来指定环境变量引用的密钥 secretKeyRef: name: mysecret # 引用的密钥名称 key: username # 引用的密钥中的key - name: SECRET_PASSWORD # 添加多个环境变量参数,可同时导入多个环境变量 valueFrom: secretKeyRef: name: mysecret key: password imagePullSecrets: - name: default-secret
- 密钥导入:如果要将一个密钥中所有数据都添加到环境变量中,可以使用envFrom参数,密钥中的Key会成为工作负载中的环境变量名称。
- 创建工作负载。
kubectl apply -f nginx-secret.yaml
- 创建完成后,查看Pod中的环境变量。
- 执行以下命令,查看已创建的Pod。
kubectl get pod | grep nginx-secret
预期输出如下:nginx-secret-*** 1/1 Running 0 2m18s
- 执行以下命令,查看该Pod中的环境变量。
kubectl exec nginx-secret-*** -- printenv SPECIAL_USERNAME SPECIAL_PASSWORD
如输出与Secret中的内容一致,则说明该密钥已被设置为工作负载的环境变量。
- 执行以下命令,查看已创建的Pod。
使用密钥配置工作负载的数据卷
密钥(Secret)挂载将密钥中的数据挂载到指定的容器路径,密钥内容由用户决定。用户需要提前创建密钥,操作步骤请参见创建密钥。
使用控制台方式
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏选择“工作负载”,在右侧选择“无状态负载”页签。单击右上角“创建工作负载”。
在创建工作负载时,在“容器配置”中找到“数据存储”,选择“添加存储卷 > 密钥(Secret)”。
- 选择密钥挂载参数,如表1。
表1 密钥挂载 参数
参数说明
密钥
选择对应的密钥名称。
密钥需要提前创建,具体请参见创建密钥。
挂载路径
请输入挂载路径。密钥挂载完成后,会在容器中的挂载路径下生成以密钥中的key为文件名, value为文件内容的密钥文件。
数据存储挂载到容器上的路径。请不要挂载在系统目录下,如“/”、“/var/run”等,会导致容器异常。建议挂载在空目录下,若目录不为空,请确保目录下无影响容器启动的文件,否则文件会被替换,导致容器启动异常,工作负载创建失败。须知:挂载高危目录的情况下 ,建议使用低权限账号启动,否则可能会造成宿主机高危文件被破坏。
子路径
请输入挂载路径的子路径。
- 使用子路径挂载本地磁盘,实现在单一Pod中重复使用同一个Volume,不填写时默认为根。
- 子路径可以填写ConfigMap/Secret的键值,子路径若填写为不存在的键值则数据导入不会生效。
- 通过子路径导入的数据不会随ConfigMap/Secret的更新而动态更新。
权限
只读。只能读容器路径中的数据卷。
图1 使用密钥挂载到工作负载数据卷
- 其余信息都配置完成后,单击“创建工作负载”。
等待工作负载正常运行后,本示例将在/etc/foo目录下生成username和password两个文件,且文件的内容分别为密钥值。
您可登录容器执行以下语句,查看容器中的username和password两个文件。
cat /etc/foo/username
预期输出与Secret中的内容一致。
使用kubectl方式
- 请参见通过kubectl连接集群配置kubectl命令。
- 创建并编辑nginx-secret.yaml文件。
vi nginx-secret.yaml
如下面的示例所示,mysecret密钥的username和password以文件方式保存在/etc/foo目录下。apiVersion: apps/v1 kind: Deployment metadata: name: nginx-secret spec: replicas: 1 selector: matchLabels: app: nginx-secret template: metadata: labels: app: nginx-secret spec: containers: - name: container-1 image: nginx:latest volumeMounts: - name: foo mountPath: /etc/foo # 挂载到/etc/foo目录下 readOnly: true volumes: - name: foo secret: secretName: mysecret # 引用的密钥名称
您还可以使用items字段控制Secret键的映射路径,例如,将username存放在容器中的/etc/foo/my-group/my-username目录下。- 使用items字段指定Secret键的映射路径后,没有被指定的键将不会被以文件形式创建。例如,下面的例子中的password键未被指定,则该文件将不会被创建。
- 如果要使用Secret中全部的键,那么必须将全部的键都列在items字段中。
- items字段中列出的所有键必须存在于相应的Secret 中。否则,该卷不被创建。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-secret spec: replicas: 1 selector: matchLabels: app: nginx-secret template: metadata: labels: app: nginx-secret spec: containers: - name: container-1 image: nginx:latest volumeMounts: - name: foo mountPath: /etc/foo # 挂载到/etc/foo目录下 readOnly: true volumes: - name: foo secret: secretName: mysecret # 引用的密钥名称 items: - key: username # 引用的密钥中的键名 path: my-group/my-username # Secret键的映射路径
- 创建工作负载。
kubectl apply -f nginx-secret.yaml
- 等待工作负载正常运行后,在/etc/foo目录下会生成username和password两个文件。
- 执行以下命令,查看已创建的Pod。
kubectl get pod | grep nginx-secret
预期输出如下:nginx-secret-*** 1/1 Running 0 2m18s
- 执行以下命令,查看该Pod中的username或password文件。
kubectl exec nginx-secret-*** -- cat /etc/foo/username
预期输出与Secret中的内容一致。
- 执行以下命令,查看已创建的Pod。