sealed-secrets与Azure AKS集成:微软云环境部署最佳实践
引言:解决AKS密钥管理的痛点
你是否还在为Azure Kubernetes Service(AKS)中的密钥安全发愁?作为微软云环境中最受欢迎的容器编排平台,AKS在简化容器部署的同时,也带来了密钥管理的挑战。Sealed Secrets作为Kubernetes生态中解决密钥安全的重要工具,能将敏感信息加密为SealedSecret资源,安全存储在代码仓库中,仅在目标集群内解密。本文将详细介绍如何在AKS环境中部署和优化Sealed Secrets,解决私有集群网络限制、RBAC权限配置、密钥自动轮换等核心问题,帮助你构建安全、合规的密钥管理流程。
读完本文你将掌握:
- AKS环境下Sealed Secrets的两种部署模式(Helm图表与无RBAC模式)
- 私有AKS集群的网络配置与证书管理方案
- 密钥自动轮换与灾难恢复策略
- 企业级最佳实践(权限最小化、监控告警、多环境隔离)
AKS环境准备与兼容性检查
环境要求与依赖项
| 组件 | 版本要求 | 说明 |
|---|---|---|
| Kubernetes | 1.16+ | AKS默认支持版本均满足 |
| Helm | 3.1.0+ | 用于Helm图表部署 |
| kubectl | 1.18+ | 与AKS集群版本匹配 |
| Azure CLI | 2.30.0+ | 用于AKS集群管理 |
AKS集群网络模式选择
Sealed Secrets控制器与kubeseal客户端的通信依赖集群网络配置,需根据AKS网络模式调整部署策略:
私有AKS集群注意事项:控制平面与节点池之间默认存在网络隔离,需参考GKE私有集群配置思路,创建允许控制平面访问节点8080端口的网络安全组规则:
# 获取AKS控制平面CIDR
AKS_CLUSTER_NAME=my-aks-cluster
RESOURCE_GROUP=my-resource-group
CONTROL_PLANE_CIDR=$(az aks show --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP --query "apiServerAccessProfile.authorizedIpRanges" -o tsv)
# 创建网络安全组规则允许控制平面访问8080端口
az network nsg rule create \
--name allow-sealed-secrets \
--nsg-name $NODE_POOL_NSG \
--resource-group $RESOURCE_GROUP \
--priority 100 \
--source-address-prefixes $CONTROL_PLANE_CIDR \
--destination-port-ranges 8080 \
--access Allow \
--protocol Tcp \
--direction Inbound
部署方案:Helm图表 vs 无RBAC模式
Helm图表部署(推荐生产环境)
Sealed Secrets官方Helm图表提供了完整的部署选项,支持自定义命名空间、资源限制、网络策略等AKS特定配置:
# 添加Helm仓库
helm repo add sealed-secrets https://bitnami-labs.github.io/sealed-secrets
# 创建专用命名空间
kubectl create namespace sealed-secrets
# 自定义values.yaml配置
cat > aks-values.yaml << EOF
namespace: sealed-secrets
rbac:
create: true
clusterRole: true
service:
type: ClusterIP
port: 8080
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 256Mi
nodeSelector:
agentpool: system-node-pool # 部署到系统节点池
EOF
# 部署Helm图表
helm install sealed-secrets sealed-secrets/sealed-secrets \
-n sealed-secrets \
-f aks-values.yaml
无RBAC模式部署(受限环境)
对于不支持RBAC的AKS环境(如早期版本或严格权限控制场景),可使用controller-norbac.yaml部署无RBAC权限的控制器:
# 克隆仓库
git clone https://gitcode.com/GitHub_Trending/se/sealed-secrets
cd sealed-secrets
# 生成无RBAC部署清单
CONTROLLER_IMAGE=bitnami/sealed-secrets-controller:0.31.0
jsonnet -J vendor_jsonnet controller-norbac.jsonnet > controller-norbac.yaml
# 部署到AKS集群
kubectl apply -f controller-norbac.yaml -n kube-system
无RBAC模式限制:控制器将使用默认服务账户,需确保该账户具有足够权限,或手动创建角色绑定:
# 手动创建最小权限角色(示例)
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: sealed-secrets-minimal
namespace: kube-system
rules:
- apiGroups: ["bitnami.com"]
resources: ["sealedsecrets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
密钥管理与证书配置
AKS环境证书获取策略
Sealed Secrets依赖非对称加密密钥对,在AKS中有三种证书管理方案:
| 方案 | 适用场景 | 安全级别 | 操作复杂度 |
|---|---|---|---|
| 自动生成 | 开发/测试环境 | 中 | 低 |
| 自定义证书 | 生产环境 | 高 | 中 |
| Azure Key Vault集成 | 企业级环境 | 最高 | 高 |
自动生成证书:控制器部署时自动创建密钥对,证书有效期默认10年,30天自动轮换:
# 查看自动生成的密钥
kubectl get secret -n sealed-secrets sealed-secrets-key -o yaml
# 提取公钥证书
kubectl get secret -n sealed-secrets sealed-secrets-key -o jsonpath='{.data.tls\.crt}' | base64 -d > aks-sealed-secrets.crt
离线密封配置:对于私有AKS集群,kubeseal无法直接访问控制器获取证书,需提前导出证书并离线使用:
# 从控制器日志提取证书(私有集群场景)
kubectl logs -n sealed-secrets deployment/sealed-secrets-controller | grep "Certificate is" | awk '{print $3}' | base64 -d > aks-sealed-secrets.crt
# 使用离线证书密封密钥
echo -n "AKS_DB_PASSWORD" | kubectl create secret generic db-creds --dry-run=client --from-file=password=/dev/stdin -o json \
| kubeseal --cert=aks-sealed-secrets.crt \
> sealed-db-creds.json
Azure Key Vault集成方案
通过外部密钥管理集成,将Sealed Secrets私钥存储在Azure Key Vault中,提升密钥安全性:
实现步骤:
- 在Azure Key Vault中创建密钥:
az keyvault key create --vault-name my-aks-kv --name sealed-secrets-key --kty RSA --size 4096
- 使用Azure AD Pod Identity配置控制器访问Key Vault:
# 部署Azure AD Pod Identity(简化配置)
apiVersion: aadpodidentity.k8s.io/v1
kind: AzureIdentity
metadata:
name: sealed-secrets-identity
namespace: sealed-secrets
spec:
type: 0
resourceID: /subscriptions/<subid>/resourcegroups/<rg>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/sealed-secrets-mi
clientID: <clientid>
- 配置控制器使用外部密钥:
helm upgrade sealed-secrets sealed-secrets/sealed-secrets \
--set secretName=azure-kv-secret \
--set args="--key-vault-uri=https://my-aks-kv.vault.azure.net"
实战操作:从密封到部署
完整工作流示例
以下是在AKS环境中使用Sealed Secrets的标准流程:
- 创建原始密钥:
# 创建包含数据库凭证的临时Secret
cat > secret.yaml << EOF
apiVersion: v1
kind: Secret
metadata:
name: db-credentials
namespace: app-namespace
type: Opaque
data:
username: YWRtaW4= # base64编码的"admin"
password: cGFzc3dvcmQxMjM= # base64编码的"password123"
EOF
- 密封密钥:
# 在线密封(公共集群)
kubeseal --controller-name sealed-secrets \
--controller-namespace sealed-secrets \
-f secret.yaml \
-o yaml > sealed-secret.yaml
# 离线密封(私有集群)
kubeseal --cert=aks-sealed-secrets.crt \
-f secret.yaml \
--scope cluster-wide \ # 允许跨命名空间使用
-o yaml > sealed-secret.yaml
- 部署到AKS:
# 创建应用命名空间
kubectl create namespace app-namespace
# 部署SealedSecret
kubectl apply -f sealed-secret.yaml -n app-namespace
# 验证Secret自动创建
kubectl get secret db-credentials -n app-namespace
- 在应用中使用:
# 部署使用密钥的Pod
apiVersion: v1
kind: Pod
metadata:
name: app-pod
namespace: app-namespace
spec:
containers:
- name: app
image: my-app:latest
env:
- name: DB_USERNAME
valueFrom:
secretKeyRef:
name: db-credentials
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-credentials
key: password
高级模板应用
使用SealedSecret的template字段自定义生成的Secret属性,满足AKS环境中的特定需求:
apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
name: azure-sql-creds
namespace: app-namespace
spec:
encryptedData:
password: AgBy3i4OJSWK+PiTySYZZA9rO43cGDEq...
template:
type: kubernetes.io/basic-auth
metadata:
annotations:
azure.keyvault.enabled: "true" # 与Azure Key Vault CSI驱动集成
azure.keyvault.secret-name: "sql-password"
labels:
managed-by: sealed-secrets
environment: production
data:
username: YWRtaW4= # 非敏感数据可直接嵌入
监控、告警与灾难恢复
AKS集成监控方案
结合Azure Monitor与Prometheus监控Sealed Secrets控制器状态:
# values.yaml中启用ServiceMonitor
metrics:
serviceMonitor:
enabled: true
namespace: monitoring
labels:
release: prometheus
interval: 15s
scrapeTimeout: 5s
关键监控指标:
| 指标名称 | 描述 | 告警阈值 |
|---|---|---|
| sealed_secrets_controller_unseal_success_total | 成功解密次数 | 下降趋势 |
| sealed_secrets_controller_unseal_errors_total | 解密错误次数 | >0持续5分钟 |
| sealed_secrets_controller_key_age_seconds | 密钥年龄 | >2592000(30天) |
Azure Monitor告警规则:
az monitor metrics alert create \
--name sealed-secrets-errors \
--resource-group $RESOURCE_GROUP \
--scopes $(az aks show --name $AKS_CLUSTER_NAME --resource-group $RESOURCE_GROUP --query id -o tsv) \
--metric "unseal_errors" \
--namespace "sealed_secrets" \
--condition "count > 0 for 5m" \
--severity 2 \
--action $(az monitor action-group show --name aks-alerts --resource-group $RESOURCE_GROUP --query id -o tsv)
灾难恢复策略
AKS环境中Sealed Secrets的灾难恢复需关注两个层面:
- 控制器密钥备份:
# 备份加密密钥
kubectl get secret -n sealed-secrets sealed-secrets-key -o yaml > sealed-secrets-key-backup.yaml
# 存储到Azure Blob Storage
az storage blob upload \
--account-name $STORAGE_ACCOUNT \
--container-name backups \
--name sealed-secrets-key.yaml \
--file sealed-secrets-key-backup.yaml \
--auth-mode login
- 跨集群迁移:
# 导出公钥
kubeseal --fetch-cert > sealed-secrets-cert.pem
# 在新AKS集群导入密钥
kubectl create secret generic sealed-secrets-key \
--from-file=tls.crt=sealed-secrets-cert.pem \
--from-file=tls.key=sealed-secrets-key.pem \
-n sealed-secrets
密钥轮换最佳实践:
- 每90天手动轮换一次密封密钥
- 使用
--key-cutoff-time参数提前生成新密钥 - 轮换前确保所有SealedSecret使用新密钥重新加密
# 提前生成新密钥
kubectl patch deployment sealed-secrets-controller \
-n sealed-secrets \
--type json \
-p '[{"op":"add","path":"/spec/template/spec/containers/0/args","value":["--key-cutoff-time","2025-12-31T23:59:59Z"]}]'
企业级最佳实践与优化
AKS多环境隔离策略
使用Sealed Secrets的作用域(Scopes)功能实现多环境隔离:
环境隔离配置示例:
# 开发环境:namespace-wide作用域
kubeseal --scope namespace-wide \
-f dev-secret.yaml \
-o yaml > dev-sealed-secret.yaml
# 生产环境:strict作用域
kubeseal --scope strict \
-f prod-secret.yaml \
-o yaml > prod-sealed-secret.yaml
安全加固措施
针对AKS环境的安全加固建议:
- 最小权限原则:
# Helm values配置最小权限
rbac:
create: true
clusterRole: false # 禁用集群级角色
namespacedRoles: true
additionalNamespaces:
- app-prod
- app-staging
- 网络策略限制:
# 配置网络策略仅允许控制器通信
networkPolicy:
enabled: true
egress:
enabled: true
kubeapiCidr: 10.0.0.0/16 # AKS API服务器CIDR
kubeapiPort: 443
- 镜像安全:
# 使用Azure Container Registry私有镜像
image:
registry: myacr.azurecr.io
repository: sealed-secrets-controller
tag: 0.31.0
pullPolicy: Always
pullSecrets:
- name: acr-pull-secret
常见问题与解决方案
AKS环境特有问题排查
问题1:私有集群中kubeseal无法获取证书
# 解决方案:从控制器日志提取证书
kubectl logs -n sealed-secrets deployment/sealed-secrets-controller | grep "Certificate is" | awk '{print $3}' | base64 -d > cert.pem
# 离线密封
kubeseal --cert cert.pem -f secret.yaml -o sealed-secret.yaml
问题2:密钥轮换后旧SealedSecret无法解密
# 解决方案:使用新密钥重新加密
kubeseal --fetch-cert > new-cert.pem
kubeseal --cert new-cert.pem --merge-into existing-sealed-secret.yaml
问题3:Helm升级失败提示CRD冲突
# 解决方案:先升级CRD
kubectl apply -f https://raw.githubusercontent.com/bitnami-labs/sealed-secrets/main/helm/sealed-secrets/crds/bitnami.com_sealedsecrets.yaml
# 再升级Helm图表
helm upgrade sealed-secrets sealed-secrets/sealed-secrets
性能优化建议
在大型AKS集群中优化Sealed Secrets性能:
- 资源配置:
resources:
limits:
cpu: 1000m
memory: 512Mi
requests:
cpu: 200m
memory: 128Mi
- 调整密钥轮换周期:
keyrenewperiod: "168h" # 7天轮换一次
keyttl: "8760h" # 1年有效期
- 禁用状态更新:
updateStatus: false # 减少API服务器请求
总结与展望
Sealed Secrets为AKS环境提供了安全、便捷的密钥管理方案,通过本文介绍的部署策略、密钥管理和最佳实践,你可以构建企业级的密钥安全体系。关键要点包括:
- 根据AKS网络模式选择合适的部署方案(公共/私有集群配置)
- 生产环境推荐使用自定义证书或Azure Key Vault集成
- 实施严格的权限控制和网络隔离
- 建立完善的监控告警和灾难恢复机制
随着Azure云原生生态的发展,未来Sealed Secrets可能会进一步集成Azure服务,如Azure Policy强制密钥轮换、Azure Log Analytics深度监控等。建议关注项目GitHub仓库获取最新更新,并参与社区讨论分享AKS使用经验。
下一步行动清单:
- 在测试AKS集群部署Sealed Secrets Helm图表
- 配置离线密封流程适配私有集群环境
- 实施密钥备份与灾难恢复策略
- 集成Azure Monitor监控关键指标
- 制定密钥轮换计划与操作手册
通过这些步骤,你将在AKS环境中建立起安全、可靠的密钥管理基础设施,为容器化应用提供坚实的安全保障。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



