sealed-secrets与Azure AKS集成:微软云环境部署最佳实践

sealed-secrets与Azure AKS集成:微软云环境部署最佳实践

【免费下载链接】sealed-secrets A Kubernetes controller and tool for one-way encrypted Secrets 【免费下载链接】sealed-secrets 项目地址: https://gitcode.com/GitHub_Trending/se/sealed-secrets

引言:解决AKS密钥管理的痛点

你是否还在为Azure Kubernetes Service(AKS)中的密钥安全发愁?作为微软云环境中最受欢迎的容器编排平台,AKS在简化容器部署的同时,也带来了密钥管理的挑战。Sealed Secrets作为Kubernetes生态中解决密钥安全的重要工具,能将敏感信息加密为SealedSecret资源,安全存储在代码仓库中,仅在目标集群内解密。本文将详细介绍如何在AKS环境中部署和优化Sealed Secrets,解决私有集群网络限制、RBAC权限配置、密钥自动轮换等核心问题,帮助你构建安全、合规的密钥管理流程。

读完本文你将掌握:

  • AKS环境下Sealed Secrets的两种部署模式(Helm图表与无RBAC模式)
  • 私有AKS集群的网络配置与证书管理方案
  • 密钥自动轮换与灾难恢复策略
  • 企业级最佳实践(权限最小化、监控告警、多环境隔离)

AKS环境准备与兼容性检查

环境要求与依赖项

组件版本要求说明
Kubernetes1.16+AKS默认支持版本均满足
Helm3.1.0+用于Helm图表部署
kubectl1.18+与AKS集群版本匹配
Azure CLI2.30.0+用于AKS集群管理

AKS集群网络模式选择

Sealed Secrets控制器与kubeseal客户端的通信依赖集群网络配置,需根据AKS网络模式调整部署策略:

mermaid

私有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中,提升密钥安全性:

mermaid

实现步骤

  1. 在Azure Key Vault中创建密钥:
az keyvault key create --vault-name my-aks-kv --name sealed-secrets-key --kty RSA --size 4096
  1. 使用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>
  1. 配置控制器使用外部密钥:
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的标准流程:

  1. 创建原始密钥
# 创建包含数据库凭证的临时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
  1. 密封密钥
# 在线密封(公共集群)
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
  1. 部署到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
  1. 在应用中使用
# 部署使用密钥的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的灾难恢复需关注两个层面:

  1. 控制器密钥备份
# 备份加密密钥
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
  1. 跨集群迁移
# 导出公钥
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)功能实现多环境隔离:

mermaid

环境隔离配置示例

# 开发环境: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环境的安全加固建议:

  1. 最小权限原则
# Helm values配置最小权限
rbac:
  create: true
  clusterRole: false  # 禁用集群级角色
  namespacedRoles: true
  additionalNamespaces:
    - app-prod
    - app-staging
  1. 网络策略限制
# 配置网络策略仅允许控制器通信
networkPolicy:
  enabled: true
  egress:
    enabled: true
    kubeapiCidr: 10.0.0.0/16  # AKS API服务器CIDR
    kubeapiPort: 443
  1. 镜像安全
# 使用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性能:

  1. 资源配置
resources:
  limits:
    cpu: 1000m
    memory: 512Mi
  requests:
    cpu: 200m
    memory: 128Mi
  1. 调整密钥轮换周期
keyrenewperiod: "168h"  # 7天轮换一次
keyttl: "8760h"  # 1年有效期
  1. 禁用状态更新
updateStatus: false  # 减少API服务器请求

总结与展望

Sealed Secrets为AKS环境提供了安全、便捷的密钥管理方案,通过本文介绍的部署策略、密钥管理和最佳实践,你可以构建企业级的密钥安全体系。关键要点包括:

  • 根据AKS网络模式选择合适的部署方案(公共/私有集群配置)
  • 生产环境推荐使用自定义证书或Azure Key Vault集成
  • 实施严格的权限控制和网络隔离
  • 建立完善的监控告警和灾难恢复机制

随着Azure云原生生态的发展,未来Sealed Secrets可能会进一步集成Azure服务,如Azure Policy强制密钥轮换、Azure Log Analytics深度监控等。建议关注项目GitHub仓库获取最新更新,并参与社区讨论分享AKS使用经验。

下一步行动清单

  1. 在测试AKS集群部署Sealed Secrets Helm图表
  2. 配置离线密封流程适配私有集群环境
  3. 实施密钥备份与灾难恢复策略
  4. 集成Azure Monitor监控关键指标
  5. 制定密钥轮换计划与操作手册

通过这些步骤,你将在AKS环境中建立起安全、可靠的密钥管理基础设施,为容器化应用提供坚实的安全保障。

【免费下载链接】sealed-secrets A Kubernetes controller and tool for one-way encrypted Secrets 【免费下载链接】sealed-secrets 项目地址: https://gitcode.com/GitHub_Trending/se/sealed-secrets

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值