当前位置: 首页 > 知识库问答 >
问题:

谷歌Kubernetes引擎

扶杜吟
2023-03-14

我正在使用谷歌库伯内特斯引擎部署一些需要连接到本地数据库的应用程序。为了做到这一点,我配置了一个虚拟专用网隧道并创建了一个VPC。

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

~ $ 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  * * *```

我错过了什么?

共有2个答案

封俊艾
2023-03-14

我在这个博客中找到了一个解决方案。

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

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

这意味着只有当目的地不在10.0.0.0/8.时,来自Pod的流量才会被NATted到主机IP

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

它还包括您的10.197.100.201IP。

要解决此问题,您可以将以下DaemonSet添加到库伯内特斯群集:

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规则是必需的。

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

何高歌
2023-03-14

经过一番调查,我找到了问题的根源。基本上,通信不能正常工作,因为有一种叫做ip伪装(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),并且目标ip10.197.100.201(10.0.0.0/8的一部分),并且ip在集群之外,解决方案是修改nonMasquradeCIDRs并删除10.0.0.0/8并使用10.44.0.0/14(GKE集群CIDR)。

为此,我使用了以下configmap:

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

之后,要应用配置,可以使用以下命令上载configmap:

kubectl create configmap ip-masq-agent --from-file <configmap file> --namespace kube-system
 类似资料:
  • 我想知道我是否需要Google java客户端库才能从GAE访问我的Google日历。默认情况下,它们是Google App Engine SDK的一部分吗? 此外,我找不到一个很好的示例或教程来展示如何从Google Cloud Platform应用程序创建、读取、更新和删除Google日历事件。 非常感谢,如果您可以提供相同的代码示例或链接到适当的工作教程。

  • 我有一个谷歌云,我想推我的图像。 我的图片是Hello-world项目与节点快递谷歌云客户端libray 你可以在我的github上找到它 https://github.com/innostarterkit/language 当我试着推的时候,我有这个错误 推送是指存储库[eu.gcr.io/innovation xxx/hello]a419c4413fb0:推送[================

  • 我想能够从谷歌云功能中调用谷歌应用程序引擎,有可能吗?找不到任何解决办法

  • 我正在看新的谷歌云数据存储,看起来很棒。但有件事我不明白。。。它应该替代谷歌应用引擎数据存储吗?我如何在GAE内部使用它?它们之间有什么区别? 我在Java有一个GAE应用程序,它使用3个实体,每个实体都有数千行,我需要经常做连接...