K3s中Let's Encrypt预发环境DNS查询异常问题求助
K3s集群Let's Encrypt HTTP-01挑战DNS解析失败排查方案
核心问题定位
错误提示dial tcp: lookup example.nl on 10.43.0.11:53: server misbehaving说明kube-dns无法正常解析你的自定义域名。你在VPS节点/etc/hosts里的配置仅对节点本身生效,集群内的Pod(包括cert-manager的挑战Pod)不会读取该文件,因此导致解析失败。
排查与修复步骤
1. 验证kube-dns基础可用性
先确认kube-dns(K3s默认用CoreDNS提供该服务)本身是否正常工作,在集群内运行测试Pod:
# 测试自定义域名解析 kubectl run -it --rm --image=busybox:1.28 dns-test -- nslookup example.nl # 测试公网域名解析,验证DNS服务本身是否正常 kubectl run -it --rm --image=busybox:1.28 dns-test -- nslookup google.com
- 如果
google.com能解析,说明kube-dns服务正常,仅自定义域名解析存在问题; - 如果
google.com也无法解析,说明kube-dns配置异常,需检查CoreDNS的ConfigMap。
2. 为集群添加自定义域名解析
要让集群内Pod能正确解析你的域名,需修改CoreDNS配置,添加自定义hosts规则:
- 编辑CoreDNS的ConfigMap:
kubectl edit configmap coredns -n kube-system
- 在
Corefile块中插入hosts插件配置(放在forward规则之前):
.:53 { hosts { 206.190.101.190 example.nl example1.nl fallthrough } forward . /etc/resolv.conf cache 30 loop reload loadbalance }
- 保存退出后,重启CoreDNS Pod让配置生效:
kubectl rollout restart deployment coredns -n kube-system
3. 检查Ingress与Cert-Manager配置正确性
确保第二个服务的Ingress配置无遗漏:
- 确认Ingress的
spec.rules.host准确设置为example.nl; - 确认Ingress的
annotations引用了正确的staging环境ClusterIssuer; - 确认
tls块包含目标域名,示例配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-staging" spec: tls: - hosts: - example.nl secretName: example-tls rules: - host: example.nl http: paths: - path: / pathType: Prefix backend: service: name: example-service port: number: 80
4. 重新触发证书申请
删除失败的证书订单或对应Secret,让cert-manager重新发起申请:
# 删除失败的订单(替换命名空间和订单名称) kubectl delete order -n <你的服务命名空间> <失败订单名称> # 或直接删除证书Secret,cert-manager会自动重建 kubectl delete secret example-tls -n <你的服务命名空间>
额外验证点
- 检查VPS防火墙/安全组是否开放80端口(HTTP-01挑战必须);
- 用外部工具测试公网能否访问
http://example.nl/.well-known/acme-challenge/路径; - 查看cert-manager日志获取更详细错误:
kubectl logs -n cert-manager -l app=cert-manager -f
内容的提问来源于stack exchange,提问作者furion2000
相关产品推荐
相关产品推荐

