繁体   English   中英

GKE - 使用 Ingress 和内部负载平衡公开服务

[英]GKE - expose service with Ingress and Internal Load Balancing

我在内部 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

我的入口配置如下:

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 配置中缺少什么? 我该如何修复这些重写?

我解决了这个问题并将其写在这里以备忘,希望有人会觉得它有用。

  • 第一个问题是我混合了注释类型。 GKE 入口 controller 之一,第二个用于 Nginx 服务器 controller。目前 GKE 入口 controller 不支持 URL 重写功能,因此我需要使用 88275931085182394085418 入口

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


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

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

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

之后我可以运行kubectl apply -f deploy.yaml命令,这将为我创建 Ingress controller。 配置它需要几分钟时间。

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

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

     apiVersion:.networking.k8s.io/v1beta1 kind: Ingress metadata: annotations: nginx.ingress.kube.netes.io/rewrite-target: /$2 kube.netes.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(/|$)(.*)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM