Hetzner K3s集群中cert-manager证书状态异常求助
问题背景
基于hetzner-k3s在Hetzner搭建Kubernetes集群,使用GoDaddy管理DNS。已安装cert-manager v1.12.0,部署了示例Deployment和LoadBalancer Service,HTTP访问Pod正常。创建ClusterIssuer和Certificate资源后,证书状态异常,Challenge日志提示:
Waiting for HTTP-01 challenge propagation: did not get expected response when querying endpoint, expected "some.sensitive.data." but got: echo1
原因分析
当前80端口被示例example-lb LoadBalancer Service直接占用,导致Let's Encrypt发起HTTP-01验证请求时,流量直接路由到echo Pod返回"echo1",而非cert-manager临时Ingress提供的验证字符串。同时,ClusterIssuer指定使用nginx Ingress类,但未部署对应Nginx Ingress Controller,cert-manager无法创建有效路由处理验证请求。
解决方案
1. 释放80端口
删除或修改占用80端口的示例Service,让80端口可被Ingress Controller使用:
# 删除示例LoadBalancer Service kubectl delete service example-lb
也可编辑Service将port字段从80改为其他值(如8080),并同步更新DNS或访问方式。
2. 部署Nginx Ingress Controller
由于ClusterIssuer配置指定ingress.class: nginx,需部署对应Ingress Controller:
# 使用Helm部署(推荐) helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm repo update helm install ingress-nginx ingress-nginx/ingress-nginx
或使用kubectl部署官方静态yaml:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml
部署完成后获取Ingress Controller外部IP:
kubectl get service ingress-nginx-controller
将GoDaddy对应子域名的A记录更新为该IP。
3. 验证cert-manager路由配置
检查cert-manager创建的临时Ingress资源,确认验证路由生成:
kubectl get ingress -A
确保ClusterIssuer的ingress.class与Ingress Controller的class匹配(新版Ingress Controller若使用ingressClassName字段,需同步修改ClusterIssuer配置)。
4. 重新触发证书签发
删除现有Certificate资源,让cert-manager重新发起签发流程:
kubectl delete certificate secure-homekube-io
或通过注解强制重新签发:
kubectl annotate certificate secure-homekube-io cert-manager.io/force-renewal=true
验证步骤
- 查看Certificate状态,确认变为
Ready:
kubectl get certificate secure-homekube-io
- 查看Challenge资源,确认无错误:
kubectl get challenges -A
- 手动访问验证路径(从Challenge日志获取),确认返回验证字符串而非"echo1"。
内容的提问来源于stack exchange,提问作者dos4dev

