)
1. Secret基础概念与核心价值Secret是Kubernetes中专门用于存储敏感信息的资源对象比如数据库密码、API密钥、TLS证书等。与ConfigMap不同Secret的内容默认会经过Base64编码注意编码不等于加密。在实际生产环境中我曾经遇到过开发者误将ConfigMap用于存储凭证的情况这就像把家门钥匙挂在门口一样危险。Secret的核心价值在于安全隔离将敏感数据与Pod定义、容器镜像解耦细粒度控制可以通过RBAC控制访问权限动态更新支持不重启Pod的情况下更新挂载的Secret环境变量方式除外举个例子我们团队曾经管理着一个包含300微服务的集群通过Secret统一管理所有服务的数据库凭证当需要轮换密码时只需更新Secret而无需重新部署服务。2. Secret类型详解与实战应用2.1 Opaque类型这是最常用的Secret类型适用于自定义的键值对数据。创建方式有两种# 命令行创建 echo -n admin username.txt echo -n S!B\*d$zDsb password.txt kubectl create secret generic db-creds \ --from-fileusernameusername.txt \ --from-filepasswordpassword.txt # YAML文件创建 apiVersion: v1 kind: Secret metadata: name: db-creds type: Opaque data: username: YWRtaW4 # echo -n admin | base64 password: UyFCKmQkenhEc2I9 # 注意特殊字符需要转义2.2 kubernetes.io/dockerconfigjson这是管理私有镜像仓库认证信息的专用类型。我们在生产环境中使用Harbor作为私有仓库时这样创建kubectl create secret docker-registry harbor-creds \ --docker-serverharbor.example.com \ --docker-usernamedevops \ --docker-passwordpssw0rd123 \ --docker-emailteamexample.com2.3 kubernetes.io/tls管理TLS证书的最佳选择。曾经我们在为Ingress配置HTTPS时这样使用openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout tls.key -out tls.crt -subj /CNexample.com kubectl create secret tls example-tls \ --certtls.crt --keytls.key2.4 其他内置类型service-account-tokenServiceAccount自动创建basic-authHTTP基本认证凭据ssh-authSSH密钥认证3. Secret安全最佳实践3.1 静态加密配置默认情况下Secret以明文存储在etcd中。我们需要启用静态加密创建加密配置文件encryption-config.yamlapiVersion: apiserver.config.k8s.io/v1 kind: EncryptionConfiguration resources: - resources: - secrets providers: - aescbc: keys: - name: key1 secret: base64-encoded-32-byte-key - identity: {} # 允许读取未加密的现有Secret修改API Server启动参数--encryption-provider-config/etc/kubernetes/encryption-config.yaml3.2 最小权限原则必须严格限制Secret的访问权限apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: production name: secret-reader rules: - apiGroups: [] resources: [secrets] resourceNames: [db-creds] verbs: [get]3.3 不可变SecretKubernetes 1.21支持将Secret标记为不可变防止意外修改apiVersion: v1 kind: Secret metadata: name: my-secret immutable: true data: token: base64-token4. Secret生命周期管理4.1 自动更新策略当使用Volume挂载方式时Secret更新会自动同步到Pod。我们曾经通过这个特性实现证书轮换更新Secretkubectl create secret tls updated-tls --certnew.crt --keynew.key \ --dry-runclient -o yaml | kubectl apply -f -观察Pod内文件变化约1分钟同步周期kubectl exec -it my-pod -- ls -l /etc/ssl/certs/4.2 优雅更新技巧对于需要重启才能生效的配置如环境变量可以采用以下方案版本化Secretkubectl create secret generic db-creds-v2 --from-literalpasswordnew-pass滚动更新Deployment引用新Secret4.3 清理策略删除不再使用的Secret时要注意# 检查引用关系 kubectl get pods --all-namespaces -o json | jq .items[] | select(.spec.volumes[]?.secret?.secretNameold-secret) # 安全删除 kubectl delete secret old-secret --cascadebackground5. 常见问题与解决方案5.1 大小限制问题Secret有1MB大小限制。对于大文件考虑分拆多个Secret使用专用存储方案如Vault5.2 特殊字符处理包含$,!等字符时需要转义# 创建包含特殊字符的Secret kubectl create secret generic special-chars \ --from-literalpasswordS!B\*d$zDsb5.3 调试技巧查看Secret内容kubectl get secret my-secret -o jsonpath{.data.password} | base64 -d检查挂载状态kubectl describe pod my-pod | grep -A5 Mounts6. 进阶场景与工具集成6.1 与Vault集成对于更高安全要求的场景我们使用Hashicorp Vault安装Vault Sidecar Injector配置注解自动注入annotations: vault.hashicorp.com/agent-inject: true vault.hashicorp.com/role: app-role vault.hashicorp.com/agent-inject-secret-db-creds: secret/data/database6.2 External Secrets Operator这个工具可以自动同步外部秘钥管理系统中的Secret到KubernetesapiVersion: external-secrets.io/v1beta1 kind: ExternalSecret metadata: name: production-db-creds spec: refreshInterval: 1h secretStoreRef: name: vault-backend kind: SecretStore target: name: db-creds data: - secretKey: password remoteRef: key: /secret/data/production/db property: password7. 监控与审计7.1 事件监控kubectl get events --watch --field-selector involvedObject.kindSecret7.2 审计日志配置在API Server配置中添加- level: Metadata resources: - group: resources: [secrets]8. 实战经验分享在管理大型集群时我们总结出这些经验命名规范用途-环境-v版本如redis-prod-creds-v1定期轮换建立证书和凭证的定期轮换机制备份策略使用Velero备份关键Secret跨集群同步使用Cluster API或ArgoCD同步多集群Secret曾经有一次我们因为未及时轮换过期的TLS证书导致生产环境中断。从那以后我们建立了完善的证书监控体系提前30天告警即将过期的证书。对于真正高敏感的场景建议结合服务网格如Istio的证书管理能力或者使用专用硬件安全模块HSM。这些方案虽然复杂但对于金融级应用是必要的。