【问题标题】:Kubernetes Nginx Ingress Connection Refused on External IP Address (Bare Metal)Kubernetes Nginx Ingress Connection Refused on External IP Address (Bare Metal)
【发布时间】:2022-06-17 01:01:00
【问题描述】:

我已经设置了一个入口资源来将请求路由到单个服务。

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    #kubernetes.io/ingress.class: nginx
    #ingress.kubernetes.io/rewrite-target: /

spec:
  defaultBackend:
    service:
      name: dashboard
      port:
        number: 80
$ kubectl get ing
NAME              CLASS    HOSTS   ADDRESS         PORTS   AGE
example-ingress   <none>   *       102.16.50.202   80      3m28s

nginx 控制器:

$ kubectl get pods -n ingress-nginx
NAME                                        READY   STATUS      RESTARTS      AGE
ingress-nginx-admission-create--1-gl59f     0/1     Completed   0             15h
ingress-nginx-admission-patch--1-9kbz6      0/1     Completed   0             15h
ingress-nginx-controller-54d8b558d4-2ss8f   1/1     Running     1 (13h ago)   15h

$ kubectl get svc -n ingress-nginx
NAME                                 TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                      AGE
ingress-nginx-controller             LoadBalancer   10.233.48.242   102.16.50.202   80:31690/TCP,443:32666/TCP   15h
ingress-nginx-controller-admission   ClusterIP      10.233.17.68    <none>          443/TCP                      15h

我能够通过控制器的集群 IP 访问服务并获得响应:

$ curl -i 10.233.48.242
HTTP/1.1 200 OK
Date: Tue, 08 Feb 2022 04:50:44 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 2306
Connection: keep-alive
X-Powered-By: Express
Accept-Ranges: bytes
Cache-Control: public, max-age=0
Last-Modified: Tue, 25 Jan 2022 09:35:14 GMT
ETag: W/"902-17e9096e050"
...

但不在其(nginx 控制器的)外部 IP 地址上:

$ curl -i 102.16.50.202
curl: (7) Failed to connect to 102.16.50.202 port 80: Connection refused

$ curl -i http://102.16.50.202
curl: (7) Failed to connect to 102.16.50.202 port 80: Connection refused

$ curl -i http://102.16.50.202/
curl: (7) Failed to connect to 102.16.50.202 port 80: Connection refused

我尝试创建一个新路径(前缀),将服务类型更改为 NodePort,禁用防火墙,但没有成功;同样的问题。

任何观察或意见都会有很大帮助。谢谢。

编辑-1:

安装了nginx入口控制器(kubectl apply)而不修改default configuration

#file: ingress-controller-deploy.yml
...
apiVersion: v1
kind: Service
metadata:
  annotations:
  labels:
    helm.sh/chart: ingress-nginx-4.0.15
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.1.1
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ipFamilyPolicy: SingleStack
  ipFamilies:
    - IPv4
  ports:
    - name: http
      port: 80
      protocol: TCP
      targetPort: http
      appProtocol: http
    - name: https
      port: 443
      protocol: TCP
      targetPort: https
      appProtocol: https
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/component: controller

如果我使用负载平衡器,externalTrafficPolicy:Local 似乎没问题,在我的例子中是MetalLB

#file: ingress-controller-deploy.yml
apiVersion: apps/v1
kind: Deployment
...
          securityContext:
            capabilities:
              drop:
                - ALL
              add:
                - NET_BIND_SERVICE
            runAsUser: 101
            allowPrivilegeEscalation: true

securityContext 部分似乎也不错。

【问题讨论】:

  • 嗨,Deepak,您使用的是哪种 k8s 集群?哪个版本?
  • 谢谢。我的集群是multi-master stacked cluster,使用 haproxy 和 keealived 作为主节点的负载均衡器,如this article 中所述。 Kubernetes 版本 1.22.1 配置为最新的 kubekey 支持。
  • 经过一番研究,我发现这是一个问题kubernetes/ingress-nginx/issues#552。想知道它在我正在使用的最新 nginx-ingress-controller 版本中得到修复吗?

标签: kubernetes nginx-ingress


【解决方案1】:

入口对象不是您的问题。您必须专注于入口控制器设置。另外,您使用的是哪种负载平衡机制?如果您在 Bare Metal 上,则需要部署类似 MetalLB 之类的东西,您可能已经拥有了(否则 LoadBalancer 类型的服务将保持挂起状态)。

可以在https://kubernetes.github.io/ingress-nginx/deploy/baremetal/找到有关此主题的良好文档

【讨论】:

  • 谢谢。是的,我正在使用 MetalLB。到目前为止,我还没有过多考虑ingress-nginx-controller deployment.yml。我已经编辑了这个问题。我想我在这里遗漏了一些明显的东西。
【解决方案2】:

我在裸机设置中遇到了完全相同的问题。唯一的区别是我使用的是kube-vip 而不是MetalLB。当我将ingress-nginx-controller 服务上的externalTrafficPolicy 更改为Cluster 时,它终于得到了修复。

我无法解释为什么,但我能想出的最接近的是负载均衡器 IP 是由我的裸机设置的 node-1 获得的,而 Web 前端计划在 node-2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-01
    • 1970-01-01
    • 2022-01-26
    • 2023-03-16
    • 2017-01-13
    • 1970-01-01
    • 2017-10-02
    • 2017-07-30
    相关资源
    最近更新 更多