Azure AKS部署Nginx Controller时SSL证书验证异常求助
解决方案步骤
1. 定位问题核心
日志明确显示当前使用的SSL证书是给example-aks-dev.brazilsouth.cloudapp.azure.com签发的,但实际访问的是Azure Front Door域名endpoint-example-dev-h2a3adekfjkxgrfk.a01.azurefd.net,域名不匹配是导致访问报错的直接原因。证书顺序问题是次要的,先解决域名匹配问题。
2. 生成匹配Front Door域名的证书
你已经部署了cert-manager,优先用它生成合法证书;如果只是测试,也可以手动生成自签名证书。
方法一:用cert-manager生成Let's Encrypt证书(推荐)
你现有letsencrypt Secret,说明之前配置过cert-manager,现在创建对应域名的证书资源:
- 创建
fd-cert.yaml文件:
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: fd-example-cert namespace: ingress-nginx spec: secretName: fd-example-cert-tls issuerRef: name: letsencrypt kind: ClusterIssuer # 若之前用的是Issuer,改成对应类型 commonName: endpoint-example-dev-h2a3adekfjkxgrfk.a01.azurefd.net dnsNames: - endpoint-example-dev-h2a3adekfjkxgrfk.a01.azurefd.net acme: config: - http01: ingressClass: nginx domains: - endpoint-example-dev-h2a3adekfjkxgrfk.a01.azurefd.net
- 应用配置:
kubectl apply -f fd-cert.yaml -n ingress-nginx - 检查证书状态:
kubectl get certificates -n ingress-nginx,等状态变成Ready即可。
方法二:手动生成自签名证书(仅测试用)
如果只是临时测试,手动生成匹配域名的证书:
- 生成证书文件:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=endpoint-example-dev-h2a3adekfjkxgrfk.a01.azurefd.net"
- 创建Kubernetes Secret:
kubectl create secret tls fd-example-cert-tls --key tls.key --cert tls.crt -n ingress-nginx
3. 配置Ingress使用新证书
取消Ingress资源中tls段的注释,指定刚生成的Secret:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: your-ingress-name namespace: your-app-namespace annotations: nginx.ingress.kubernetes.io/ssl-redirect: "true" spec: tls: - hosts: - endpoint-example-dev-h2a3adekfjkxgrfk.a01.azurefd.net secretName: fd-example-cert-tls # 替换成你生成的Secret名称 rules: - host: endpoint-example-dev-h2a3adekfjkxgrfk.a01.azurefd.net http: paths: - path: / pathType: Prefix backend: service: name: your-app-service port: number: 80
- 应用更新:
kubectl apply -f your-ingress.yaml
4. 处理证书顺序问题(若后续仍报错)
如果之后仍出现证书验证错误,检查证书链顺序:
- 导出证书:
kubectl get secret fd-example-cert-tls -n ingress-nginx -o jsonpath='{.data.tls\.crt}' | base64 -d > tls.crt
- 打开
tls.crt确认顺序:必须是叶子证书 → 中间证书 → 根证书(根证书可省略,浏览器一般内置) - 顺序不对的话,重新拼接证书内容,保存为
new-tls.crt,然后更新Secret:
kubectl create secret tls fd-example-cert-tls --key tls.key --cert new-tls.crt -n ingress-nginx --dry-run=client -o yaml | kubectl apply -f -
5. 清理并验证Ingress状态
- 删除已完成的旧Pod:
kubectl delete pod dev-example-ingress-nginx-controller-7cf9494bb7-7jbw4 -n ingress-nginx - 查看新Pod日志确认无证书错误:
kubectl logs dev-example-ingress-nginx-controller-5f46d75ff-7tsbp -n ingress-nginx
内容的提问来源于stack exchange,提问作者Rodrigo Alarcón
相关产品推荐
相关产品推荐

