Kubernetes Secrets 密钥管理
Kubernetes Secrets 密钥管理
什么是 Secret
Secret 是 Kubernetes 中用于存储和管理敏感信息(如密码、Token、证书)的 API 对象。Secret 以 Base64 编码存储,相比 ConfigMap 提供了更好的安全性。但请注意,Secret 只是编码而非加密,生产环境应结合加密方案使用。
创建 Secret
从字面值创建
kubectl create secret generic my-secret \
--from-literal=username=admin \
--from-literal=password=S3cr3tP@ss
从文件创建
# 从单个文件创建
kubectl create secret generic my-secret --from-file=./password.txt
# 从多个文件创建
kubectl create secret generic my-secret \
--from-file=username=./username.txt \
--from-file=password=./password.txt
TLS Secret
kubectl create secret tls my-tls \
--cert=tls.crt \
--key=tls.key
通过 YAML 文件创建
apiVersion: v1
kind: Secret
metadata:
name: my-secret
type: Opaque
data:
username: YWRtaW4= # echo -n 'admin' | base64
password: UzNjcjN0UEBzcyQ= # echo -n 'S3cr3tP@ss' | base64
# 生成 Base64 编码
echo -n 'admin' | base64
echo -n 'S3cr3tP@ss' | base64
Secret 的类型
Opaque(默认)
通用类型,存储任意键值对:
apiVersion: v1
kind: Secret
metadata:
name: generic-secret
type: Opaque
data:
key1: dmFsdWUx
key2: dmFsdWUy
kubernetes.io/tls
用于存储 TLS 证书:
apiVersion: v1
kind: Secret
metadata:
name: tls-secret
type: kubernetes.io/tls
data:
tls.crt: <base64-encoded-cert>
tls.key: <base64-encoded-key>
kubernetes.io/dockerconfigjson
用于存储 Docker Registry 凭据:
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=user \
--docker-password=password \
--docker-email=user@example.com
kubernetes.io/basic-auth
存储基本认证信息:
apiVersion: v1
kind: Secret
metadata:
name: basic-auth
type: kubernetes.io/basic-auth
data:
username: YWRtaW4=
password: UzNjcjN0UEBzcyQ=
使用 Secret
作为环境变量
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: my-secret
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: my-secret
key: password
envFrom:
- secretRef:
name: my-secret
作为文件挂载
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: my-app
volumeMounts:
- name: secret-volume
mountPath: /etc/secrets
volumes:
- name: secret-volume
secret:
secretName: my-secret
挂载单个 Secret Key
volumes:
- name: secret-volume
secret:
secretName: my-secret
items:
- key: password
path: db-password.txt
mode: 0400
查看 Secret
# 列出 Secret
kubectl get secret
# 查看 Secret 详情
kubectl describe secret my-secret
# 解码 Secret
kubectl get secret my-secret -o jsonpath='{.data.password}' | base64 -d
kubectl get secret my-secret -o jsonpath='{.data}' | jq -r 'to_entries[] | "\(.key)=\(.value | @base64d)"'
更新 Secret
# 编辑 Secret
kubectl edit secret my-secret
# 替换 Secret
kubectl create secret generic my-secret \
--from-literal=password=NewP@ssw0rd \
--dry-run=client -o yaml | kubectl apply -f -
在 Pod 中引用 Secret
使用 Secret 拉取镜像
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: registry.example.com/my-app:v1
imagePullSecrets:
- name: regcred
Secret 加密存储
启用静态加密
# 创建加密配置
cat > encryption-config.yaml <<EOF
apiVersion: apiserver.config.k8s.io/v1
kind: EncryptionConfiguration
resources:
- resources:
- secrets
providers:
- aescbc:
keys:
- name: key1
secret: <base64-encoded-secret>
- identity: {}
EOF
最佳实践
- 不要在 YAML 文件中存储明文敏感信息
- 使用 RBAC 限制 Secret 的访问权限
- 启用 etcd 静态加密
- 定期轮换 Secret
- 使用外部密钥管理系统(如 Vault)
总结
Secret 是 Kubernetes 中管理敏感信息的核心组件。正确使用 Secret 可以有效保护应用的敏感配置,但需要注意安全最佳实践,结合加密和访问控制来确保数据安全。