Kubernetes-Secret
Secret 是 Kubernetes 中用于存储和管理敏感信息的核心资源对象,专为密码、令牌、密钥等敏感数据设计。
Secret 基础概念
Secret 是 Kubernetes 中用于存储敏感信息的对象,与 ConfigMap 类似但专门设计用于敏感数据。其主要特点包括:
- 数据默认以 base64 编码存储(非加密)
- 可以通过卷或环境变量注入到 Pod 中
- 支持细粒度的访问控制
- 设计用于机密数据,而 ConfigMap 设计用于非机密数据
Secret 允许用户对如何使用敏感信息进行更多的控制,并减少信息意外暴露的风险。默认情况下,Secret 值被编码为 base64 字符串并以非加密的形式存储,但可以配置为静态加密(Encrypt at rest)。
Secret 的主要类型
Kubernetes 支持多种内置的 Secret 类型:
- Opaque:默认类型,用于存储任意用户定义的敏感数据(如密码、密钥等)
- kubernetes.io/service-account-token:用于自动为 Pod 提供访问 Kubernetes API 的凭据(与 ServiceAccount 相关)
- kubernetes.io/dockerconfigjson:用于存储 Docker 镜像仓库的认证信息(用于
docker pull鉴权) - kubernetes.io/tls:用于存储 TLS 证书和私钥(用于 HTTPS 服务)
- kubernetes.io/basic-auth:基本认证凭据
- kubernetes.io/ssh-auth:SSH 认证凭据
Secret 字段解析
apiVersion
- 固定值为
v1,表示使用 Kubernetes 核心 API 版本 - 示例:
apiVersion: v1
kind
- 固定值为
Secret,标识资源类型 - 示例:
kind: Secret
metadata
包含资源的元数据信息:
name: Secret 名称(DNS 子域名格式)namespace: 所属命名空间labels: 标签用于资源分类annotations: 注解用于附加非标识性信息- 示例:yaml
metadata: name: db-credentials namespace: production labels: app: mysql annotations: created-by: "admin"
- 示例:
type
定义 Secret 的类型,常见值包括:
Opaque: 默认类型,存储任意用户定义数据kubernetes.io/tls: 存储 TLS 证书和私钥kubernetes.io/dockerconfigjson: 存储 Docker 仓库认证信息kubernetes.io/service-account-token: 服务账号令牌
data
- 存储 base64 编码的键值对数据
- 键名必须由字母、数字、
-、_或.组成 - 示例:yaml
data: username: YWRtaW4= # "admin"的base64编码 password: MWYyZDFlMmU2N2Rm # "1f2d1e2e67df"的base64编码
stringData
- 存储未编码的原始字符串(写入时自动进行 base64 编码)
- 与 data 字段共存时,stringData 优先级更高
- 适合直接写入多行文本内容(如证书文件)
- 示例:yaml
stringData: config.yaml: | apiUrl: "https://api.example.com" username: admin password: P@ssw0rd
immutable (布尔值)
- 设置为
true时使 Secret 不可修改(Kubernetes 1.19+) - 不可变 Secret 能减少 API 服务器负载
- 修改需先删除后重建
- 示例:
immutable: true
TLS 类型 Secret
yaml
type: kubernetes.io/tls
data:
tls.crt: <base64编码的证书>
tls.key: <base64编码的私钥>Docker 注册表认证 Secret
yaml
type: kubernetes.io/dockerconfigjson
data:
.dockerconfigjson: <base64编码的docker配置>创建 Secret 的方法
通过 YAML 清单文件创建
首先将敏感数据转换为 base64 编码:
bash
echo -n 'admin' | base64 # 输出: YWRtaW4=
echo -n 'admin321' | base64 # 输出: YWRtaW4zMjE=然后创建 Secret 定义文件:
yaml
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
username: YWRtaW4=
password: YWRtaW4zMjE=应用这个配置:
bash
kubectl apply -f secret.yaml使用 kubectl 命令直接创建
更简单的方式是直接使用 kubectl 命令:
bash
kubectl create secret generic mysecret \
--from-literal='username=admin' \
--from-literal='password=admin321'或者从文件创建:
bash
echo -n 'admin' > username.txt
echo -n 'admin321' > password.txt
kubectl create secret generic mysecret \
--from-file=username=./username.txt \
--from-file=password=./password.txt创建 Docker 仓库认证 Secret
bash
kubectl create secret docker-registry myregistry \
--docker-server=DOCKER_SERVER \
--docker-username=DOCKER_USER \
--docker-password=DOCKER_PASSWORD \
--docker-email=DOCKER_EMAIL在 Pod 中使用 Secret
作为环境变量注入
yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: mycontainer
image: redis
env:
- name: SECRET_USERNAME # 自定义变量名
valueFrom:
secretKeyRef: # 引用secret资源
name: mysecret # secret名字
key: username # secret中定义的变量名
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: mysecret
key: password作为卷挂载
yaml
apiVersion: v1
kind: Pod
metadata:
name: secret-vol-pod
spec:
containers:
- name: mycontainer
image: redis
volumeMounts:
- name: foo
mountPath: "/etc/foo"
readOnly: true
volumes:
- name: foo
secret:
secretName: mysecret
items:
- key: username
path: my-group/my-username用于拉取私有镜像
yaml
apiVersion: v1
kind: Pod
metadata:
name: private-reg
spec:
containers:
- name: private-reg-container
image: private.registry.com/image
imagePullSecrets:
- name: regcred常用命令参考
bash
# 查看 Secret
kubectl get secrets
kubectl describe secret mysecret
# 解码 Secret
kubectl get secret mysecret -o jsonpath='{.data.username}' | base64 --decode
# 更新 Secret
kubectl create secret generic db-secret \
--from-literal=username=newuser \
--from-literal=password=newpass \
--dry-run=client -o yaml | kubectl apply -f -
# 删除 Secret
kubectl delete secret mysecret通过合理使用 Kubernetes Secret,可以有效地保护敏感数据,同时保持应用配置的灵活性。在实际生产环境中,建议结合 RBAC 和网络策略等安全机制,构建全面的敏感数据保护体系。
