我在K8s 1.14.10上创建了两个独立的GKE集群。
我跟踪了这个文件和IP伪装代理文档。我尝试过使用客户端pod和服务器pod来交换消息来测试这个问题。我使用内部节点IP发送消息,并创建了一个ClusterIP来公开吊舱。
我允许防火墙规则中的每个实例请求入口和出口,即0.0.0.0/0。图片:这是我创建的集群的描述。 IP伪装代理的配置映射与文档中相同。我可以从吊舱内平另一个节点,但是curl请求说连接被拒绝,tcpdump没有显示任何数据。
问题:在GKE1.14中,我需要从集群A到集群B之间进行通信,并将其设置为true。我要么被拒绝连接,要么i/o超时。我尝试使用内部和外部节点IP,以及使用负载平衡器。
发布于 2020-06-26 13:43:04
您已经提供了相当一般的信息,如果没有详细信息,我就无法提供具体的场景答案。这可能与您如何创建集群或其他防火墙设置有关。因此,我将提供使用防火墙和masquerade
创建和配置2集群的正确步骤。也许你会发现你错过了哪一步或者配置错了。
集群配置(节点、荚、svc)位于答案的底部。
1.创建VPC和2个集群
在文档中,大约有两个不同的项目,但您可以在一个项目中完成。在GKE文档中可以找到VPC创建和2个集群的好例子。创建VPC和机箱2团簇.在集群Tier1
中,您可以现在就启用NetworkPolicy
,而不是稍后启用它。在此之后,您需要创建防火墙规则。还需要将ICMP
协议添加到防火墙规则中。
此时,您应该能够在来自2个集群的节点之间切换。
有关其他防火墙规则(允许在荚、svc等之间进行连接),请检查这个医生。
2.启用 IP伪装代理
如docs中所述,要运行IPMasquerade
ip-masq-agent DaemonSet自动作为GKE集群中带有--nomasq所有保留范围参数的外接程序安装,如果以下一个或多个参数是正确的:群集具有网络策略。
或
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.
)。如果您在创建NetworkPolicy
期间启用了tier-1-cluster
,也应该已经安装了它。如果没有,则需要使用命令启用它:
$ gcloud container clusters update tier-1-cluster --update-addons=NetworkPolicy=ENABLED --zone=us-central1-a
要验证是否一切正常,您必须检查是否创建了Daemonset ip-masq-agent
荚。(每个荚为节点)。
$ 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
在集群Tier1
中,您需要输入ubuntu和curl NodeIP:NodePort
$ kubectl exec -ti ubuntu -- bin/bash
您需要安装curl apt-get install curl
。
curl NodeIP:NodePort (节点正在监听,NodePort来自集群第2层的服务)。
CLI:
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
是Ubuntu所在的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
从第1层到任何节点的SSH,以检查是否更改了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和卷曲相同的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。
测试的配置:
TIER1
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
TIER2
$ 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
https://stackoverflow.com/questions/62302767
复制相似问题