Kubernetes Ingress加载指定证书失败,返回虚假证书求助
问题描述
通过预封装Helm Chart部署应用时,Ingress与关联的Secret均部署成功,且Ingress正确指定了tls.secretName,但执行以下命令时,始终返回Kubernetes Ingress Controller的虚假证书:
openssl s_client -showcerts -servername connectivity-proxy.cs-dev.transparent-proxy.eurekacloud.io -connect connectivity-proxy.cs-dev.transparent-proxy.eurekacloud.io:443 CONNECTED(00000004) depth=0 O = Acme Co, CN = Kubernetes Ingress Controller Fake Certificate verify error:num=18:self signed certificate verify return:1 depth=0 O = Acme Co, CN = Kubernetes Ingress Controller Fake Certificate verify return:1
由于使用预封装Helm Chart,无法通过--default-ssl-certificate参数配置默认证书,且集群中存在其他使用不同证书的Ingress,需排查其他可能原因。
已部署的Ingress片段:
spec: rules: - host: connectivity-proxy.cs-dev.transparent-proxy.eurekacloud.io http: paths: - backend: service: name: connectivity-proxy-tunnel-0 port: number: 8042 path: / pathType: Prefix tls: - hosts: - connectivity-proxy.cs-dev.transparent-proxy.eurekacloud.io secretName: pr-ingress-secret
Secret片段:
apiVersion: v1 data: ca.crt: <Base 64 encoded value of CA Cert> tls.crt: <Base 64 encoded value of TLS Cert> tls.key: <Base 64 encoded value of TLS Key> kind: Secret metadata: annotations: meta.helm.sh/release-name: connectivity-proxy meta.helm.sh/release-namespace: connectivity-proxy creationTimestamp: "2024-03-02T07:32:56Z" labels: app.kubernetes.io/managed-by: Helm name: pr-ingress-secret namespace: connectivity-proxy resourceVersion: "3674684903" uid: 401e2621-789b-4ecd-803c-8e3ceb56513b type: Opaque
排查方向
- 修正Secret类型:当前Secret的
type为Opaque,但Ingress TLS要求Secret必须是kubernetes.io/tls类型,否则控制器无法识别并加载证书。需修改Secret的类型:kubectl patch secret pr-ingress-secret -n connectivity-proxy -p '{"type":"kubernetes.io/tls"}' - 验证证书与密钥匹配性:解码Secret中的
tls.crt和tls.key,确认证书对应目标域名,且密钥与证书配对:# 解码证书到本地文件 kubectl get secret pr-ingress-secret -n connectivity-proxy -o jsonpath='{.data.tls\.crt}' | base64 -d > tls.crt # 解码密钥到本地文件 kubectl get secret pr-ingress-secret -n connectivity-proxy -o jsonpath='{.data.tls\.key}' | base64 -d > tls.key # 对比证书和密钥的模数MD5值,需完全一致 openssl x509 -noout -modulus -in tls.crt | openssl md5 openssl rsa -noout -modulus -in tls.key | openssl md5 - 检查Ingress控制器日志:查看Ingress控制器(如NGINX Ingress Controller)的Pod日志,排查是否存在加载该Secret的错误(如权限不足、证书格式无效):
# 替换为实际的Ingress控制器Pod名称和命名空间 kubectl logs -n kube-system <nginx-ingress-controller-pod> | grep pr-ingress-secret - 确认Ingress资源状态:检查Ingress的
status字段,确认负载均衡端点正常关联,控制器已成功处理该Ingress:kubectl get ingress -n connectivity-proxy -o yaml - 排查域名解析与链路:确认目标域名解析到Ingress控制器的入口IP/域名,443端口未被其他代理或负载均衡拦截。
- 检查Ingress域名冲突:确认集群中没有其他Ingress资源匹配同一域名,导致证书被优先级更高的规则覆盖:
kubectl get ingress --all-namespaces | grep connectivity-proxy.cs-dev.transparent-proxy.eurekacloud.io
内容的提问来源于stack exchange,提问作者Prabal Rakshit
相关产品推荐
相关产品推荐

