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



我在内部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入口控制器,第二个用于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命令,它将为我创建Ingress控制器。这将需要几分钟的时间来提供它。

  • 此外,我需要打开防火墙规则,该规则将允许主节点访问端口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(/|$)(.*)

相关内容

  • 没有找到相关文章

最新更新