MicroK8s集群Kubernetes Dashboard外部Ingress访问报错:Client sent an HTTP request to an HTTPS Server
MicroK8s集群Kubernetes Dashboard外部Ingress访问报错:Client sent an HTTP request to an HTTPS Server
嘿,我看了你在MicroK8s里配置Kubernetes Dashboard外部访问的问题——你已经启用了dashboard,内部访问正常,也配置了Ingress和Cloudflare域名,但碰到了“Client sent an HTTP request to an HTTPS Server”的报错,对吧?我帮你理清楚问题根源,再给你一步步的解决办法。
首先先对齐下你的现状:
- 你的MicroK8s v1.28.14集群里,kube-system命名空间的dashboard pod和service都正常,内部用
curl -k https://10.152.183.43能通 - 你配置的Ingress指向了dashboard的443端口,Ingress状态显示地址是127.0.0.1,Ingress Class是public
- Cloudflare那边设置了HTTPS重定向和灵活TLS模式
问题到底出在哪?
这个报错的核心是Ingress控制器和Dashboard Service之间的协议不匹配:
- Kubernetes Dashboard的Service本身跑的是443端口,是HTTPS服务
- 但你当前的Ingress配置里,控制器默认会用HTTP协议去转发请求到后端的443端口,相当于用HTTP去访问HTTPS服务,直接就触发了这个报错
- 另外你的Ingress地址显示是127.0.0.1,这说明Ingress控制器还没绑定到集群的外部IP,外部请求根本打不进来,这也是个要解决的点
一步步解决问题
1. 先修正Ingress的协议匹配问题
给你的Ingress加上关键注解,告诉控制器用HTTPS去和后端Dashboard通信,修改后的Ingress YAML如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: kubernetes-dashboard namespace: kube-system annotations: nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" # 核心:指定后端用HTTPS协议 nginx.ingress.kubernetes.io/ssl-redirect: "false" # 配合Cloudflare的重定向,避免重复跳转 nginx.ingress.kubernetes.io/ssl-verify-client: "false" # 跳过证书验证(测试环境可用,生产建议配置信任证书) spec: rules: - host: cluster.my-domain.com http: paths: - path: / pathType: Prefix backend: service: name: kubernetes-dashboard port: number: 443
我给你解释下这些注解的作用:
backend-protocol: "HTTPS":强制Ingress控制器用HTTPS请求后端的Dashboard Service,直接解决协议不匹配的报错ssl-redirect: "false":因为你已经在Cloudflare开了HTTPS重定向,这里关掉Ingress自身的重定向,避免出现多次跳转的问题ssl-verify-client: "false":因为Dashboard用的是MicroK8s默认生成的自签名证书,Ingress控制器可能会验证失败,加这个注解跳过验证(测试环境用没问题,生产环境建议替换成可信证书)
2. 修复Ingress地址为127.0.0.1的问题
你的Ingress地址显示127.0.0.1,说明Ingress控制器没绑定到集群的外部IP,咱们这么处理:
- 先确认MicroK8s的Ingress addon是正常启用的:
microk8s status看ingress模块是不是enabled状态 - 如果状态正常但地址还是127.0.0.1,就重启Ingress控制器的Pod:先执行
kubectl get pods -n ingress找到控制器的Pod名称,然后用kubectl delete pod -n ingress <你的Pod名称>删掉,它会自动重建,重建后再看Ingress地址应该就变成集群的外部IP了 - 要是还是不行,检查下Ingress Class的配置,确保
public类的Ingress控制器是绑定了外部网卡的
3. 配合Cloudflare的灵活TLS设置
因为你用了Cloudflare的灵活TLS(客户端到Cloudflare是HTTPS,Cloudflare到你的集群是HTTP),还要注意:
- 保持Cloudflare的“SSL/TLS”设置为“灵活”模式
- 不用在Ingress里配置额外的TLS证书,因为Cloudflare已经和客户端完成了HTTPS握手,集群内部的通信由Ingress和Dashboard的HTTPS处理就行
最后验证
等你把这些配置都改完,执行kubectl apply -f <你的Ingress文件路径>应用配置,等个1-2分钟,然后用kubectl describe ingress kubernetes-dashboard -n kube-system查看Ingress状态,确认Address变成了集群的外部IP,然后就可以用https://cluster.my-domain.com访问Dashboard了。
备注:内容来源于stack exchange,提问作者petwri
相关产品推荐
相关产品推荐

