EKS使用Cilium CNI时cert-manager ClusterIssuer报地址不允许错误
问题概述
在使用Cilium作为CNI的EKS集群中,cert-manager的ClusterIssuer资源状态异常,报错为Post "": Address is not allowed,日志关联字段为clusterissuername。
通过Helm配合Kustomize完成cert-manager部署后,基于ACME协议的ClusterIssuer触发上述错误:执行kubectl get clusterissuer查看资源时,资源无状态字段写入,READY列始终为空。
关联配置
故障ClusterIssuer清单
--- apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: acme-prod spec: acme: email: abdiakhate@example.com server: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: name: acme-prod-account-key solvers: - dns01: route53: region: us-east-1 accessKeyID: AKIAS2ETUR secretAccessKeySecretRef: name: credentials-secret key: secret-access-key selector: dnsZones: - "exemple.net"
ArgoCD部署cert-manager清单
--- apiVersion: argoproj.io/v1alpha1 kind: Application metadata: name: cert-manager namespace: argocd spec: destination: namespace: cert-manager server: 'https://kubernetes.default.svc' source: repoURL: 'https://charts.jetstack.io' targetRevision: v1.7.1 chart: cert-manager helm: valueFiles: - values.yaml values: | installCRDs: true project: default syncPolicy: automated: prune: true selfHeal: true syncOptions: - CreateNamespace=true
错误参考截图
根因定位
故障确由Cilium默认网络规则与cert-manager v1.7.1版本的已知bug共同触发:
- Cilium在EKS环境替换kube-proxy的运行模式下,默认开启Kubernetes API访问地址合法性校验,会直接拦截目标地址为空的API请求
- cert-manager v1.7.1在初始化ACME类型ClusterIssuer时,存在未正确赋值目标地址就发起注册请求的逻辑缺陷,该空地址请求被Cilium拦截后,ClusterIssuer的状态同步流程直接中断,无法写入READY状态。
排查步骤
- 拉取cert-manager Pod日志过滤对应资源的报错,确认拦截行为:
日志中可明确看到空地址POST请求的拒绝记录,请求拦截方为Cilium L7代理。kubectl logs -n cert-manager -l app.kubernetes.io/name=cert-manager | grep "clusterissuername.*acme-prod" - 校验Cilium运行配置,确认拦截规则启用状态:
若两个配置项值均为cilium config view | grep -E "enable-l7-proxy|enforce-k8s-api-allowed-ips"true,即可确认故障触发条件完全匹配。
解决方案
按需选择以下任意一种方案即可修复:
- 方案1:升级cert-manager到v1.8.0及以上稳定版本,新版本已经修复初始化阶段发起空地址请求的缺陷,不会触发Cilium的拦截规则。
- 方案2:无法升级cert-manager时,调整Cilium配置关闭Kubernetes API空地址拦截校验:
滚动重启所有Cilium Agent Pod等待配置生效后,cert-manager会在1-2分钟内自动重试ClusterIssuer同步流程,READY状态将自动更新为True。cilium config set enforce-k8s-api-allowed-ips false - 方案3:通过Cilium网络策略放通cert-manager Pod的出站流量,跳过L7代理校验:
apiVersion: "cilium.io/v2" kind: CiliumNetworkPolicy metadata: name: cert-manager-egress-allow namespace: cert-manager spec: endpointSelector: matchLabels: app.kubernetes.io/name=cert-manager egress: - toEntities: - all
内容的提问来源于stack exchange,提问作者Alioune Badara Diakhaté
相关产品推荐
相关产品推荐


