【问题标题】:K8s Ingress rule for multiple paths in same backend service同一后端服务中多个路径的 K8s Ingress 规则
【发布时间】:2019-06-13 23:01:07
【问题描述】:

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

假设我的后端 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 - - [20/Jan/2019 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 链接中提到的示例,但它假定不同的路径引用不同的后端服务。在我的例子中,多个路径属于同一个后端服务。

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

【问题讨论】:

    标签: kubernetes-ingress google-kubernetes-engine


    【解决方案1】:

    要将多路径与 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
    

    【讨论】:

    • 感谢您的回答,Alloua。我理解这个概念。但通常单个服务也会暴露多个端点。我们如何满足这个用例?每个服务只有 1 个休息端点成为开销。如果我在这里的理解有误,请纠正我。
    【解决方案2】:

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

    这不是错误路径转发到下游的问题。 基本上 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     
    

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 2020-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 2018-03-04
      • 1970-01-01
      • 2021-10-26
      相关资源
      最近更新 更多