Kubernetes Ingress TLS配置问题:域名使用错误证书求助
解决K8s Ingress TLS证书匹配错误的问题
嘿,我看到你在配置K8s Ingress TLS时遇到了域名和证书不匹配的问题,别着急,咱们一步步排查和修复:
1. 先确认你的Secret配置是否正确
首先得确保你为两个域名创建的Secret是完全正确的:
- 用命令查看Secret是否存在:
kubectl get secrets,确认gateway.kamerbaas.nl和kamerbaas.nl这两个Secret都在列表里 - 检查每个Secret的内容是否包含正确的证书和密钥:
确保输出的内容是你从Let's Encrypt拿到的证书和密钥的base64编码值,没有错误。# 检查gateway域名的Secret kubectl get secret gateway.kamerbaas.nl -o yaml | grep -A2 tls.crt kubectl get secret gateway.kamerbaas.nl -o yaml | grep -A2 tls.key # 检查主域名的Secret kubectl get secret kamerbaas.nl -o yaml | grep -A2 tls.crt kubectl get secret kamerbaas.nl -o yaml | grep -A2 tls.key
2. 修正Ingress的TLS配置
你的Ingress配置可能存在格式或对应关系的问题,这里给你一个完整的正确配置示例(注意:extensions/v1beta1已经被废弃,推荐使用networking.k8s.io/v1):
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: gateway-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: # TLS配置部分:每个域名对应一个独立的条目,绑定正确的Secret tls: - hosts: - gateway.kamerbaas.nl secretName: gateway.kamerbaas.nl # 这里必须和你创建的Secret名称完全一致 - hosts: - kamerbaas.nl secretName: kamerbaas.nl # 同样,和主域名的Secret名称严格匹配 # 路由规则部分:确保每个域名对应到正确的后端服务 rules: - host: gateway.kamerbaas.nl http: paths: - path: / pathType: Prefix backend: service: name: YOUR_GATEWAY_SERVICE_NAME # 替换成你的网关服务名称 port: number: 80 - host: kamerbaas.nl http: paths: - path: / pathType: Prefix backend: service: name: YOUR_MAIN_SERVICE_NAME # 替换成你的主服务名称 port: number: 80
关键注意点:
- 严格匹配Secret名称:
secretName必须和你实际创建的Secret名称完全一致,K8s对名称大小写敏感,别打错字符 - API版本兼容性:如果你的集群版本较老,确实需要用
extensions/v1beta1,那把apiVersion改回去,但建议尽快升级到networking.k8s.io/v1 - 路由规则和TLS的对应:每个
host在rules和tls部分都要存在,不能有遗漏
3. 刷新Ingress Controller缓存
有时候修改Ingress配置后,控制器可能没及时更新证书缓存,你可以重启Ingress Controller的Pod来强制刷新:
# 假设你的Nginx Ingress Controller部署在kube-system命名空间,根据实际情况调整 kubectl rollout restart deployment nginx-ingress-controller -n kube-system
4. 验证修复效果
应用修改后的Ingress配置:
kubectl apply -f your-ingress-file.yaml
然后用以下方式验证:
- 查看Ingress的状态和事件:
kubectl describe ingress gateway-ingress,检查TLS部分是否正确绑定了对应的Secret,没有报错事件 - 用curl测试证书:
输出的subject应该分别对应各自的域名,说明证书匹配正确。curl -v https://gateway.kamerbaas.nl 2>&1 | grep "subject:" curl -v https://kamerbaas.nl 2>&1 | grep "subject:"
内容的提问来源于stack exchange,提问作者Jaap Weijland
相关产品推荐
相关产品推荐

