我试图在GKE / GCE上为Kubernetes节点设置NAT网关。 我按照教程(https://cloud.google.com/vpc/docs/special-configurations章节中的说明进行操作:"将实例配置为NAT网关")并尝试使用terraform(https://github.com/GoogleCloudPlatform/terraform-google-nat-gateway)
但是在两个教程中(即使是在新创建的Google项目中),我也会遇到同样的错误:
只要我标记gke-node-instances,以便配置的路由适用于它们,就不再可能建立SSH连接。
答案 0 :(得分:1)
您已经找到第一个问题的解决方案:使用正确的标签标记节点,或者手动创建针对管理GKE节点的实例组的路由。
关于SSH问题:
在您链接的terraform教程存储库中,自述文件中有关GKE的NAT网关的示例中的“注意事项”回答了此问题(此处复制以符合StackOverflow规则)。
下面提到的Web控制台在内部使用与ssh
相同的kubectl exec
机制。简短的版本是,自发布之日起,不可能同时将所有出口流量通过NAT网关和使用kubectl exec
与正在运行的Pod进行交互集群。
更新@ 2018-09-25:
如果您仅需要通过NAT网关路由特定流量,例如,如果您的第三方需要将其IP地址列入其防火墙白名单,则可以使用解决方法。
>请注意,此解决方法需要您进行强有力的警报和监视,因为如果您的供应商的公共IP发生更改,事情会崩溃。
如果在GCP中创建路由时指定了严格的目标IP范围,则仅绑定到这些地址的流量将通过NAT网关路由。在我们的案例中,我们在VPC网络路由表中定义了几条路由,其中每条路由用于供应商的公共IP地址。
在这种情况下,包括kubectl
和exec
在内的各种logs
命令将继续按预期工作。
一种可能的解决方法是使用以下代码片段中的命令连接到节点,并在该节点上使用docker exec
输入一个容器。当然,这意味着您将需要先定位Pod正在运行的节点,然后再通过网关跳到该节点并运行docker exec
。
注意事项
Web控制台SSH将不再起作用,您必须跳过NAT网关机器以SSH进入GKE节点:
eval ssh-agent $SHELL
ssh-add ~/.ssh/google_compute_engine
CLUSTER_NAME=dev
REGION=us-central1
gcloud compute ssh $(gcloud compute instances list --filter=name~nat-gateway-${REGION} --uri) --ssh-flag="-A" -- ssh $(gcloud compute instances list --filter=name~gke-${CLUSTER_NAME}- --limit=1 --format='value(name)') -o StrictHostKeyChecking=no
答案 1 :(得分:0)