无法通过私有 GKE 集群中的 pod 访问互联网

无法通过私有 GKE 集群中的 pod 访问互联网

我目前无法从我的私有 Kubernetes 集群访问/ping/连接到 Google 之外的任何服务。pod 运行的是 Alpine Linux。

路由表

/sleepez/api # ip route show table all
default via 10.52.1.1 dev eth0
10.52.1.0/24 dev eth0 scope link  src 10.52.1.4
broadcast 10.52.1.0 dev eth0 table local scope link  src 10.52.1.4
local 10.52.1.4 dev eth0 table local scope host  src 10.52.1.4
broadcast 10.52.1.255 dev eth0 table local scope link  src 10.52.1.4
broadcast 127.0.0.0 dev lo table local scope link  src 127.0.0.1
local 127.0.0.0/8 dev lo table local scope host  src 127.0.0.1
local 127.0.0.1 dev lo table local scope host  src 127.0.0.1
broadcast 127.255.255.255 dev lo table local scope link  src 127.0.0.1
local ::1 dev lo  metric 0
local fe80::ac29:afff:fea1:9357 dev lo  metric 0
fe80::/64 dev eth0  metric 256
ff00::/8 dev eth0  metric 256
unreachable default dev lo  metric -1  error -101

该 pod 肯定有一个分配的 IP,并且可以毫无问题地连接到它的网关:

PS C:\...\> kubectl get pods -o wide -n si-dev
NAME                              READY     STATUS    RESTARTS   AGE       IP          NODE
sleep-intel-api-79bf57bd9-c4l8d   1/1       Running   0          52m       10.52.1.4   gke-sez-production-default-pool-74b75ebc-6787

ip addr输出

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
3: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1460 qdisc noqueue state UP
    link/ether 0a:58:0a:34:01:04 brd ff:ff:ff:ff:ff:ff
    inet 10.52.1.4/24 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::ac29:afff:fea1:9357/64 scope link
       valid_lft forever preferred_lft forever

Ping 网关工作正常

/sleepez/api # ping 10.52.1.1
PING 10.52.1.1 (10.52.1.1): 56 data bytes
64 bytes from 10.52.1.1: seq=0 ttl=64 time=0.111 ms
64 bytes from 10.52.1.1: seq=1 ttl=64 time=0.148 ms
64 bytes from 10.52.1.1: seq=2 ttl=64 time=0.137 ms
^C
--- 10.52.1.1 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.111/0.132/0.148 ms

Ping 1.1.1.1 失败

/sleepez/api # ping 1.1.1.1
PING 1.1.1.1 (1.1.1.1): 56 data bytes
^C
--- 1.1.1.1 ping statistics ---
6 packets transmitted, 0 packets received, 100% packet loss

系统服务状态

PS C:\...\> kubectl get deploy -n kube-system
NAME                    DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
event-exporter-v0.1.7   1         1         1            1           18m
heapster-v1.4.3         1         1         1            1           18m
kube-dns                2         2         2            2           18m
kube-dns-autoscaler     1         1         1            1           18m
l7-default-backend      1         1         1            1           18m
tiller-deploy           1         1         1            1           14m

跟踪路由(Google 内部)

/sleepez/api # traceroute -In 74.125.69.105
 1  10.52.1.1  0.007 ms  0.006 ms  0.006 ms
 2  *  *  *
 3  *  *  *
 4  *  *

跟踪路由(外部)

traceroute to 1.1.1.1 (1.1.1.1), 30 hops max, 46 byte packets
 1  10.52.1.1  0.009 ms  0.003 ms  0.004 ms
 2  *  *  *
 3  *  *  *
 [continues...]

答案1

私有 GKE 集群中的节点没有外部 IP 地址,因此它们无法与 Google 之外的站点通信。https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#pulling_a_container_image_from_a_registry

答案2

我目前有两个私有 gke 集群正在访问互联网。我以为我是通过使用 NAT 网关实现这一点的,但现在添加第三个集群时,它对第三个集群不起作用。我怀疑这是集群上 kubernetes 版本的差异。

毫无疑问,您的其他私有 IP 服务器/节点可以通过服务访问您的私有集群,并且您的 pod 可以通过(我认为)NAT 访问互联网。

答案3

我刚刚在实验室集群中完成了这个调试。

测试驱动开发说你应该首先进行测试。

从私有 GKE 节点进行第一次互联网访问测试:

  1. 在 GCP 控制台 GUI 中,您可以通过浏览器选择 ssh 到私有节点(即使 GKE 节点只有一个私有 IP,并且没有堡垒主机或 NAT/Internet 网关),但它对我来说不起作用,直到我运行了从一些文档中得出的以下内容。
  2. gcloud compute --project=$PROJECT firewall-rules create ssh-from-browser --direction=INGRESS --priority=500 --network=lab-vpc --action=ALLOW --rules=tcp:22 --source-ranges=35.235.240.0/20
  3. 在上述防火墙规则之后,我创建了一个新的 ssh 浏览器会话并且它可以正常工作(在我添加规则之前的原始 ssh 浏览器会话由于某种原因继续失败。)
  4. 通过基于 COS 的 GKE 节点进行互联网测试:(
    curl ifconfig.me
    挂起/最终超时,未安装 ping)

从 GKE pod 进行第二次互联网访问测试:

alias k=kubectl
k run -it busybox --image=busybox -- /bin/sh
exit
k exec -it busybox -- ping 8.8.8.8

ping 会挂起,直到使用 ctrl+c 才能断开,然后您会看到 100% 数据包丢失(因此没有互联网)



以下文档有一个“要求、限制和局限性”部分,解释了需要 Cloud NAT:
https://cloud.google.com/kubernetes-engine/docs/how-to/private-clusters#req_res_lim

在私有集群中,节点仅具有内部 IP 地址,这意味着节点和 Pod 默认与互联网隔离。... 私有
集群
中的所有节点都是在没有公共 IP 的情况下创建的;它们对 Google API 和服务的访问权限有限。要为您的私有节点提供出站互联网访问,您可以使用 Cloud NAT。



以下是我想到的解决方案:
大部分解决方案都来自这里 https://gist.github.com/mikesparr/9f522b00b4d3c32227b2ae179260c6e4

export NETWORK_NAME="lab-vpc"
export GCP_REGION="us-central1"
export CLOUD_ROUTER_NAME="router-1"
export CLOUD_ROUTER_ASN="64523"
export NAT_GW_NAME="nat-gateway-1"

gcloud compute routers create $CLOUD_ROUTER_NAME \
    --network $NETWORK_NAME \
    --asn $CLOUD_ROUTER_ASN \
    --region $GCP_REGION

gcloud compute routers nats create $NAT_GW_NAME \
 --router=$CLOUD_ROUTER_NAME \
 --region=$GCP_REGION \
 --auto-allocate-nat-external-ips \
 --nat-all-subnet-ip-ranges 


两项互联网接入测试现已开始运行
通过 GKE 节点进行第一次互联网测试(通过 GCP 控制台 GUI 进行 SSH):
Private-GKE-Node-Bash ~ $ curl ifconfig.me
(现在列出 NAT 网关的 WAN IP)

通过 GKE pod 进行第二次互联网测试:

alias k=kubectl
k exec -it busybox -- ping 8.8.8.8

PING 8.8.8.8 (8.8.8.8):
来自 8.8.8.8 的 56 个数据字节 64 个字节:seq=0 ttl=114 时间=1.394 毫秒
(无限循环,直到按 ctrl+c 退出)

两次测试均确认更改后可上网

相关内容