You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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支持:

  1. 启用MetalLB插件:
    minikube addons enable metallb
    
  2. 创建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
    
  3. 应用配置:
    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

最终验证

完成配置后执行以下操作验证:

  1. 检查Ingress状态,确认ADDRESS显示为公网IP:
    kubectl get ingress
    
  2. 检查Ingress Nginx服务的EXTERNAL-IP是否正确分配:
    kubectl get svc -n ingress-nginx
    
  3. 再次执行curl myserver.xyz测试连通性。

内容的提问来源于stack exchange,提问作者Golide

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:04:55