k8s~secret资源的使用
Kubernetes Secret 资源使用详解
1. Secret 基本概念
Secret 是 Kubernetes 中用于存储敏感信息的资源对象,如密码、OAuth 令牌、SSH 密钥等。与 ConfigMap 类似,但 Secret 的数据是经过 base64 编码存储的。
2. Secret 类型
2.1 内置类型
- Opaque:默认类型,存储任意用户定义的数据
- kubernetes.io/service-account-token:服务账号令牌
- kubernetes.io/dockerconfigjson:Docker 镜像仓库的认证信息
- kubernetes.io/tls:TLS 证书和私钥
- bootstrap.kubernetes.io/token:启动引导令牌
3. 创建 Secret 的方法
3.1 通过 kubectl 命令行创建
# 从文件创建
kubectl create secret generic db-secret \
--from-literal=username=admin \
--from-literal=password=secret123
# 从文件内容创建
kubectl create secret generic ssh-key-secret \
--from-file=id_rsa=~/.ssh/id_rsa \
--from-file=id_rsa.pub=~/.ssh/id_rsa.pub
# 创建 Docker registry secret
kubectl create secret docker-registry regcred \
--docker-server=registry.example.com \
--docker-username=admin \
--docker-password=secret \
--docker-email=admin@example.com
3.2 通过 YAML 文件创建
# secret-demo.yaml
apiVersion: v1
kind: Secret
metadata:
name: app-secret
type: Opaque
data:
username: YWRtaW4= # base64编码的 "admin"
password: c2VjcmV0MTIz
# 应用YAML文件
kubectl apply -f secret-demo.yaml
4. Secret 在 Pod 中的使用方式
4.1 作为环境变量
apiVersion: v1
kind: Pod
metadata:
name: secret-env-pod
spec:
containers:
- name: myapp
image: nginx
env:
- name: SECRET_USERNAME
valueFrom:
secretKeyRef:
name: app-secret
key: username
- name: SECRET_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: password
4.2 挂载为文件(推荐方式)
apiVersion: v1
kind: Pod
metadata:
name: secret-volume-pod
spec:
containers:
- name: myapp
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
readOnly: true
volumes:
- name: secret-volume
secret:
secretName: app-secret
items: # 可选:选择性挂载特定key
- key: username
path: my-username
- key: password
path: my-password
4.3 拉取私有镜像
apiVersion: v1
kind: Pod
metadata:
name: private-reg-pod
spec:
containers:
- name: private-app
image: registry.example.com/private-app:v1
imagePullSecrets:
- name: regcred
5. 高级使用技巧
5.1 自动挂载为文件
apiVersion: v1
kind: Pod
metadata:
name: secret-automount
spec:
containers:
- name: myapp
image: nginx
volumeMounts:
- name: secret-volume
mountPath: "/etc/secrets"
volumes:
- name: secret-volume
secret:
secretName: app-secret
defaultMode: 0400 # 设置文件权限
5.2 使用 stringData 字段(自动base64编码)
apiVersion: v1
kind: Secret
metadata:
name: stringdata-secret
type: Opaque
stringData: # 无需手动base64编码
username: admin
password: secret123
config.yaml: |
database:
host: localhost
port: 3306
5.3 从多个 Secret 组合
apiVersion: v1
kind: Pod
metadata:
name: multiple-secrets
spec:
containers:
- name: myapp
image: nginx
env:
- name: DB_CONFIG
valueFrom:
configMapKeyRef:
name: db-config
key: connection-string
envFrom:
- secretRef:
name: credentials-secret
volumes:
- name: secrets-vol
secret:
secretName: tls-secret
6. 管理操作
6.1 查看 Secret
# 列出所有 Secret
kubectl get secrets
# 查看详细信息
kubectl describe secret app-secret
# 解码查看内容
kubectl get secret app-secret -o jsonpath='{.data.username}' | base64 --decode
6.2 更新 Secret
# 方法1:编辑现有 Secret
kubectl edit secret app-secret
# 方法2:通过文件更新
kubectl apply -f updated-secret.yaml
6.3 删除 Secret
kubectl delete secret app-secret
7. 最佳实践和安全建议
7.1 安全最佳实践
-
加密存储:
# 启用 etcd 加密 kubectl create secret generic test-secret \ --from-literal=mykey=mydata \ --namespace default -
RBAC 权限控制:
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: default name: secret-reader rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "watch", "list"] -
使用外部 Secret 管理:
- HashiCorp Vault
- AWS Secrets Manager
- Azure Key Vault
- Google Cloud Secret Manager
7.2 使用建议
-
生命周期管理:
# 为 Secret 添加标签便于管理 apiVersion: v1 kind: Secret metadata: name: app-secret labels: app: myapp tier: backend environment: production type: Opaque data: password: c2VjcmV0 -
定期轮换:
# 自动轮换示例脚本 #!/bin/bash NEW_PASSWORD=$(openssl rand -base64 32) kubectl patch secret app-secret \ -p "{\"data\":{\"password\":\"$(echo -n $NEW_PASSWORD | base64)\"}}"
8. 注意事项
- Base64 不是加密:Secret 仅提供 base64 编码,不是加密
- etcd 安全性:确保 etcd 集群的安全性
- 访问权限:严格控制对 Secret 的 RBAC 权限
- 日志泄露:避免在日志中输出 Secret 内容
- Secret 大小限制:单个 Secret 最大 1MB
9. 故障排查
# 检查 Secret 是否被挂载
kubectl exec pod-name -- ls /etc/secrets
# 检查环境变量
kubectl exec pod-name -- env | grep SECRET
# 查看 Pod 事件
kubectl describe pod pod-name
# 验证 Secret 存在
kubectl get secret secret-name
通过合理使用 Secret 资源,可以有效管理 Kubernetes 集群中的敏感信息,提高应用程序的安全性。建议结合具体的业务场景选择合适的 Secret 类型和使用方式。
浙公网安备 33010602011771号