Kubernetes Ingress Controller返回503服务不可用

时间:2019-09-13 19:58:33

标签: kubernetes kubernetes-ingress

因此,我有一个将流量路由到三个不同服务的入口控制器,但是只有一个在工作,其他所有都返回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 ...,但没有任何效果,欢迎任何帮助

3 个答案:

答案 0 :(得分:2)

如果可以的话,应将服务保留为ClusterIP。入口控制器的目的是使您的集群具有一个集中式入口。

首先要尝试的

首先独立测试您的服务。 (两个不起作用)。进入另一个正在运行的pod,然后执行以下操作:

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

如果它不起作用,那么您只知道运行这两个服务的实际容器/吊舱,就可以集中精力解决该问题。

第二件事尝试

简化您的进入规则。首先删除/equip-ws的路径,只保留/hello/equip的路径。

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

然后使用简化的入口规则再次测试http://localhost/hellohttp://localhost/equip

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

答案 1 :(得分:2)

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

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

帮我找到了。

答案 2 :(得分:1)

终于找到了解决方案, 根据{{​​3}}的建议,我将规则拆分到不同的主机上,但是仍然没有成功,因此,我没有使用路径,而是在主机上添加了前缀,然后它起作用了。

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