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/hello
和 http://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
所以,我有一个入口控制器将流量路由到三个不同的服务,但只有一个在工作,所有其他的都返回 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/hello
和 http://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