Google cloud platform GCE/GKE NAT网关路由终止ssh连接

Google cloud platform GCE/GKE NAT网关路由终止ssh连接,google-cloud-platform,Google Cloud Platform,我正在尝试为GKE/GCE上的Kubernetes节点设置NAT网关。 我按照教程(章节:“将实例配置为NAT网关”)中的说明进行操作,并使用terraform()尝试了教程 但在这两个教程中(甚至在新创建的谷歌项目上),我都会遇到同样的两个错误: NAT根本不工作。仍通过节点传出的通信量 我无法ssh到我的gke节点->超时。我已经尝试设置一个优先级为100的规则,允许所有tcp:22流量 一旦我标记了gke节点实例,以便配置的路由应用于它们,SSH连接就不再可能了。您已经找到了第一个问题

我正在尝试为GKE/GCE上的Kubernetes节点设置NAT网关。 我按照教程(章节:“将实例配置为NAT网关”)中的说明进行操作,并使用terraform()尝试了教程

但在这两个教程中(甚至在新创建的谷歌项目上),我都会遇到同样的两个错误:

  • NAT根本不工作。仍通过节点传出的通信量
  • 我无法ssh到我的gke节点->超时。我已经尝试设置一个优先级为100的规则,允许所有tcp:22流量

一旦我标记了gke节点实例,以便配置的路由应用于它们,SSH连接就不再可能了。

您已经找到了第一个问题的解决方案:使用正确的标记标记节点,或者手动创建一个路由,以管理gke节点的实例组为目标

关于SSH问题:

这在您链接的terraform教程repo(此处复制以符合StackOverflow规则)中针对GKE的NAT网关示例的自述文件中的“注意事项”下得到了回答

下面提到的web控制台在内部使用与kubectl exec相同的
ssh
机制。简短的版本是,在发布时,不可能通过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节点:

来源:

您可以使用以分配IP地址

好主意,但这不是一个可扩展性很好的解决方案。不幸的是,使用谷歌云,你必须为每一个未使用的保留IP付费。我发现“kubectl logs-f$SOME_POD”对我来说也会失败。是否有解决方法?唯一的解决方法(不完全依赖Stackdriver日志)是在为NAT创建路由时提供明确的目标IP范围。例如,如果您正在实施NAT网关,以便为第三方供应商提供一个可白名单的IP地址,以添加到其防火墙配置中,那么您将为每个供应商的公共IP地址创建一个路由规则。这样,只有绑定到该供应商的流量才会通过网关进行路由。
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