Minikube Ingress出现Connection refused错误,求排查解决
问题
在DigitalOcean的Ubuntu虚拟机上安装Minikube后,配置Ingress访问Deployment时执行curl myserver.xyz报错:
curl myserver.xyz curl: (7) Failed to connect to myserver.xyz port 80: Connection refused
已部署的资源配置
Deployment与Service配置:
apiVersion: v1 kind: Service metadata: name: echo2 spec: ports: - port: 80 targetPort: 5678 selector: app: echo2 --- apiVersion: apps/v1 kind: Deployment metadata: name: echo2 spec: selector: matchLabels: app: echo2 replicas: 1 template: metadata: labels: app: echo2 spec: containers: - name: echo2 image: hashicorp/http-echo args: - "-text=echo2" ports: - containerPort: 5678
Ingress资源配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echo-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: myserver.xyz http: paths: - pathType: Prefix path: "/" backend: service: name: echo1 port: number: 80
已执行的操作
- 部署Ingress控制器:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.1.1/deploy/static/provider/do/deploy.yaml - 将Ingress Nginx服务修改为LoadBalancer类型并指定公网IP:
kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec": {"type": "LoadBalancer", "externalIPs":["146.190.XXX.XXX"]}}' - 检查Ingress状态:
kubectl get ingress NAME CLASS HOSTS ADDRESS PORTS AGE echo-ingress <none> myserver.xyz 192.168.XX.X 80 2d9h example-ingress nginx hello-world.info 192.168.XX.X 80 61d - 检查Ingress Nginx服务状态:
kubectl get svc --namespace=ingress-nginx NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.108.xxx.XXX 146.190.XXX.XXX 80:317XX/TCP,443:320XX/TCP 2d23h ingress-nginx-controller-admission ClusterIP 10.101.xxx.XXX <none> 443/TCP 2d23h - 检查Ingress详情:
kubectl describe ingress echo-ingress Name: echo-ingress Labels: <none> Namespace: default Address: 192.168.XX.X Ingress Class: <none> Default backend: <default> Rules: Host Path Backends ---- ---- -------- myserver.xyz / echo1:80 (XX.XXX.X.XXX:5678) Annotations: kubernetes.io/ingress.class: nginx Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Sync 131m nginx-ingress-controller Scheduled for sync Normal Sync 126m (x2 over 126m) nginx-ingress-controller Scheduled for sync Normal Sync 108m nginx-ingress-controller Scheduled for sync - 已配置域名DNS A记录指向虚拟机公网IP,且本地
/etc/hosts添加条目:146.190.XXX.XXX myserver.xyz
疑问:是否遗漏配置?是否需要安装Minikube的MetalLB插件?
解决思路与修复步骤
1. 修复Ingress后端服务名称错误
Ingress规则中配置的后端服务是echo1,但实际部署的Service名称为echo2,直接修改Ingress配置中的服务名称:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echo-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: rules: - host: myserver.xyz http: paths: - pathType: Prefix path: "/" backend: service: name: echo2 # 修改为实际的Service名称 port: number: 80
执行kubectl apply -f <ingress配置文件>更新Ingress。
2. 修正Ingress Class配置
从kubectl get ingress输出可见,echo-ingress的CLASS字段为<none>,Kubernetes 1.18+版本推荐使用spec.ingressClassName字段指定Ingress类,确保控制器能识别该资源:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: echo-ingress annotations: kubernetes.io/ingress.class: "nginx" spec: ingressClassName: nginx # 添加该行指定Ingress类 rules: - host: myserver.xyz http: paths: - pathType: Prefix path: "/" backend: service: name: echo2 port: number: 80
更新后执行kubectl get ingress,确认CLASS字段变为nginx。
3. 必须安装Minikube的MetalLB插件
Minikube本身无内置LoadBalancer实现,手动指定externalIP无法正常工作,需安装MetalLB提供外部IP支持:
- 启用MetalLB插件:
minikube addons enable metallb - 创建IP地址池配置文件
metallb-config.yaml:apiVersion: metallb.io/v1beta1 kind: IPAddressPool metadata: name: default namespace: metallb-system spec: addresses: - 146.190.XXX.XXX/32 # 填入虚拟机公网IP --- apiVersion: metallb.io/v1beta1 kind: L2Advertisement metadata: name: default namespace: metallb-system spec: ipAddressPools: - default - 应用配置:
kubectl apply -f metallb-config.yaml
4. 替换Ingress控制器部署文件
当前使用的是DigitalOcean托管K8s的Ingress控制器部署文件,不适合Minikube,改用Minikube专用方式部署:
minikube addons enable ingress
5. 开放虚拟机端口
确保虚拟机的80端口及Ingress Nginx的NodePort(如317XX)已开放:
sudo ufw allow 80/tcp sudo ufw allow 317XX/tcp
最终验证
完成配置后执行以下操作验证:
- 检查Ingress状态,确认
ADDRESS显示为公网IP:kubectl get ingress - 检查Ingress Nginx服务的
EXTERNAL-IP是否正确分配:kubectl get svc -n ingress-nginx - 再次执行
curl myserver.xyz测试连通性。
内容的提问来源于stack exchange,提问作者Golide
相关产品推荐
相关产品推荐

