在GKE集群上部署Sealed-Secrets的完整指南
2025-07-07 01:42:03作者:郁楠烈Hubert
前言
Sealed-Secrets是一个Kubernetes控制器/操作符,用于将加密的Secret转换为Kubernetes原生Secret。本文将详细介绍如何在Google Kubernetes Engine(GKE)上部署和使用Sealed-Secrets,特别是针对私有GKE集群的特殊配置。
基础安装
在GKE集群上安装Sealed-Secrets前,如果你没有集群管理员权限,需要先创建ClusterRoleBinding:
USER_EMAIL=your-email@example.com
kubectl create clusterrolebinding $USER-cluster-admin-binding \
--clusterrole=cluster-admin \
--user=$USER_EMAIL
这个绑定将为你提供必要的集群管理员权限来部署Sealed-Secrets控制器。
私有GKE集群的特殊配置
私有GKE集群有一个防火墙阻止控制平面直接与节点通信,这会导致kubeseal
无法从控制器获取公钥。我们有两种解决方案:
方案一:离线密封
-
获取公钥证书: 由于防火墙阻止直接获取证书,你需要从控制器日志中复制证书内容。
-
保存证书: 将日志中的证书内容保存为cert.pem文件
-
使用离线模式密封Secret:
kubeseal --cert=cert.pem <secret.yaml >sealed-secret.yaml
方案二:配置防火墙规则
此方案允许控制平面与节点通信,需要创建特定的防火墙规则:
-
设置环境变量:
CLUSTER_NAME=your-cluster-name gcloud config set compute/zone your-zone-or-region
-
获取控制平面CIDR:
CP_IPV4_CIDR=$(gcloud container clusters describe $CLUSTER_NAME \ | grep "masterIpv4CidrBlock: " \ | awk '{print $2}')
-
获取网络信息:
NETWORK=$(gcloud container clusters describe $CLUSTER_NAME \ | grep "^network: " \ | awk '{print $2}')
-
获取网络目标标签:
NETWORK_TARGET_TAG=$(gcloud compute firewall-rules list \ --filter network=$NETWORK --format json \ | jq ".[] | select(.name | contains(\"$CLUSTER_NAME\"))" \ | jq -r '.targetTags[0]' | head -1)
-
创建Sealed-Secrets通信规则:
gcloud compute firewall-rules create gke-to-kubeseal-8080 \ --network "$NETWORK" \ --allow "tcp:8080" \ --source-ranges "$CP_IPV4_CIDR" \ --target-tags "$NETWORK_TARGET_TAG" \ --priority 1000
-
创建指标监控规则(可选):
gcloud compute firewall-rules create gke-to-metrics-8081 \ --network "$NETWORK" \ --allow "tcp:8081" \ --source-ranges "$CP_IPV4_CIDR" \ --target-tags "$NETWORK_TARGET_TAG" \ --priority 1000
最佳实践建议
-
安全考虑:
- 最小权限原则:仅授予必要的权限
- 定期轮换加密密钥
- 审计SealedSecret的使用情况
-
性能优化:
- 为Sealed-Secrets控制器配置适当的资源请求和限制
- 考虑在多区域集群中部署多个副本
-
监控与告警:
- 设置控制器健康状态监控
- 监控加密/解密操作失败情况
常见问题排查
-
权限问题:
- 确保ClusterRoleBinding正确配置
- 验证kubectl上下文是否正确
-
网络连接问题:
- 检查防火墙规则是否生效
- 验证控制平面CIDR是否正确
-
证书问题:
- 确保证书格式正确
- 检查证书是否过期
通过本文的指导,你应该能够在GKE集群上成功部署和使用Sealed-Secrets,即使在私有集群环境中也能正常工作。