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

问题描述 投票:0回答:3

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

假设我的后端 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

现在 onn 提出如下请求,我面临 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 - - [20/1/2019 08:50:55]“GET / HTTP/1.1”404 - [2019-01-20 08:50:55] [INFO] [_internal] [_log] 10.88.16.10 - - [20/1/2019 08:50:55]“GET / HTTP/1.1”404 -

我已经查看了this链接中提到的示例,但它假设不同的路径引用不同的后端服务。就我而言,多个路径属于同一个后端服务。

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

kubernetes-ingress google-kubernetes-engine
3个回答
4
投票

要将多路径与 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 支持在一个服务对象上定义多个端口。使用多个端口时,您必须给出所有端口名称。请看下面的例子

这是使用 kubernetes ingress 和 nginx 的答案。

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

2
投票

了解更多有关 ingress 的信息后回答我的问题。

这不是下游路径转发错误的问题。 基本上,gke 入口控制器期望后端存在就绪探针。 我在部署中遗漏了这一点,因此入口将后端标记为“未知”

最终阅读下面的其他 stackoverflow 问题帮助我解决了问题

gcp-负载均衡器-后端状态-未知

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     

-2
投票

这里显示这样做可以:

- pathType: Prefix
  path: "/foo, /bar"
  backend:
    service: xxx
© www.soinside.com 2019 - 2024. All rights reserved.