同一后端服务中多个路径的K8s入口规则

时间:2019-01-20 09:08:59

标签: kubernetes-ingress google-kubernetes-engine

我正在尝试设置入口负载均衡器。 基本上,我只有一个具有多个路径的后端服务。

假设我的后端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链接中提到的示例,但是它假定不同的路径引用了不同的后端服务。就我而言,多个路径属于同一后端服务。

似乎完整路径没有从入口转发到下游后端服务,这导致了无效请求。 有人可以建议为上述要求配置入口的正确方法是什么吗?

2 个答案:

答案 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
相关问题