Configuring Secrets
目录
理解 Secrets
在 Kubernetes (k8s) 中,Secret 是一个用于存储和管理敏感信息的基础对象,例如密码、OAuth 令牌、SSH 密钥、TLS 证书和 API 密钥。其主要目的是防止敏感数据直接嵌入 Pod 定义或容器镜像中,从而增强安全性和可移植性。
Secrets 类似于 ConfigMaps,但专门用于机密数据。它们通常以 base64 编码的形式存储,并可以通过多种方式被 Pod 使用,包括挂载为卷或作为环境变量暴露。
使用特点
支持的类型
Kubernetes 支持多种类型的 Secrets,针对不同使用场景设计。平台通常支持以下类型:
-
Opaque:通用 Secret 类型,用于存储任意键值对的敏感数据,如密码或 API 密钥。
-
TLS:专门用于存储 TLS(传输层安全)协议的证书和私钥信息,常用于 HTTPS 通信和安全的 ingress。
-
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 可以通过不同方式被 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 registry 类型的 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 的 data 字段值。
在 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
-
进入 Container Platform。
-
在左侧导航栏点击 Configuration > Secrets。
-
点击 Create Secret。
-
配置参数。
注意:在表单视图中,输入的用户名和密码等敏感数据会自动以 Base64 格式编码后存储到 Secret 中。转换后的数据可在 YAML 视图中预览。
-
点击 Create。
如何在 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。
操作
你可以点击列表页右侧的 (⋮) 或详情页右上角的 Actions,根据需要更新或删除 Secret。
操作 | 描述 |
---|
更新 | 添加或更新 Secret 后,已通过环境变量引用该 Secret(或其配置项)的工作负载需要重建 Pod,才能使新配置生效。 |
删除 | - 删除 Secret 后,已通过环境变量引用该 Secret(或其配置项)的工作负载在重建 Pod 时可能因找不到引用源而受到影响。
- 请勿删除平台自动生成的 Secrets,否则可能导致平台无法正常运行。例如:包含命名空间资源认证信息的 service-account-token 类型 Secrets 以及系统命名空间(如 kube-system)中的 Secrets。
|