【问题标题】:Kubernetes Ingress Controller returning 503 Service UnavailableKubernetes Ingress Controller 返回 503 Service Unavailable
【发布时间】:2019-09-13 19:58:33
【问题描述】:

所以,我有一个入口控制器将流量路由到三个不同的服务,但只有一个在工作,所有其他的都返回 503。 INGRESS YAML

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: test-ingress
  namespace: dev
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/backend-protocol: "HTTP"
spec:
  rules:
  - host: localhost
    http:
      paths:
      - path: /equip
        backend:
            serviceName: web-equip-svc-2
            servicePort: 18001
      - path: /hello
        backend:
            serviceName: hello-service
            servicePort: 80
      - path: /equip-ws
        backend:
            serviceName: web-equip-svc-2
            servicePort: 18000

工作 SVC YAML

apiVersion: v1
kind: Service
metadata:
  name: hello-service
  namespace: linkerd-test
  labels:
    app: hello
spec:
  type: ClusterIP
  selector:
    app: hello
  ports:
  - port: 80
    targetPort: 8080
    protocol: TCP

无法使用 SVC YAML

---
apiVersion: v1
kind: Service
metadata:
  name: web-equip-svc-2
  namespace: dev
  labels:
    app: equipment-service
spec:
  type: ClusterIP
  selector:
    app: equipment-service
  ports:
  - name: "http"
    port: 18001
    targetPort: 8080
    protocol: TCP
  - name: "websocket"
    port: 18000
    targetPort: 8080
    protocol: TCP

所以,我已经尝试将注解从 ingress 更改,将 svc 从 clusterIP 更改为 loadBalancer……但没有任何效果,欢迎任何帮助

【问题讨论】:

  • 我认为这种情况下的问题是:您可以从其他 pod 访问 web-equip-svc-2:18001 和 web-equip-svc-2:18000 吗?

标签: kubernetes kubernetes-ingress


【解决方案1】:

如果可以,您应该将您的服务保留为 ClusterIP。 Ingress Controller 的目的是让一个集中的入口进入您的集群。

首先要尝试

首先独立测试您的服务。 (这两个不工作)。执行到另一个正在运行的 pod,然后执行:

curl http://web-equip-svc-2:18001 并查看您是否收到直接返回到服务而不是通过您的入口的响应。如果一切正常,那么您就知道您的入口规则配置和/或控制器存在问题。

如果它不起作用,那么您知道它只是运行这两个服务的实际容器/pod,您可以专注于那里并首先解决那里的问题。

第二次尝试

简化您的入口规则。删除/equip-ws 的路径作为开始,只保留/hello/equip 的路径。

      - path: /equip-ws
        backend:
            serviceName: web-equip-svc-2
            servicePort: 18000

然后再次测试 http://localhost/hellohttp://localhost/equip 并更改简化的入口规则。

如果这可行,那么您知道您的入口规则中的两条装备路径导致了问题,您可以在那里解决冲突/问题。

【讨论】:

  • 我能够使用 curl 并获得有效响应,但仍然没有成功进入。已经尝试过 Hello and Equip。问题依旧
  • 您是否尝试将涵盖三个 / 路径的入口规则拆分为单独的入口规则(所有入口规则都具有相同的主机名 localhost,但每个路径都有不同的路径)?您是否还可以尝试在运行您的一个工作入口服务的一个命名空间中运行您的测试 pod/服务?看来您正在将入口规则和服务拆分为多个不同的命名空间。为了排除这是一个潜在问题,我建议将所有内容放在一个命名空间中开始测试。
  • 尝试了这两个想法,所有应用程序都在与 Ingress 相同的命名空间上运行,并且确实将单个规则拆分为两个规则。没有成功。 :(
  • 我已经设法让它工作了。我按照你的建议做了并拆分了主机,但是我没有添加路径(localhost/hello),而是添加了作为主机的一部分,所以 hello.localhost。它奏效了!对于所有三项服务,甚至是 websocket 一项。感谢您的帮助。
【解决方案2】:

对我来说,我在另一个命名空间中对同一主机有另一个入口(我忘了 它)

kubectl get ingress --all-namespaces | grep <HOST>

帮我找到了。

【讨论】:

    【解决方案3】:

    终于找到了解决办法, 正如@Shogan 建议的那样,我将规则拆分到不同的主机上,但仍然没有成功,所以我没有使用路径,而是为主机添加了前缀并且它起作用了。

    rules:
      - host: hello.localhost
        http:
          paths:
          - path: /hello
            backend:
              serviceName: hello-service
              servicePort: 280
      - host: equip.localhost
        http:
          paths:
          - backend:
              serviceName: web-equip-svc
              servicePort: 18001
      - host: ws.equip.localhost
        http:
          paths:
          - backend:
              serviceName: web-equip-svc
              servicePort: 18000
    

    【讨论】:

      【解决方案4】:

      make sue you service 和 ingress 部署在同一个 namspace 上

      【讨论】:

      猜你喜欢
      • 2019-09-25
      • 2023-01-08
      • 2014-10-27
      • 2014-12-12
      • 1970-01-01
      • 2019-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多