部署在EC2 Ubuntu实例MicroK8s中的Web应用无法通过浏览器访问求助
排查步骤与解决方案
1. 确认访问地址正确性
确保浏览器访问时使用的是EC2实例的公网IP/弹性IP,而非私有IP。私有IP仅能在VPC内部访问,外部浏览器无法直接连通。
2. 检查VPC网络ACL配置
安全组允许流量后,需确认VPC的网络ACL(入站/出站规则):
- 入站规则:添加允许
0.0.0.0/0访问目标NodePort(或LoadBalancer端口)的TCP规则 - 出站规则:添加允许所有TCP流量(或至少允许对应端口的返回流量)的规则
网络ACL是VPC层面的防火墙,默认可能拦截非默认端口的流量。
3. 验证MicroK8s网络组件状态
- 检查网络插件(Calico/Flannel)是否正常运行:
确保所有网络相关Pod处于microk8s kubectl get pods -n kube-systemRunning状态,无重启或异常。 - 确认服务端口映射:
核对服务的microk8s kubectl get svcPORT(S)列,确认NodePort与安全组开放的端口一致;若使用LoadBalancer,需确保EXTERNAL-IP已分配(非<pending>状态)。 - 检查节点iptables转发规则:
确认存在指向对应服务的DNAT规则,若缺失需重启MicroK8s网络组件:sudo iptables-save | grep <你的NodePort>microk8s stop && microk8s start。
4. 检查EC2本地防火墙(UFW)
Ubuntu实例默认可能启用UFW,即使安全组放行,本地防火墙仍会拦截流量:
- 查看UFW状态:
sudo ufw status - 若未允许目标端口,添加规则:
或直接关闭UFW(生产环境按需选择):sudo ufw allow <你的NodePort>/tcpsudo ufw disable。
5. 确认应用监听地址
确保Pod内的Web应用监听的是0.0.0.0而非127.0.0.1:
- 进入Pod执行:
若应用仅监听microk8s kubectl exec -it <你的Pod名称> -- netstat -tulpn127.0.0.1,则仅能在Pod内部访问,需修改应用配置改为监听0.0.0.0。
6. LoadBalancer服务额外检查
若使用LoadBalancer类型服务:
- 确认已启用MetalLB插件:
microk8s enable metallb - 配置MetalLB IP池(需为EC2所在子网的可用私有IP或弹性IP):
配置完成后再次查看服务的microk8s kubectl apply -f - <<EOF apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default namespace: metallb-system spec: addresses: - <可用IP范围,如10.0.0.100-10.0.0.200> EOFEXTERNAL-IP,确认已分配有效IP后再尝试访问。
7. 抓包定位流量问题
在EC2实例上执行抓包命令,验证浏览器请求是否到达实例:
sudo tcpdump -i any port <你的NodePort>
- 若未捕获到请求包:问题出在VPC路由、安全组或网络ACL
- 若捕获到请求但无响应:问题出在MicroK8s服务转发或应用本身
内容的提问来源于stack exchange,提问作者Swarnali Ghosh
相关产品推荐
相关产品推荐

