使用Secret分发凭据

企业应用部署时需管理数据库密码、API 密钥等敏感信息。若直接硬编码在代码中,将导致严重的安全风险和泄露隐患。保密字典(Secret)提供加密存储机制,实现敏感数据与应用代码的完全分离,避免因代码泄露引发安全事故。

选型参考

使用方式

特性

适用场景

数据卷挂载(推荐)

通过文件权限隔离,避免进程间暴露。文件内容自动同步。

推荐用于生产环境,尤其适合数据库密码、API 密钥等高敏感信息,需要细粒度文件权限控制的场景。

环境变量注入

环境变量易被所有进程访问,存在日志泄露风险。配置更新需要重启Pod才能生效。

简单快速的配置注入,适用于日志级别、服务地址的配置,或已适配环境变量的旧应用。

创建保密字典(Secret)

控制台

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择配置管理 > 保密字典

  3. 保密字典页面,选择所属命名空间(default)后,单击右上角的创建,在弹出面板中配置新的保密字典。

    • 名称:nginx-secret

    • 类型:Opaque

      • Opaque:base64编码格式的Secret,用来存储密码、证书等敏感信息。

      • 私有镜像仓库登录密钥,用于存储私有镜像仓库认证信息。

      • TLS证书,用于存储 TLS/SSL 证书与私钥。

    • 添加/删除密钥数据:

      • username:admin

      • password:'MySecurePassword!'

      • api-key:'ak-1234567890abcdef'

      若输入保密字典的明文数据,请选中对数据值进行base64编码

kubectl

  1. 通过kubectl工具连接集群

  2. 创建Secret。

    kubectl create secret generic nginx-secret \
      --from-literal=username=admin \
      --from-literal=password='MySecurePassword!' \
      --from-literal=api-key='ak-1234567890abcdef' \
      -n default
  3. 查看 Secret 相关信息。

    kubectl get secret nginx-secret

    预期输出:

    NAME           TYPE     DATA   AGE
    nginx-secret   Opaque   3      23h

使用保密字典(Secret)

使用保密字典时,Deployment 应用和保密字典必须位于同一命名空间内。

方式一:数据卷挂载

Secret通过文件挂载安全访问敏感数据(证书、私钥、配置文件),应用像访问本地文件一样读取。

控制台配置

  1. 创建Deployment应用。

    若已有Deployment应用,选择工作负载 > 无状态,按照以下示例编辑应用修改容器配置的数据卷。
    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    2. 创建无状态工作负载Deployment。

      1. 无状态页面,单击使用镜像创建

      2. 应用基本信息配置向导页面,设置应用的基本信息。然后单击下一步,进入容器配置向导页面。

        • 应用名称:nginx-volume-demo

        • 命名空间:default

        • 副本数量:2

        • 类型:无状态(Deployment)

      3. 容器配置。

        1. 容器配置页签,配置镜像名称端口

          • 镜像名:anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

          • 容器端口:80,协议为TCP。

          重要

          拉取此镜像前,集群需具备公网访问能力。若在创建集群时已勾选为专有网络配置 SNAT(默认开启),则无需额外配置。否则,请参见为集群开启访问公网的能力进行设置。

        2. 容器配置页签,在数据卷区域,单击增加本地存储

          • 存储卷类型保密字典

          • 名称secret-volume

          • 挂载源已创建的保密字典,如nginx-secret

          • 容器路径:指定挂载到容器内的这个路径,如/etc/nginx/secrets。

          配置好相应信息后,单击下一步

      4. 高级配置页面,按需设置访问、伸缩、调度和标签注解后,单击最下方的创建

      5. 创建完成页面,查看应用任务。

        创建应用任务已提交面板,单击查看应用详情查看容器状态是否为Running

  2. 验证Secret文件是否挂载成功。

    选择需要登录的容器(例如nginx-volume-demo-7xxxxxx****),单击操作列的终端,选择nginx登录容器。

    1. 验证Secret文件是否挂载成功。

      ls -la /etc/nginx/secrets

      预期输出:

      total 4
      drwxrwxrwt 3 root root  140 Sep 15 02:31 .
      drwxr-xr-x 1 root root 4096 Sep 15 02:31 ..
      drwxr-xr-x 2 root root  100 Sep 15 02:31 ..2025_09_15_02_31_13.2599431463
      lrwxrwxrwx 1 root root   32 Sep 15 02:31 ..data -> ..2025_09_15_02_31_13.2599431463
      lrwxrwxrwx 1 root root   18 Sep 15 02:31 api-key.txt -> ..data/api-key.txt
      lrwxrwxrwx 1 root root   22 Sep 15 02:31 db-password.txt -> ..data/db-password.txt
      lrwxrwxrwx 1 root root   22 Sep 15 02:31 db-username.txt -> ..data/db-username.txt
    2. 验证文件内容是否正确。

      cat /etc/nginx/secrets/db-username.txt
      cat /etc/nginx/secrets/api-key.txt

      预期输出:

      admin
      ak-1234567890abcdef

    输出内容与保密字典配置一致,表明数据卷挂载方式已成功使应用访问到 Secret 数据。

kubectl配置

  1. 创建nginx-volume-demo.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-volume-demo
      namespace: default
      labels:
        app: nginx-volume
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-volume
      template:
        metadata:
          labels:
            app: nginx-volume
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
              protocol: TCP
            # 挂载Secret卷
            volumeMounts:
            - name: secret-volume
              mountPath: /etc/nginx/secrets
              readOnly: true
          volumes:
          - name: secret-volume
            secret:
              secretName: nginx-secret
              # 设置文件权限
              defaultMode: 0644
              # 可选:自定义文件名映射
              items:
              - key: username
                path: db-username.txt
              - key: password  
                path: db-password.txt
              - key: api-key
                path: api-key.txt
    
  2. 创建Deployment应用,使用保密字典。

    kubectl apply -f nginx-volume-demo.yaml
  3. 查看Pod状态。

    kubectl get pods -l app=nginx-volume -n default

    预期输出:

    NAME                                 READY   STATUS    RESTARTS   AGE
    nginx-volume-demo-7db46895bc-c98b5   1/1     Running   0          4h20m
    nginx-volume-demo-7db46895bc-pc6qg   1/1     Running   0          4h20m
  4. 验证Secret文件是否挂载成功。

    kubectl exec deployment/nginx-volume-demo -n default -- ls -la /etc/nginx/secrets

    预期输出:

    total 4
    drwxrwxrwt 3 root root  140 Sep 15 02:31 .
    drwxr-xr-x 1 root root 4096 Sep 15 02:31 ..
    drwxr-xr-x 2 root root  100 Sep 15 02:31 ..2025_09_15_02_31_13.2599431463
    lrwxrwxrwx 1 root root   32 Sep 15 02:31 ..data -> ..2025_09_15_02_31_13.2599431463
    lrwxrwxrwx 1 root root   18 Sep 15 02:31 api-key.txt -> ..data/api-key.txt
    lrwxrwxrwx 1 root root   22 Sep 15 02:31 db-password.txt -> ..data/db-password.txt
    lrwxrwxrwx 1 root root   22 Sep 15 02:31 db-username.txt -> ..data/db-username.txt
  5. 验证文件内容是否正确。

    kubectl exec deployment/nginx-volume-demo -n default -- cat /etc/nginx/secrets/db-username.txt
    kubectl exec deployment/nginx-volume-demo -n default -- cat /etc/nginx/secrets/api-key.txt

    预期输出:

    admin
    ak-1234567890abcdef

    输出内容与保密字典配置一致,表明数据卷挂载方式已成功使应用访问到 Secret 数据。

方式二:环境变量注入

Secret通过环境变量安全注入敏感数据(密码、API密钥、Token),实现配置与代码分离,提高应用安全性和可移植性。

控制台配置

  1. 创建Deployment应用。

    若已有Deployment应用,选择工作负载 > 无状态,按照以下示例编辑应用修改容器配置的环境变量。
    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

    2. 创建无状态工作负载Deployment。

      1. 无状态页面,单击使用镜像创建

      2. 应用基本信息配置向导页面,设置应用的基本信息。然后单击下一步,进入容器配置向导页面。

        • 应用名称:nginx-env-demo

        • 命名空间:default

        • 副本数量:2

        • 类型:无状态(Deployment)

      3. 容器配置。

        1. 容器配置页签,配置镜像名称端口

          • 设置镜像名:anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6

          • 设置容器端口:80,协议为TCP

          重要

          拉取此镜像前,集群需具备公网访问能力。若在创建集群时已勾选为专有网络配置 SNAT(默认开启),则无需额外配置。否则,请参见为集群开启访问公网的能力进行设置。

        2. 容器配置页签,在环境变量区域,单击新增

          • 类型保密字典

          • 名称USERNAME

          • 变量/变量引用选择来源,已创建的保密字典(如nginx-secret),然后为其每个 key 指定对应的环境变量名。

          配置好相应信息后,单击下一步

      4. 高级配置页面,按需设置访问、伸缩、调度和标签注解后,单击最下方的创建

      5. 创建完成页面,查看应用任务。

        创建应用任务已提交面板,单击查看应用详情查看容器状态是否为Running

  2. 验证环境变量是否注入成功。

    选择需要登录的容器(例如nginx-env-demo-7xxxxxx****),单击操作列的终端,选择nginx登录容器。

    env | grep -E 'DB_|API_|NGINX_'

    预期输出:

    API_KEY=ak-1234567890abcdef
    NGINX_api-key=ak-1234567890abcdef
    NGINX_password=MySecurePassword!
    NGINX_username=admin
    DB_USERNAME=admin
    DB_PASSWORD=MySecurePassword!

    输出内容与保密字典配置一致,表明环境变量注入方式已成功使应用访问到 Secret 数据。

kubectl配置

  1. 创建nginx-env-demo.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-env-demo
      namespace: default
      labels:
        app: nginx-env
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx-env
      template:
        metadata:
          labels:
            app: nginx-env
        spec:
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            ports:
            - containerPort: 80
              protocol: TCP
            # 单个Secret键值注入
            env:
            - name: DB_USERNAME
              valueFrom:
                secretKeyRef:
                  name: nginx-secret
                  key: username
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: nginx-secret
                  key: password
            - name: API_KEY
              valueFrom:
                secretKeyRef:
                  name: nginx-secret
                  key: api-key
            # 批量注入所有Secret键值(可选)
            envFrom:
            - prefix: NGINX_
              secretRef:
                name: nginx-secret
    
  2. 创建Deployment应用,使用保密字典。

    kubectl apply -f nginx-env-demo.yaml
  3. 查看Pod状态.

    kubectl get pods -l app=nginx-env -n default

    预期输出:

    NAME                             READY   STATUS    RESTARTS   AGE
    nginx-env-demo-6dc7556d9-6pjhj   1/1     Running   0          3h33m
    nginx-env-demo-6dc7556d9-rcqsh   1/1     Running   0          3h33m
  4. 验证环境变量是否注入成功。

    kubectl exec deployment/nginx-env-demo -n default -- env | grep -E 'DB_|API_|NGINX_'

    预期输出:

    API_KEY=ak-1234567890abcdef
    NGINX_api-key=ak-1234567890abcdef
    NGINX_password=MySecurePassword!
    NGINX_username=admin
    DB_USERNAME=admin
    DB_PASSWORD=MySecurePassword!

    输出内容与保密字典配置一致,表明环境变量注入方式已成功使应用访问到 Secret 数据。

管理保密字典(Secret)

保密字典创建完成后,可以在保密字典页面进行以下操作:

操作

说明

查看保密字典

单击目标保密字典名称,可查看该保密字典的基本信息和详细信息。

编辑保密字典

单击操作列的编辑,可修改该保密字典的信息。

重要

修改使用中的保密字典,可能导致应用服务中断。请谨慎操作。

删除保密字典

单击操作列的删除,可删除不需要的保密字典。

重要

集群创建时,在kube-system 和 kube-public 命名空间下自动生成的保密字典,请勿删除,如Service Account等。

相关文档