繁体   English   中英

GKE 中的 VPC 原生集群无法在 GKE 1.14 中通信

[英]VPC native Clusters in GKE can't communicate in GKE 1.14

我在 K8s 1.14.10 上创建了两个单独的 GKE 集群。

GKE 集群升级到 1.14.6 后,VPN 访问内部网络无法正常工作

我遵循了这个和 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 个集群的良好示例。 创建 VPCCrate 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-clusterkube-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.4NodeIP 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM