2.1 Secrets 简介

官网: https://kubernetes.io/docs/concepts/configuration/secret/#creating-a-secret

Secrets 是一种包含少量敏感信息例如密码、令牌或密钥的对象。 这样的信息可能会被放在规约中或者镜像中。 使用 Secrets 意味着你不需要在应用程序代码中包含机密数据。由于创建 Secrets 可以独立于使用它们的 Pod, 因此在创建、查看和编辑 Pod 的工作流程中暴露 Secrets(及其数据)的风险较小。 Kubernetes 和在集群中运行的应用程序也可以对 Secrets 采取额外的预防措施, 例如避免将机密数据写入非易失性存储。Secrets 类似于但专门用于保存机密数据。

2.2 Secrets 类型

  1. Opaque:通用型 Secret ,任意用户定义的数据;
  2. kubernetes.io/service-account-token:作用于 ServiceAccount,包含一个令牌,用于标识 API 服务账户;
  3. kubernetes.io/dockerconfigjson:下载私有仓库镜像使用的 Secret;
  4. kubernetes.io/tls:用于存储 HTTPS 域名证书文件的 Secret ,可以被 Ingress 使用。

2.3 Secrets 类型使用

2.3.1 Opaque 类型使用

# Step 1:命令行方式创建secret资源(以环境变量方式)
$ kubectl create secret generic mysql-secret \
  --from-literal=MYSQL_ROOT_PASSWORD=root \
  --from-literal=MYSQL_USER=maoxiansheng \
  --from-literal=MYSQL_PASSWORD=maoxiansheng \
  --dry-run=client -o yaml > mysql-secret.yaml

# Step 2:查看资源清单
$ cat mysql-secret.yaml 
apiVersion: v1
data:
  MYSQL_PASSWORD: bWFveGlhbnNoZW5n
  MYSQL_ROOT_PASSWORD: cm9vdA==
  MYSQL_USER: bWFveGlhbnNoZW5n
kind: Secret
metadata:
  creationTimestamp: null
  name: mysql-secret

# Step 3:查看变量值
$ echo bWFveGlhbnNoZW5n | base64 -d
maoxiansheng

# Step 4:创建资源
$ kubectl create -f mysql-secret.yaml

# Step 5:查看资源
$ kubectl get -f mysql-secret.yaml 
NAME           TYPE     DATA   AGE
mysql-secret   Opaque   3      38s

# Step 6:创建Pod并注入环境变量(单个变量依次注入)
$ vim mysql-pods.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pods
spec:
  containers:
  - name: mysql
    image: m.daocloud.io/docker.io/mysql:8.0
    env:
    - name: MYSQL_ROOT_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-secret
          key: MYSQL_ROOT_PASSWORD
    - name: MYSQL_USER
      valueFrom:
        secretKeyRef:
          name: mysql-secret
          key: MYSQL_USER
    - name: MYSQL_PASSWORD
      valueFrom:
        secretKeyRef:
          name: mysql-secret
          key: MYSQL_PASSWORD
    - name: MYSQL_DATABASE
      value: maoxiansheng

# Step 7:创建Pod
$ kubectl create -f mysql-pods.yml

# Step 8:查看Pod内环境变量
$ kubectl exec mysql-pods  -- env | grep MYSQL

# Step 9:创建Pod并注入环境变量(多个变量一次注入)
$ vim mysql-pod.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  containers:
  - name: mysql
    image: m.daocloud.io/docker.io/mysql:8.0
    envFrom:
    - secretRef:
        name: mysql-secret
    env:
    - name: MYSQL_DATABASE
      value: maoxiansheng
      
# Step 10:创建资源
$ kubectl create -f mysql-pod.yml

# Step 11:查看Pod内环境变量
$ kubectl exec mysql-pod -- env | grep MYSQL

2.3.2 dockerconfigjson 类型使用

# Step 1:命令行创建Secrets
$ kubectl create secret docker-registry myregistrykey \
--docker-server=DOCKER_REGISTRY_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD \
--docker-email=DOCKER_EMAIL
# docker-registry:指定Secret的类型
# myregistrykey: Secret名称
# DOCKER_REGISTRY_SERVER:镜像仓库地址
# DOCKER_USER:镜像仓库用户名,需要有拉取镜像的权限
# DOCKER_PASSWORD:镜像仓库密码
# DOCKER_EMAIL:邮箱信息,可以为空

$ kubectl create secret docker-registry myregistrykey \
--docker-server=registry.cn-hangzhou.aliyuncs.com \
--docker-username="aliyun6412327368" \
--docker-password="maoxiansheng159"  \
--docker-email="22364736365@qq.com"

# Step 2:创建资源清单
$ vim mysql-pod-imagePullSecrets.yml
---
apiVersion: v1
kind: Pod
metadata:
  name: mysql-pod
spec:
  # 添加一下配置参数:
  imagePullSecrets:
  - name: myregistrykey
  containers:
  - name: mysql
    image: registry.cn-hangzhou.aliyuncs.com/hujiaming-01/mysql:1.0.0
    envFrom:
    - secretRef:
        name: mysql-secret
    env:
    - name: MYSQL_DATABASE
      value: maoxiansheng

# Step 3:创建资源
$ kubectl create -f mysql-pod-imagePullSecrets.yml

2.3.3 ConfigMap 和 Secret 挂载文件覆盖解决

当挂载文件到容器路径时,该容器挂载路径有其他文件会被全部覆盖掉只保留需要挂载的文件。subPath 就会只覆盖这一个文件,而 mountPath 不在指定路径,需要指定文件

#>>> 文件内容
---
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pods
spec:
  containers:
  - image: registry.cn-hangzhou.aliyuncs.com/hujiaming/nginx:1.24.0
    name: nginx
    volumeMounts: 
    - name: nginxconf 
      mountPath: /etc/nginx/nginx.conf     #挂载路径
      subPath: nginx.conf      # 挂载文件名称  
      readOnly: true # 只读方式挂载  
  volumes:
  - name: nginxconf
    configMap:
      name: test-env
      items:                   # 修改挂载容器中文件的名称
      - key: nginxconf         # 原ConfigMap配置文件的名称
        path: nginx.conf       # 挂载容器后的名称
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐