如何在Kubernetes中自动化AWS ACM证书创建与ALB Ingress集成
解决方案
方案1:Cert-Manager + AWS ACM 自动化证书管理(推荐)
这套方案能完全在Kubernetes集群内完成ACM证书的申请、自动续约,同步到K8s Secret,完美适配ALB Ingress场景。
实施步骤
安装Cert-Manager
部署Cert-Manager到集群:kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml验证部署状态:
kubectl get pods -n cert-manager配置IAM权限(IRSA方式)
给Cert-Manager的ServiceAccount授予ACM证书管理和Route53 DNS验证的权限:- 创建IAM Policy,包含以下权限:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "acm:RequestCertificate", "acm:DescribeCertificate", "acm:UpdateCertificateOptions", "acm:ListTagsForCertificate", "acm:AddTagsToCertificate" ], "Resource": "*" }, { "Effect": "Allow", "Action": [ "route53:GetChange", "route53:ChangeResourceRecordSets" ], "Resource": "*" }, { "Effect": "Allow", "Action": "route53:ListHostedZonesByName", "Resource": "*" } ] } - 绑定该Policy到Cert-Manager的ServiceAccount(必须通过IRSA,确保集群已开启OIDC身份提供商)。
- 创建IAM Policy,包含以下权限:
创建ClusterIssuer
创建对接AWS ACM的ClusterIssuer,指定目标AWS区域:apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: acm-cluster-issuer spec: aws: region: us-east-1 # 替换为你的AWS区域 # 使用IRSA时无需配置密钥,会自动使用ServiceAccount关联的IAM角色创建Certificate资源
在业务命名空间下创建Certificate资源,自动触发ACM证书申请并同步到K8s Secret:apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: game-2048-tls namespace: game-2048 spec: secretName: game-2048-tls # 与Ingress配置中的secretName一致 issuerRef: name: acm-cluster-issuer kind: ClusterIssuer dnsNames: - snpv.cclab.cloud-castles.com usages: - server auth - client auth保留现有Ingress配置
你当前的Ingress配置无需修改,Cert-Manager会自动创建指定的Secret,ALB Controller会自动关联该Secret对应的ACM证书到负载均衡器。
方案2:直接引用ACM证书ARN
如果不想引入Cert-Manager,可直接在Ingress注解中指定已创建的ACM证书ARN,跳过K8s Secret环节。但证书的创建和续约需要额外工具(如Terraform、自定义Operator)自动化。
配置示例
修改Ingress的metadata注解,添加证书ARN:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: namespace: game-2048 name: ingress-2048 annotations: alb.ingress.kubernetes.io/scheme: internet-facing alb.ingress.kubernetes.io/target-type: ip alb.ingress.kubernetes.io/listen-ports: '[{"HTTPS":443}]' alb.ingress.kubernetes.io/group.name: "application-shared-lb" alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-east-1:123456789012:certificate/xxxx-xxxx-xxxx-xxxx # 替换为你的证书ARN spec: ingressClassName: alb rules: - host: snpv.cclab.cloud-castles.com http: paths: - path: / pathType: Prefix backend: service: name: service-2048 port: number: 80
注意:此方案需移除原Ingress中的spec.tls配置块,因为直接使用ACM托管的证书。
重要注意事项
- 目标域名
snpv.cclab.cloud-castles.com需托管在AWS Route53,或支持DNS01验证(Cert-Manager可自动完成Route53的验证记录配置)。 - ALB与ACM证书必须处于同一AWS区域。
- 优先使用IRSA方式配置权限,避免在集群内存储AWS访问密钥。
内容的提问来源于stack exchange,提问作者Elazar
相关产品推荐
相关产品推荐

