AKS集群Ingress Controller无法找到TLS证书Secret求助
AKS Nginx Ingress TLS配置失败排查方案
核心错误分析
日志中的两个关键错误指向两个核心问题:
- 证书不是有效的PEM格式:
Error obtaining X.509 certificate: unexpected error creating SSL Cert: no valid PEM formatted block found - Ingress Controller无法找到指定的Secret:
Error getting SSL certificate "myapp-test/myapp-tls": local SSL certificate myapp-test/myapp-tls was not found
排查与解决步骤
1. 验证证书与密钥的PEM格式及Base64编码
- 确认原始文件格式:你的证书文件必须以
-----BEGIN CERTIFICATE-----开头、-----END CERTIFICATE-----结尾;私钥文件必须以-----BEGIN PRIVATE KEY-----或-----BEGIN RSA PRIVATE KEY-----开头、对应结尾语句结束。 - 验证Base64编码正确性:将Secret中
data字段的内容解码,检查是否还原为完整的PEM内容:
若解码后不是完整的PEM格式,说明编码过程出错,需重新生成。# 验证tls.crt echo "你的BASE64编码内容" | base64 -d # 验证tls.key echo "你的BASE64编码内容" | base64 -d
2. 确认Secret与Ingress的命名空间一致性
- 检查Secret是否存在于指定命名空间:
输出需显示Secret存在,且kubectl get secret myapp-tls -n myapp-testType为kubernetes.io/tls。 - 查看Secret的实际内容,确认
data字段不是占位符(你当前配置中的BASE64 ENCODED CRT FILE CONTENT是占位符,需替换为真实编码值):kubectl get secret myapp-tls -n myapp-test -o yaml
3. 用kubectl直接生成Secret(避免手动编码错误)
手动编写YAML容易出现格式错误,推荐用kubectl命令直接创建TLS Secret:
kubectl create secret tls myapp-tls -n myapp-test --cert=/path/to/your/test-app.myapp.io.crt --key=/path/to/your/test-app.myapp.io.key
该命令会自动完成PEM文件的Base64编码,确保格式完全符合要求。
4. 重新部署Ingress并验证
- 删除现有Ingress和Secret:
kubectl delete ingress myapp-test -n myapp-test kubectl delete secret myapp-tls -n myapp-test - 重新创建Secret(用上面的kubectl命令),再应用Ingress配置:
kubectl apply -f myapp-ingress.yml
5. 检查Ingress Controller的权限
确认Nginx Ingress Controller的ServiceAccount有权限读取myapp-test命名空间的Secret:
- 查看Controller使用的ClusterRole:
kubectl get clusterrole | grep nginx - 检查该ClusterRole是否包含
secrets资源的get权限:
若缺少权限,需更新ClusterRole添加对应权限。kubectl describe clusterrole <nginx-clusterrole-name>
6. 查看详细日志定位问题
获取Ingress Controller的完整日志,排查更细节的错误:
kubectl logs -n kube-system $(kubectl get pods -n kube-system | grep nginx-ingress | awk '{print $1}')
内容的提问来源于stack exchange,提问作者Franck Charlier
相关产品推荐
相关产品推荐

