Docker Desktop Kubernetes本地开发:Ingress Controller无法找到TLS Secret
Ingress-Nginx 证书加载失败及HTTPS访问异常排查解决
问题场景
本地Docker Desktop Kubernetes环境部署ingress-nginx v1.11.2后,控制器日志提示无法找到default/tls-secret证书, fallback到默认证书;同时HTTPS访问出现异常,具体表现:
- HTTP访问返回308永久重定向到HTTPS
- 直接访问HTTPS时curl提示证书吊销检查失败
curl -kv访问出现Failure when receiving data from the peer- Chrome浏览器显示
ERR_EMPTY_RESPONSE
控制器报错日志
W0828 06:55:47.990075 7 controller.go:1438] Error getting SSL certificate "default/tls-secret": local SSL certificate default/tls-secret was not found. Using default certificate I0828 06:55:47.999359 7 main.go:107] "successfully validated configuration, accepting" ingress="default/ec-example-app" I0828 06:55:48.001713 7 store.go:440] "Found valid IngressClass" ingress="default/ec-example-app" ingressclass="nginx" I0828 06:55:48.002013 7 backend_ssl.go:67] "Adding secret to local store" name="default/tls-secret"
已执行操作
- 生成自签名证书:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=exampleapp/O=exampleapp" -addext "subjectAltName = DNS:exampleapp"
- 创建TLS Secret:
kubectl create secret tls tls-secret --cert tls.crt --key tls.key
- 验证Secret存在:
➜ ~ kubectl get secret NAME TYPE DATA AGE client-id Opaque 1 28h client-secret Opaque 1 28h cookie-secret Opaque 1 28h tls-secret kubernetes.io/tls 2 22m
- 查看Secret详情:
➜ ~ kubectl describe secret tls-secret Name: tls-secret Namespace: default Labels: <none> Annotations: <none> Type: kubernetes.io/tls Data ==== tls.crt: 1216 bytes tls.key: 1704 bytes
- 应用Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ec-example-app annotations: nginx.ingress.kubernetes.io/enable-rewrite-log: "true" nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx tls: - hosts: - exampleapp secretName: tls-secret rules: - host: exampleapp http: paths: - path: / pathType: ImplementationSpecific backend: service: name: ec-example-app port: number: 80
- 配置
/etc/hosts映射:
127.0.0.1 exampleapp
排查与解决步骤
1. 确认Ingress-Nginx控制器权限
Ingress-Nginx控制器需要具备访问default命名空间下Secret的权限,检查控制器关联的ClusterRole是否包含secrets的get/list/watch权限:
kubectl describe clusterrole ingress-nginx
若缺少相关权限,更新ClusterRole:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: ingress-nginx rules: - apiGroups: [""] resources: ["secrets"] verbs: ["get", "list", "watch"]
重新应用ClusterRole:
kubectl apply -f <clusterrole-file.yaml>
2. 修复自签名证书吊销检查问题
自签名证书默认无吊销列表,会触发curl的吊销检查失败,可通过以下方式处理:
- 本地测试推荐:禁用Ingress的SSL吊销检查
在Ingress注解中添加配置关闭检查:
更新Ingress配置:metadata: annotations: nginx.ingress.kubernetes.io/ssl-verify-client: "off" nginx.ingress.kubernetes.io/ssl-crl: ""kubectl apply -f ingress.yaml
3. 检查后端服务可用性
Failure when receiving data from the peer和ERR_EMPTY_RESPONSE通常是Ingress无法连接后端服务导致,执行以下验证:
- 检查服务状态:
kubectl get service ec-example-app - 检查Pod运行状态:
kubectl get pods -l app=ec-example-app - 从Ingress控制器Pod内部测试后端连接:
# 获取控制器Pod名称 POD_NAME=$(kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx -o jsonpath='{.items[0].metadata.name}') # 进入Pod内部 kubectl exec -it $POD_NAME -n ingress-nginx -- /bin/bash # 测试后端服务连通性 curl http://ec-example-app.default.svc.cluster.local
若连接失败,排查Pod是否正常启动、服务端口配置是否正确、是否有网络策略限制访问。
4. 重启Ingress-Nginx控制器
日志显示控制器后续已将Secret加入本地存储,但可能存在缓存问题,重启控制器强制重新加载证书:
kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
5. 验证Ingress配置生效
检查Ingress资源状态,确认TLS和规则配置正确:
kubectl describe ingress ec-example-app
内容的提问来源于stack exchange,提问作者Hiromasa
相关产品推荐
相关产品推荐

