我正在尝试设置入口负载均衡器。 基本上,我只有一个具有多个路径的后端服务。
假设我的后端NodePort服务名称是hello-app。与该服务关联的pod公开了多个路径,例如/ foo和/ bar。下面是示例
NodePort服务和相关的部署
apiVersion: v1
kind: Service
metadata:
name: hello-app
spec:
selector:
app: hello-app
type: NodePort
ports:
- protocol: "TCP"
port: 7799
targetPort: 7799
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
labels:
app: hello-app
spec:
replicas: 1
selector:
matchLabels:
app: hello-app
template:
metadata:
labels:
app: hello-app
spec:
containers:
- name: hello-app
image: us.gcr.io/hello-app:latest
现在像下面这样发出请求,我面临404错误。
http://{ingress-address:port}/foo
http://{ingress-address:port}/bar
我尝试了以下入口配置,但是在两种情况下都没有帮助。
入口配置1
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: basic-ingress
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: hello-app
servicePort: 7799
入口配置2
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: basic-ingress
spec:
backend:
serviceName: hello-app
servicePort: 7799
错误消息
10.88.16.10--[2019年1月20日08:50:55]“ GET / HTTP / 1.1” 404- [2019-01-20 08:50:55] [INFO] [_internal] [_log] 10.88.16.10--[20 / Jan / 2019 08:50:55]“ GET / HTTP / 1.1” 404-
我已经研究了this链接中提到的示例,但是它假定不同的路径引用了不同的后端服务。就我而言,多个路径属于同一后端服务。
似乎完整路径没有从入口转发到下游后端服务,这导致了无效请求。 有人可以建议为上述要求配置入口的正确方法是什么吗?
答案 0 :(得分:2)
了解更多有关入口的知识后回答我的问题。
这不是错误的路径转发到下游的问题。 基本上是gke入口控制器,期望后端有一个就绪探针。 我在部署中缺少此功能,因为它的进入将后端标记为“未知”
最终阅读下面其他有关stackoverflow的问题有助于我解决问题
gcp-load-balancer-backend-status-unknown
kubernetes-ingress-gce-keeps-returning-502-error
在按如下所述准备就绪探针之后,Ingress能够正确检测后端并将请求转发给后端。
apiVersion: apps/v1
kind: Deployment
metadata:
name: hello-app
labels:
app: hello-app
spec:
replicas: 1
selector:
matchLabels:
app: hello-app
template:
metadata:
labels:
app: hello-app
spec:
containers:
- name: hello-app
image: us.gcr.io/hello-app:latest
readinessProbe:
httpGet:
path: /healthz
port: 7799
periodSeconds: 1
timeoutSeconds: 1
successThreshold: 1
failureThreshold: 10
答案 1 :(得分:0)
要将多路径与glbc入口一起使用,您需要使用不同的服务名称,例如以下示例,并且每个服务(后端)具有不同的路径,并且可以配置一个入口(不是两个)。
因此,除非您想拥有两个负载均衡器,否则不需要两个入口
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: fanout-ingress
spec:
rules:
- http:
paths:
- path: /*
backend:
serviceName: web
servicePort: 8080
- path: /v2/*
backend:
serviceName: web2
servicePort: 8080
有多端口服务,Kubernetes在服务对象上支持多个端口定义。使用多个端口时,必须提供所有端口名称。参见下面的示例
这是使用带有nginx的kubernetes入口的答案。
kind: Service
apiVersion: v1
metadata:
name: my-service
spec:
selector:
app: MyApp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 9376
- name: https
protocol: TCP
port: 443
targetPort: 9377