【问题标题】:Google Kubernetes Engine & VPN谷歌 Kubernetes 引擎和 VPN
【发布时间】:2019-05-21 13:28:29
【问题描述】:

我正在使用 Google Kubernetes Engine 部署一些需要连接到本地数据库的应用程序。为此,我配置了一个 VPN 隧道并创建了一个 VPC。

然后,我创建了一个使用该 VPC 的 GKE 集群(1 个节点),我可以通过连接到该节点并尝试 ping 数据库服务器来确认该数据库是可访问的

~ $ sudo toolbox ping 10.197.100.201
Spawning container root-gcr.io_google-containers_toolbox-20180309-00 on 
/var/lib/toolbox/root-gcr.io_google-containers_toolbox-20180309-00.
Press ^] three times within 1s to kill container.
PING 10.197.100.201 (10.197.100.201): 56 data bytes 
64 bytes from 10.197.100.201: icmp_seq=0 ttl=62 time=45.967 ms
64 bytes from 10.197.100.201: icmp_seq=1 ttl=62 time=44.186 ms`

但是,如果我尝试从 Pod 执行相同操作,我将无法连接。

root@one-shot-pod:/# traceroute 10.197.100.201
traceroute to 10.197.100.201 (10.197.100.201), 30 hops max, 60 byte 
packets
 1  10.0.0.1 (10.0.0.1)  0.046 ms  0.009 ms  0.007 ms
 2  * * *
 3  * * *```

我错过了什么?

【问题讨论】:

  • 是什么VPN,SDN的CIDR是什么,VPN隧道的CIDR是什么,那个pod你配置hostNetwork: true了吗?
  • 这是一个基于路由的 VPN,正在使用的子网有 10.198.100.0/24 CIDR。备用 pod CIDR 是 10.40.0.0/14。如果我使用hostNetwork: true 它可以工作,我认为这不是正确的方法,对吧? SDN 的 CIDR 是什么意思?
  • 我正在分享一个链接 [1],用于 VPN 的 gke 网络演示。您可能会发现了解 Kubernetes Engine 如何通过 VPN 进行通信很有帮助。这演示了如何在 Kubernetes 引擎集群和在本地运行的集群之间建立连接。 [1]github.com/GoogleCloudPlatform/gke-networking-demos/tree/master/…
  • 你解决了这个问题@pVilaca 吗?

标签: kubernetes google-cloud-platform google-kubernetes-engine google-cloud-vpn


【解决方案1】:

经过一番调查,我找到了问题的根本原因。基本上,通信不能正常工作,因为有一个叫做 ip masquerade (https://cloud.google.com/kubernetes-engine/docs/how-to/ip-masquerade-agent) 的东西用于 NAT 转换。

由于 GKE 有一些默认地址被配置为不伪装(在我使用的版本上,默认值是:10.0.0.0/8172.16.0.0/12192.168.0.0/16)并且目标 IP 是 10.197.100.201( 10.0.0.0/8 的一部分)并且该 IP 在集群之外,解决方案是修改 nonMasqueradeCIDRs 并删除 10.0.0.0/8 并改用 10.44.0.0/14(GKE 集群 CIDR)。

为了做到这一点,我使用了以下配置图:

apiVersion: v1
data:
  config: |-
    nonMasqueradeCIDRs:
      - 10.44.0.0/14
      - 172.16.0.0/12
      - 192.168.0.0/16
    resyncInterval: 60s
kind: ConfigMap
metadata:
  name: ip-masq-agent
  namespace: kube-system

之后,要应用配置,您可以使用以下命令上传配置图:

kubectl create configmap ip-masq-agent --from-file <configmap file> --namespace kube-system

【讨论】:

    【解决方案2】:

    我在this blog.找到了解决方案

    问题是默认的 iptables 配置看起来像这样:

    iptables -A POSTROUTING ! -d 10.0.0.0/8 \
      -m comment --comment “kubenet: outbound traffic" -m addrtype \
      ! --dst-type LOCAL -j MASQUERADE -t nat
    

    这意味着来自 pod 的流量将仅被 NAT 到主机 IP 如果目的地不在 10.0.0.0/8.

    这个 10.0.0.0/8 是问题所在:它太大了。

    它还包括您的10.197.100.201 IP。

    要解决此问题,您可以将以下 DaemonSet 添加到您的 Kubernetes 集群:

    kind: DaemonSet
    apiVersion: extensions/v1beta1
    metadata:
      name: fix-nat
      labels:
        app: fix-nat
    spec:
      template:
        metadata:
          labels:
            app: fix-nat
        spec:
          hostPID: true
          containers:
            - name: fix-nat
              image: gcr.io/google-containers/startup-script:v1
              imagePullPolicy: Always
              securityContext:
                privileged: true
              env:
              - name: STARTUP_SCRIPT
                value: |
                  #! /bin/bash
                  while true; do
                    iptables-save | grep MASQUERADE | grep -q "NAT-VPN"
                    if [ $? -ne 0 ]; then
                      echo "Missing NAT rule for VPN, adding it"
                      iptables -A POSTROUTING -d 10.197.100.0/24 -m comment --comment "NAT-VPN: SNAT for outbound traffic through VPN" -m addrtype ! --dst-type LOCAL -j MASQUERADE -t nat
                    fi
                    sleep 60
                  done
    

    这个小脚本将永远每分钟检查一次,如果我们有 正确的iptables规则,如果没有,添加它。

    注意 privileged: true 是 Pod 能够执行的必要条件 从主机更改 iptables 规则。

    我遇到了同样的问题,这解决了问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-26
      • 2020-04-06
      • 2018-07-28
      • 1970-01-01
      • 2017-03-15
      • 2016-07-24
      • 2019-10-18
      • 2019-11-01
      相关资源
      最近更新 更多