【问题标题】:GKE - expose service with Ingress and Internal Load BalancingGKE - 使用 Ingress 和内部负载平衡公开服务
【发布时间】:2021-09-01 04:09:05
【问题描述】:

我在内部 GKE 集群上有 REST API Web 服务,我想通过内部 HTTP 负载平衡公开它。

让我们将此服务称为“蓝色”服务: 我想在以下映射中公开它:

http://api.xxx.yyy.internal/blue/isalive -> http://blue-service/isalive
http://api.xxx.yyy.internal/blue/v1/get -> http://blue-service/v1/get
http://api.xxx.yyy.internal/blue/v1/create -> http://blue-service/v1/create
http://api.xxx.yyy.internal/ -> http://blue-service/ (expose Swagger)

我省略了部署 yaml,因为它与讨论不太相关。

但我的服务 yaml 看起来像这样:

apiVersion: v1
kind: Service
metadata:
  name: blue-service
spec:
  type: NodePort
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: blue-service

我的 Ingress 配置如下:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: blue-ingress
  annotations:
    kubernetes.io/ingress.class: "gce-internal"
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    ingress.kubernetes.io/rewrite-target: /$2
spec:
  rules:
  - host: api.xxx.yyy.internal
    http:
      paths:
      - path: /blue/*
        backend:
          serviceName: blue-service
          servicePort: 80

但是,我收到所有请求的 404。 /blue/v1/get/blue/v1/create/blue/isalive 返回 404。

在我的“蓝色”应用程序中,我记录了我所有的 notFound 请求,我可以清楚地看到我的 URI 没有被重写,到达应用程序的请求是 /blue/v1/get/blue/v1/create/blue/isalive

Ingress 配置中缺少什么?我该如何修复这些重写?

【问题讨论】:

  • 您的重写目标无法工作,因为您没有在spec.rules[0].http.paths[0].path 中捕获任何表达式。见kubernetes.github.io/ingress-nginx/examples/rewrite/…
  • 如果我将路径更改为 ''/blue(/|$)(.*)",我会从负载均衡器收到以下信息:错误 400:字段 'resource' 的值无效:'{ “名称”:“k8s2-um-a0tq0oxi-default-blue-ingress-w0chp90v”,“hostRule”:[{“主机”:[“api.putin ....”。路径模式无效,无效
  • GCE 入口控制器不支持重写注释(见github.com/kubernetes/ingress-gce/issues/109)。您可以安装支持此功能的 nginx 入口控制器。将来,您还应该能够使用目前处于预览状态的新网关控制器 (cloud.google.com/kubernetes-engine/docs/concepts/gateway-api)。
  • 您也可以安装 Istio 或 Anthos Service Mesh 并使用 Istio VirtualService 资源。

标签: nginx kubernetes url-rewriting google-kubernetes-engine kubernetes-ingress


【解决方案1】:

我解决了这个问题并将它写在这里作为备忘录,希望有人会发现它很有用。

  • 第一个问题是我有混合注释类型。 GKE 入口控制器之一,第二个用于 Nginx 服务器控制器。目前 GKE 入口控制器不支持 URL 重写功能,所以我需要使用 nginx 入口控制器。

  • 所以我需要安装基于 Nginx 的入口控制器。它可以使用 Helm 图表或部署 yaml 轻松完成。但是,默认情况下,此控制器将使用外部负载均衡器公开入口,这不是我想要的。所以我们需要修改这个控制器的部署图表或者 YAML 文件。 我没有使用 Helm,所以我使用 wget 命令下载了 yaml 本身。


    wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.47.0/deploy/static/provider/cloud/deploy.yaml

在编辑器中打开它,在命名空间ingress-nginx 中找到服务名称ingress-nginx-controller 的定义。添加以下注释。

cloud.google.com/load-balancer-type: "Internal"  

之后我可以运行kubectl apply -f deploy.yaml 命令,该命令将为我创建入口控制器。配置它需要几分钟时间。

  • 此外,我需要打开防火墙规则,允许主节点访问端口 8443/tcp 上的工作节点。

  • 最后一项是入口 yaml 本身,应该如下所示:

    
     apiVersion: networking.k8s.io/v1beta1
     kind: Ingress
     metadata:
       annotations:
         nginx.ingress.kubernetes.io/rewrite-target: /$2
         kubernetes.io/ingress.class: "nginx"
       name: blue-ingress
       namespace: default
     spec:
       rules:
       - host: api.xxx.yyy.internal
         http:
           paths:
           - backend:
               serviceName: blue-service
               servicePort: 80
             path: /blue(/|$)(.*)

【讨论】:

    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-20
    • 2015-04-01
    相关资源
    最近更新 更多