配置 Secrets

目录

理解 Secrets

在 Kubernetes (k8s) 中,Secret 是一个基本对象,旨在存储和管理敏感信息,例如密码、OAuth 令牌、SSH 密钥、TLS 证书和 API 密钥。其主要目的是防止敏感数据直接嵌入 Pod 定义或容器镜像中,从而增强安全性和可移植性。

Secrets 类似于 ConfigMaps,但专门用于机密数据。它们通常经过 base64 编码以便存储,并可以通过多种方式被 Pods 消费,包括作为卷挂载或作为环境变量暴露。

使用特性

  • 增强安全性:与明文配置映射(Kubernetes ConfigMap)相比,Secrets 通过使用 Base64 编码存储敏感信息,提供了更好的安全性。此机制结合 Kubernetes 的访问控制能力,显著降低了数据暴露的风险。

  • 灵活性和管理:使用 Secrets 提供了一种比将敏感信息硬编码到 Pod 定义文件或容器镜像中更安全、更灵活的方法。这种分离简化了敏感数据的管理和修改,无需更改应用程序代码或容器镜像。

支持的类型

Kubernetes 支持多种类型的 Secrets,每种类型都针对特定用例。平台通常支持以下类型:

  • Opaque:一种通用的 Secret 类型,用于存储任意键值对的敏感数据,例如密码或 API 密钥。

  • TLS:专门用于存储 TLS(传输层安全)协议证书和私钥信息,通常用于 HTTPS 通信和安全的入口。

  • SSH Key:用于存储 SSH 私钥,通常用于安全访问 Git 仓库或其他支持 SSH 的服务。

  • SSH Authentication (kubernetes.io/ssh-auth):存储通过 SSH 协议传输的数据的认证信息。

  • Username/Password (kubernetes.io/basic-auth):用于存储基本认证凭证(用户名和密码)。

  • Image Pull Secret (kubernetes.io/dockerconfigjson):存储从私有镜像仓库(Docker Registry)拉取容器镜像所需的 JSON 认证字符串。

使用方法

Secrets 可以通过不同的方法被应用程序在 Pods 中消费:

  • 作为环境变量:可以将 Secret 中的敏感数据直接注入到容器的环境变量中。

  • 作为挂载文件(卷):Secrets 可以作为文件挂载到 Pod 的卷中,允许应用程序从指定的文件路径读取敏感数据。

注意:工作负载中的 Pod 实例只能引用同一命名空间内的 Secrets。有关高级用法和 YAML 配置,请参阅 Kubernetes 官方文档

创建 Opaque 类型 Secret

kubectl create secret generic my-secret \
  --from-literal=username=admin \
  --from-literal=password=Pa$$w0rd

YAML

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
type: Opaque
data:
  username: YWRtaW4= # base64 编码的 "admin"
  password: UGEkJHcwcmQ= # base64 编码的 "Pa$$w0rd"

您可以通过以下方式解码:

echo YWRtaW4= | base64 --decode  # 输出: admin

创建 Docker 注册表类型 Secret

kubectl create secret docker-registry my-docker-creds \
  --docker-username=myuser \
  --docker-password=mypass \
  --docker-server=https://index.docker.io/v1/ \
  --docker-email=my@example.com

YAML

apiVersion: v1
kind: Secret
metadata:
  name: my-docker-creds
type: kubernetes.io/dockerconfigjson
data:
  .dockerconfigjson: eyJhdXRocyI6eyJodHRwczovL2luZGV4LmRvY2tlci5pby92MS8iOnsidXNlcm5hbWUiOiJteXVzZXIiLCJwYXNzd29yZCI6Im15cGFzcyIsImVtYWlsIjoibXlAZXhhbXBsZS5jb20iLCJhdXRoIjoiYlhsMWMyVnlPbTE1Y0dGemN3PT0ifX19

K8s 会自动将您的用户名、密码、电子邮件和服务器信息转换为 Docker 标准登录格式:

{
  "auths": {
    "https://index.docker.io/v1/": {
      "username": "myuser",
      "password": "mypass",
      "email": "my@example.com",
      "auth": "bXl1c2VyOm15cGFzcw=="  # base64(username:password)
    }
  }
}

此 JSON 随后被 base64 编码并用作 Secret 的数据字段值。

在 Pod 中使用它:

imagePullSecrets:
  - name: my-docker-creds

创建 Basic Auth 类型 Secret

apiVersion: v1
kind: Secret
metadata:
  name: basic-auth-secret
type: kubernetes.io/basic-auth
stringData:
  username: myuser
  password: mypass

创建 SSH-Auth 类型 Secret

用例:存储 SSH 私钥(例如,用于 Git 访问)。

apiVersion: v1
kind: Secret
metadata:
  name: ssh-key-secret
type: kubernetes.io/ssh-auth
stringData:
  ssh-privatekey: |
    -----BEGIN OPENSSH PRIVATE KEY-----
    ...
    -----END OPENSSH PRIVATE KEY-----

创建 TLS 类型 Secret

用例:TLS 证书(用于 Ingress、webhooks 等)

kubectl create secret tls tls-secret \
--cert=path/to/tls.crt \
--key=path/to/tls.key

YAML

apiVersion: v1
kind: Secret
metadata:
  name: tls-secret
type: kubernetes.io/tls
data:
  tls.crt: <base64>
  tls.key: <base64>

通过 Web 控制台创建 Secret

  1. 进入 Container Platform

  2. 在左侧导航栏中,单击 配置 > Secrets

  3. 单击 创建 Secret

  4. 配置参数。

    提示:在表单视图中,对于输入的用户名、密码等敏感数据,将自动经过 Base64 编码格式转换后储存到 Secret 中,转换后的数据可在 YAML 视图中预览。

  5. 单击 创建

如何在 Pod 中使用 Secret

作为环境变量

env:
  - name: DB_USERNAME
    valueFrom:
      secretKeyRef:
        name: my-secret
        key: username

从名为 my-secret 的 Secret 中获取键为 username 的值,并将其分配给环境变量 DB_USERNAME

作为挂载文件(卷)

volumes:
  - name: secret-volume
    secret:
      secretName: my-secret

volumeMounts:
  - name: secret-volume
    mountPath: "/etc/secret"

后续操作

在同一命名空间中,为原生应用创建工作负载时,可以引用已经创建的 Secrets。

相关操作

您可以在列表页面单击右侧的 (⋮) 或在详情页面单击右上角的 操作,按需更新或删除 Secret。

操作说明
更新添加或更新一个 Secret 后,已经通过环境变量引用该 Secret(或其配置项)的工作负载需要重建 Pods,新的配置才能生效。
删除
  • 删除 Secret 后,已经通过环境变量引用该 Secret(或其配置项)的工作负载,重建 Pods 时可能会因找不到引用源而受到影响。
  • 请不要删除平台自动生成的 Secrets,否则可能导致平台功能无法正常使用。例如:类型为 service-account-token 且包含命名空间资源的认证信息的 Secrets,以及系统命名空间(如 kube-system)中的 Secrets。