[英]VPC native Clusters in GKE can't communicate in GKE 1.14
我在 K8s 1.14.10 上创建了两个单独的 GKE 集群。
我遵循了这个和 IP 伪装代理文档。 我尝试使用客户端 pod 和服务器 pod 来交换消息来对此进行测试。 我正在使用内部节点 IP 发送消息并创建一个 ClusterIP 来公开 Pod。
我已允许对防火墙规则中的每个实例的请求以进行入口和出口,即0.0.0.0/0 。 图片:这是我创建的集群的描述IP 伪装代理的配置 map 与文档中的相同。 我可以从 pod 中 ping 另一个节点,但 curl 请求说连接被拒绝并且 tcpdump 显示没有数据。
问题:我需要在 gke 1.14 中从集群 A 与集群 B 通信,并将 ipmasquerading 设置为 true。 我要么连接被拒绝,要么 i/o 超时。 我尝试过使用内部和外部节点 IP 以及使用负载均衡器。
您提供了相当笼统的信息,没有详细信息,我无法提供具体的场景答案。 这可能与您如何创建集群或其他防火墙设置有关。 因此,我将提供正确的步骤来创建和配置 2 个带有 firewall 和masquerade
的集群。 也许您将能够找到您错过或错误配置的步骤。
集群配置(节点、pods、svc)在答案的底部。
1.创建VPC和2个集群
在文档中它说大约 2 个不同的项目,但您可以在一个项目中完成。 可以在 GKE 文档中找到 VPC 创建和 2 个集群的良好示例。 创建 VPC和Crate 2 集群。 在集群Tier1
中,您现在可以启用NetworkPolicy
,而不是以后再启用它。 之后,您将需要创建防火墙规则。 您还需要将ICMP
协议添加到防火墙规则。
此时,您应该能够在 2 个集群的节点之间 ping 通。
有关其他防火墙规则(允许 pod、svc 等之间的连接),请查看此文档。
2.启用IP伪装代理
如文档中所述,运行IPMasquerade
:
如果满足以下一项或多项条件,则 ip-masq-agent DaemonSet 会作为带有 --nomasq-all-reserved-ranges 参数的插件自动安装在 GKE 集群中:
集群有一个网络策略。
或者
Pod 的 CIDR 范围不在 10.0.0.0/8 之内。
这意味着tier-2-cluster
在kube-system
命名空间中已经有ip-masq-agent
(因为The Pod's CIDR range is not within 10.0.0.0/8.
)。 如果您在创建tier-1-cluster
期间启用了NetworkPolicy
,它应该也已安装。 如果没有,您将需要使用以下命令启用它:
$ gcloud container clusters update tier-1-cluster --update-addons=NetworkPolicy=ENABLED --zone=us-central1-a
要验证一切是否正常,您必须检查是否创建了Daemonset ip-masq-agent
pod。 (节点的每个 pod)。
$ kubectl get ds ip-masq-agent -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
ip-masq-agent 3 3 3 3 3 beta.kubernetes.io/masq-agent-ds-ready=true 168m
如果您将 SSH 连接到您的任何节点,您将能够看到默认的iptables
条目。
$ sudo iptables -t nat -L IP-MASQ
Chain IP-MASQ (1 references)
target prot opt source destination
RETURN all -- anywhere 169.254.0.0/16 /* ip-masq: local traffic is not subject to MASQUERADE */
RETURN all -- anywhere 10.0.0.0/8 /* ip-masq: RFC 1918 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 172.16.0.0/12 /* ip-masq: RFC 1918 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 192.168.0.0/16 /* ip-masq: RFC 1918 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 240.0.0.0/4 /* ip-masq: RFC 5735 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 192.0.2.0/24 /* ip-masq: RFC 5737 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 198.51.100.0/24 /* ip-masq: RFC 5737 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 203.0.113.0/24 /* ip-masq: RFC 5737 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 100.64.0.0/10 /* ip-masq: RFC 6598 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 198.18.0.0/15 /* ip-masq: RFC 6815 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 192.0.0.0/24 /* ip-masq: RFC 6890 reserved range is not subject to MASQUERADE */
RETURN all -- anywhere 192.88.99.0/24 /* ip-masq: RFC 7526 reserved range is not subject to MASQUERADE */
MASQUERADE all -- anywhere anywhere /* ip-masq: outbound traffic is subject to MASQUERADE (must be last in chain) */
3. 部署测试应用
我使用了GKE 文档中的 Hello 应用程序并部署在两个集群上。 此外,我还部署了 ubuntu 映像进行测试。
4.为IPMasquerade应用正确的配置这个配置需要在source
集群上。
简而言之,如果目标 CIDR 在nonMasqueradeCIDRs:
中,它将显示它内部 IP,否则它将显示 NodeIP 作为源。
保存到文本下方的文件config
:
nonMasqueradeCIDRs:
- 10.0.0.0/8
resyncInterval: 2s
masqLinkLocal: true
创建 IPMasquarade ConfigMap
$ kubectl create configmap ip-masq-agent --from-file config --namespace kube-system
它将覆盖iptables
配置
$ sudo iptables -t nat -L IP-MASQ
Chain IP-MASQ (2 references)
target prot opt source destination
RETURN all -- anywhere 10.0.0.0/8 /* ip-masq-agent: local traffic is not subject to MASQUERADE */
MASQUERADE all -- anywhere anywhere /* ip-masq-agent: outbound traffic is subject to MASQUERADE (must be last in chain) */
5. 测试:
当 IP 被伪装时
SSH 到 Node 形成Tier2
集群并运行:
sudo toolbox bash
apt-get update
apt install -y tcpdump
现在您应该使用下面的命令收听。 端口32502
是来自Tier 2
集群的NodePort
服务
tcpdump -i eth0 -nn -s0 -v port 32502
在 Cluster Tier1
中,您需要输入 ubuntu pod 和 curl NodeIP:NodePort
$ kubectl exec -ti ubuntu -- bin/bash
您需要安装 curl apt-get install curl
。
curl NodeIP:NodePort(正在侦听的节点,来自集群第 2 层服务的 NodePort)。
命令行界面:
root@ubuntu:/# curl 172.16.4.3:32502
Hello, world!
Version: 2.0.0
Hostname: hello-world-deployment-7f67f479f5-h4wdm
在 Node 上,您可以看到如下条目:
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
12:53:30.321641 IP (tos 0x0, ttl 63, id 25373, offset 0, flags [DF], proto TCP (6), length 60)
10.0.4.4.56018 > 172.16.4.3.32502: Flags [S], cksum 0x8648 (correct), seq 3001889856
10.0.4.4
是NodeIP
pod 所在的 NodeIP。
当 IP 未被伪装时
从集群第 1 层移除ConfigMap
$ kubectl delete cm ip-masq-agent -n kube-system
将文件config
CIDR 更改为172.16.4.0/22
,这是Tier 2
节点池并重新应用 CM
$ kubectl create configmap ip-masq-agent --from-file config --namespace kube-system
SSH 从第 1 层的任何节点检查iptables rules
是否已更改。
sudo iptables -t nat -L IP-MASQ
Chain IP-MASQ (2 references)
target prot opt source destination
RETURN all -- anywhere 172.16.4.0/22 /* ip-masq-agent: local traffic is not subject to MASQUERADE */
MASQUERADE all -- anywhere anywhere /* ip-masq-agent: outbound traffic is subject to MASQUERADE (must be last in chain) */
现在进行测试,我再次使用了 Ubuntu 吊舱和 curl 和以前一样的 ip。
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
13:16:50.316234 IP (tos 0x0, ttl 63, id 53160, offset 0, flags [DF], proto TCP (6), length 60)
10.4.2.8.57876 > 172.16.4.3.32502
10.4.2.8
是 Ubuntu 吊舱的内部 IP。
测试配置:
一级
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/hello-world-deployment-7f67f479f5-b2qqz 1/1 Running 0 15m 10.4.1.8 gke-tier-1-cluster-default-pool-e006097b-5tnj <none> <none>
pod/hello-world-deployment-7f67f479f5-shqrt 1/1 Running 0 15m 10.4.2.5 gke-tier-1-cluster-default-pool-e006097b-lfvh <none> <none>
pod/hello-world-deployment-7f67f479f5-x7jvr 1/1 Running 0 15m 10.4.0.8 gke-tier-1-cluster-default-pool-e006097b-1wbf <none> <none>
ubuntu 1/1 Running 0 91s 10.4.2.8 gke-tier-1-cluster-default-pool-e006097b-lfvh <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/hello-world NodePort 10.0.36.46 <none> 60000:31694/TCP 14m department=world,greeting=hello
service/kubernetes ClusterIP 10.0.32.1 <none> 443/TCP 115m <none>
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node/gke-tier-1-cluster-default-pool-e006097b-1wbf Ready <none> 115m v1.14.10-gke.36 10.0.4.2 35.184.38.21 Container-Optimized OS from Google 4.14.138+ docker://18.9.7
node/gke-tier-1-cluster-default-pool-e006097b-5tnj Ready <none> 115m v1.14.10-gke.36 10.0.4.3 35.184.207.20 Container-Optimized OS from Google 4.14.138+ docker://18.9.7
node/gke-tier-1-cluster-default-pool-e006097b-lfvh Ready <none> 115m v1.14.10-gke.36 10.0.4.4 35.226.105.31 Container-Optimized OS from Google 4.14.138+ docker://18.9.7<none> 100m v1.14.10-gke.36 10.0.4.4 35.226.105.31 Container-Optimized OS from Google 4.14.138+ docker://18.9.7
2级
$ kubectl get pods,svc,nodes -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/hello-world-deployment-7f67f479f5-92zvk 1/1 Running 0 12m 172.20.1.5 gke-tier-2-cluster-default-pool-57b1cc66-xqt5 <none> <none>
pod/hello-world-deployment-7f67f479f5-h4wdm 1/1 Running 0 12m 172.20.1.6 gke-tier-2-cluster-default-pool-57b1cc66-xqt5 <none> <none>
pod/hello-world-deployment-7f67f479f5-m85jn 1/1 Running 0 12m 172.20.1.7 gke-tier-2-cluster-default-pool-57b1cc66-xqt5 <none> <none>
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/hello-world NodePort 172.16.24.206 <none> 60000:32502/TCP 12m department=world,greeting=hello
service/kubernetes ClusterIP 172.16.16.1 <none> 443/TCP 113m <none>
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node/gke-tier-2-cluster-default-pool-57b1cc66-84ng Ready <none> 112m v1.14.10-gke.36 172.16.4.2 35.184.118.151 Container-Optimized OS from Google 4.14.138+ docker://18.9.7
node/gke-tier-2-cluster-default-pool-57b1cc66-mlmn Ready <none> 112m v1.14.10-gke.36 172.16.4.3 35.238.231.160 Container-Optimized OS from Google 4.14.138+ docker://18.9.7
node/gke-tier-2-cluster-default-pool-57b1cc66-xqt5 Ready <none> 112m v1.14.10-gke.36 172.16.4.4 35.202.94.194 Container-Optimized OS from Google 4.14.138+ docker://18.9.7
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.