![](/img/trans.png)
[英]How do I expose a UDP service externally on Google Kubernetes Engine (GKE) using the ingress-nginx controller?
[英]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.