TL;DR 在 GKE 私有集群中,我无法使用内部/私有 IP 公开服务。
我们的部署由大约 20 个微服务和 4 个单体组成,目前完全在 GoogleCloud 上的虚拟机上运行。我正在尝试将此基础架构移至 GKE。该项目的第一步是构建一个私有 GKE 集群(即没有任何公共 IP)作为我们的暂存的替代。由于这是暂存的,我需要在内部公开所有微服务端点以及单体端点以用于调试目的(意味着,仅对那些连接到 VPC 的端点),这就是我卡住的地方。我尝试了两种方法:
- 在每个服务和单体之前放置一个内部负载均衡器 (ILB)。例子:
apiVersion: v1
kind: Service
metadata:
name: session
annotations:
cloud.google.com/load-balancer-type: "Internal"
labels:
app: session
type: ms
spec:
type: LoadBalancer
selector:
app: session
ports:
- name: grpc
port: 80
targetPort: 80
protocol: TCP
这可行,但有严重的限制。ILB 创建转发规则,GCP限制每个网络 75 条转发规则。这意味着我们不能在一个网络中构建超过 3 个集群。我们不能接受。
- 一个。我尝试在所有服务前面放置一个入口控制器,它总是使用公共 IP 公开整个集群 - 绝对禁止。
apiVersion: extensions/v1beta1
kind: Ingress
hostNetwork: true
metadata:
name: ingress-ms-lb
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
rules:
- host: gs03
http:
paths:
- path: /autodelivery/*
backend:
serviceName: autodelivery
servicePort: 80
- path: /session/*
backend:
serviceName: session
servicePort: 80
湾。我尝试使用 nginx 入口控制器,但最终根本没有 ip。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: ingress-ms-lb
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
# cloud.google.com/load-balancer-type: "Internal"
nginx.ingress.kubernetes.io/ingress.class: nginx
kubernetes.io/ingress.class: "nginx"
# nginx.ingress.kubernetes.io/whitelist-source-range: 10.100.0.0/16, 10.110.0.0/16
spec:
rules:
- host: svclb
http:
paths:
- path: /autodelivery/*
backend:
serviceName: autodelivery
servicePort: 80
- path: /session/*
backend:
serviceName: session
servicePort: 80
第三个选项是配置防火墙规则,这将切断对公共 IP 的任何访问。考虑到安全问题,这在内部被拒绝了。
我被困在这个阶段,需要一些指示才能继续前进。请帮忙