Kubernetes 入口控制器返回 503 服务不可用

Kubernetes Ingress Controller returning 503 Service Unavailable

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

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

首先尝试

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

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

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

第二个尝试

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

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

然后在更改简化入口规则的情况下再次测试 http://localhost/hellohttp://localhost/equip

如果这有效,那么您就知道您的入口规则中的两个设备路径导致了问题,您可以在那里修复 conflict/issue。

终于找到解决办法了, 正如 @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

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

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

帮我找到了。

起诉你的服务和入口部署在同一个 namspace