GCE / GKE NAT网关路由杀死ssh连接

时间:2018-06-19 06:29:42

标签: google-cloud-platform

我试图在GKE / GCE上为Kubernetes节点设置NAT网关。 我按照教程(https://cloud.google.com/vpc/docs/special-configurations章节中的说明进行操作:"将实例配置为NAT网关")并尝试使用terraform(https://github.com/GoogleCloudPlatform/terraform-google-nat-gateway

但是在两个教程中(即使是在新创建的Google项目中),我也会遇到同样的错误:

  • NAT根本不起作用。流量仍然通过节点传出。
  • 我无法进入我的gke-nodes - >超时。我已经尝试设置优先级为100的规则,允许所有tcp:22流量。

只要我标记gke-node-instances,以便配置的路由适用于它们,就不再可能建立SSH连接。

2 个答案:

答案 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地址。

在这种情况下,包括kubectlexec在内的各种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

来源:https://github.com/GoogleCloudPlatform/terraform-google-nat-gateway/tree/master/examples/gke-nat-gateway

答案 1 :(得分:0)