Azure Kubernetes配置CertBot遇到Ingress路由问题
问题排查与修复方案
1. CertBot容器未启动HTTP服务
你的CertBot Pod当前仅执行sleep 3600维持存活,没有启动任何监听80端口的HTTP服务——这是核心问题之一:即使Ingress把请求路由过来,也没有服务能响应ACME挑战请求。
修复:
修改certbot-deployment.yaml的容器配置,启动一个简单的HTTP服务器(比如Python内置的),同时执行证书申请命令:
containers: - name: certbot image: certbot/certbot command: ["/bin/sh", "-c"] args: - "python3 -m http.server 80 --directory /var/www/certbot & certbot certonly --webroot --webroot-path=/var/www/certbot --email abc@example.com --agree-tos --no-eff-email --force-renewal --staging -d staging.example.com && sleep infinity" volumeMounts: - name: certbot-webroot mountPath: /var/www/certbot - name: certbot-storage mountPath: /etc/letsencrypt ports: - containerPort: 80 # 声明容器监听端口,确保Service能正确转发流量
2. Ingress注解不兼容Azure控制器
你使用了nginx.ingress.kubernetes.io/rewrite-target: /注解,但你的Ingress Class是Azure专属的webapprouting.kubernetes.azure.com,该控制器不支持NGINX Ingress的专属注解,多余注解可能干扰路径匹配逻辑。
修复:
直接移除该注解,修改Ingress.yaml的metadata部分:
metadata: name: exampleapp namespace: default # 删除nginx.ingress.kubernetes.io/rewrite-target: /这一行
3. 确认Ingress路径匹配规则
虽然K8s Ingress v1规范要求按最长前缀优先匹配,但可以微调路径配置确保优先级:
将ACME挑战路径的结尾加上斜杠,避免模糊匹配:
paths: - path: /.well-known/acme-challenge/ pathType: Prefix backend: service: name: certbot port: number: 80 # 其余路径保持不变
验证操作
- 应用修改后的配置:
kubectl apply -f certbot-deployment.yaml kubectl apply -f certbot-service.yaml kubectl apply -f Ingress.yaml
- 检查CertBot Pod状态:
kubectl get pods -l app=certbot
- 测试路由是否生效:
curl http://staging.example.com/.well-known/acme-challenge/test
如果日志显示请求转发到certbot服务,即使返回404也属于正常(挑战文件仅在证书申请时生成)。
内容的提问来源于stack exchange,提问作者Abdul Rauf
相关产品推荐
相关产品推荐

