我正在使用 Google 云,并且有两个 GKE 私有集群。
其中一个集群包含一些以 nodePort 形式安装的服务。另一个集群需要连接到这个集群并访问暴露的服务。
公开服务的集群只有一个具有私有 IP 的节点。我可以使用这个私有 IP 从另一个集群成功 ping 此节点。
但是我怎样才能访问这些服务呢?
我也尝试配置一些防火墙规则,但没有成功。
答案1
如果我理解您的情况正确的话,那么您有 2 个私有 GKE 集群,并且想知道是否可以从另一个集群访问在一个集群上运行的应用程序。
简短而普遍的回答是是的,有可能。
下面你可以看到我测试的细节和证明。我快速构建了以下设置(两个集群完全相同,除了Master/Service/Pod address ranges
):
cluster-4
Cluster Master version: 1.14.10-gke.27
Total size: 1
Network: default
Subnet: default
VPC-native (alias IP): Enabled
Pod address range: 10.24.0.0/14
Service address range: 10.0.32.0/20
Private cluster: Enabled
Master address range: 172.16.1.0/28
cluster-5
Pod address range: 10.60.0.0/14
Service address range: 10.127.0.0/20
Private cluster: Enabled
Master address range: 172.16.2.0/28
防火墙配置应允许从“Pod 地址范围”到节点的流量。换句话说,来自集群 5“Pod 地址范围”的流量应传送到集群 4 的节点 IP。
为此,我添加了一条规则,允许 tcp 流量从 10.60.0.0/14 到端口 31526 上的“网络中的所有节点”。
我的 nginx 运行于cluster-4
$ kubectl get nodes -o wide
NAME STATUS AGE VERSION INTERNAL-IP EXTERNAL-IP
gke-cluster-4 Ready 48m v1.14.10-gke.27 10.128.0.12
$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
hello-nginx NodePort 10.0.40.183 <none> 80:31526/TCP 2m23s
因此我的 nginx 将可供10.128.0.12:31526
我之外的所有客户端使用cluster-4
。
我已经运行了一个 busybox podcluster-5
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
busybox-68dc67fcc5-gwd95 1/1 Running 0 11s
并尝试访问我的 nginx。
$ kubectl exec -it busybox-68dc67fcc5-gwd95 -- sh
# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.60.0.1 0.0.0.0 UG 0 0 0 eth0
10.60.0.0 * 255.255.255.0 U 0 0 0 eth0
# wget 10.128.0.12:31526
Connecting to 10.128.0.12:31526 (10.128.0.12:31526)
saving to 'index.html'
index.html 100% |************| 612 0:00:00 ETA
'index.html' saved
这是分配给我的节点上的接口的10.60.0.1
IP 地址。cbr0
cluster-5
kiwi@gke-cluster-5 ~ $ ifconfig
cbr0: flags=4419<UP,BROADCAST,RUNNING,PROMISC,MULTICAST> mtu 1460
inet 10.60.0.1
最后但同样重要的一点是,我检查了官方文档中关于该主题的内容,结果发现它与我的发现完全一致。
私有集群使您能够将节点与公共互联网的入站和出站连接隔离开来。这是因为节点仅具有内部 RFC 1918 IP 地址。
即使节点 IP 地址是私有的,外部客户端也可以访问集群中的服务。如果我们谈论 NodePort 类型的服务,那么就需要创建一个 Ingress。
GKE 使用 Service 和 Ingress 中的信息来配置 HTTP(S) 负载均衡器。然后,外部客户端可以调用HTTP(S) 负载均衡器。