1

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

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

我遵循了这个和 IP 伪装代理文档。我尝试使用客户端 pod 和服务器 pod 来交换消息来对此进行测试。我正在使用内部节点 IP 发送消息并创建了一个 ClusterIP 来公开 Pod。

我已允许对防火墙规则中的每个实例的请求以进行入口和出口,即0.0.0.0/0图片:这是我创建的集群的描述 IP 伪装代理的配置映射与文档中的相同。我能够从 pod 中 ping 另一个节点,但 curl 请求说连接被拒绝并且 tcpdump 显示没有数据。

问题:我需要在 gke 1.14 中从集群 A 与集群 B 通信,并将 ipmasquerading 设置为 true。我要么连接被拒绝,要么 i/o 超时。我尝试过使用内部和外部节点 IP 以及使用负载均衡器。

4

1 回答 1

2

您提供了相当笼统的信息,没有详细信息,我无法提供具体的场景答案。这可能与您如何创建集群或其他防火墙设置有关。因此,我将提供正确的步骤来创建和配置 2 个带有防火墙和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-cluster已经ip-masq-agentkube-system命名空间中(因为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创建了 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 到节点形成Tier2集群并运行:

sudo toolbox bash
apt-get update
apt install -y tcpdump

现在您应该使用下面的命令收听。端口32502NodePort来自Tier 2集群的服务

tcpdump -i eth0 -nn -s0 -v port 32502

在集群Tier1中你需要输入 ubuntu pod 和 curlNodeIP: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.4NodeIPUbuntu pod 所在的位置。

当 IP 未被伪装时

ConfigMap从集群第 1 层移除

$ kubectl delete cm ip-masq-agent -n kube-system

更改作为节点池的文件CIDRconfig并重新应用 CM172.16.4.0/22Tier 2

$ 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 pod 并像以前一样卷曲相同的 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 pod 的内部 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
于 2020-06-26T13:43:04.570 回答