kubectl:服务器出错:当前没有SSH隧道打开

时间:2016-04-02 15:17:45

标签: ssh docker kubernetes google-kubernetes-engine

我在Google Container Engine上运行了一些容器。 有一天一切都很好,第二天我不能再<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <style> .blue { height: 100px; width: 100%; background-color: blue; display: block; } .red { height: 100px; width: 100%; background-color: red; display: block; } </style> <div ng-app="app"> <div style="height: 100px; width 100%; background-color: red; display: block;" ng-class="{'red': red == true, 'blue': red == false}"></div> <br /> <button ng-click="red = !red">Changing Red to Blue won't work because of the style attribute!</button> <br /> <br /> <div class="blue" ng-class="{'blue': blue, 'red': !blue}"></div> <br /> <button ng-click="blue = !blue">Toggle between Red & Blue</button> </div>到我的容器了。或attach或任何其他泊坞窗命令。

我删除了pod并让新的pod实例化,没有帮助。 然后我删除了节点并等待创建一个新节点并部署了pod,也没有帮助。

exec

我还能尝试什么?

在我删除群集并重新创建群集后,问题可能已经开始,但我无法确定。之前做过这件事并且从未出现问题。

3 个答案:

答案 0 :(得分:11)

像attach这样的命令依赖于集群的主服务器能够与节点通信 在群集中。但是,因为master不在同一个Compute中 引擎网络作为集群的节点,我们依靠SSH隧道来实现安全 通信。

Container Engine在您的Compute Engine项目中放置一个SSH公钥 metadata。所有计算引擎VM使用 Google提供的图片会定期检查其项目的常用元数据 和他们的实例的SSH密钥元数据,以添加到VM的列表中 授权用户。 Container Engine还会为您的Compute添加防火墙规则 引擎网络允许从主服务器的IP地址到每个节点的SSH访问 在群集中。

如果kubectl attach(或者logs,exec和port-forward)不起作用,很可能是因为master无法打开到节点的SSH隧道。至 确定潜在的问题是什么,你应该检查这些潜力 原因:

  1. 群集没有任何节点。

    如果您已将群集中的节点数减少到零,请使用SSH 隧道不起作用。

    要修复它, resize your cluster 至少有一个节点。

  2. 群集中的Pod已陷入终止状态并被阻止 不再存在的节点不会从群集中删除。

    这是一个只会影响Kubernetes 1.1版的问题,但可以 是因为重复调整群集的大小而导致的。

    要修复它, delete the pods 已经处于终止状态超过几分钟。 然后将从主API的API中删除旧节点并进行替换 由新节点。

  3. 您的网络的防火墙规则不允许SSH访问主服务器。

    所有计算引擎网络都是使用名为的防火墙规则创建的 “default-allow-ssh”允许从所有IP地址进行SSH访问(需要 当然是一个有效的私钥。 Container Engine还会插入SSH规则 对于每个形式为“gke --- ssh”的集群 允许SSH访问专门从集群的主IP到 集群的节点。如果这些规则都不存在,那么主人就会 无法打开SSH隧道。

    要修复它, re-add a firewall rule 允许访问具有所有群集节点上的标记的VM 主人的IP地址。

  4. 您的项目的sshKeys常用元数据条目已满。

    如果项目的名为“sshKeys”的元数据条目接近32KiB大小 限制,然后Container Engine无法添加自己的SSH密钥来让它 打开SSH隧道。您可以通过运行来查看项目的元数据 gcloud compute project-info describe [--project=PROJECT],然后查看 sshKeys列表的长度。

    要修复它, delete some of the SSH keys 不再需要了。

  5. 您已在虚拟机中设置了一个元数据字段,其中包含“sshKeys”键 群集。

    VM上的节点代理程序更喜欢每个实例的sshKeys到项目范围的SSH密钥, 因此,如果您在群集的节点上专门设置了任何SSH密钥,那么 项目元数据中的master的SSH密钥不会被节点遵守。 要检查,请运行gcloud compute instances describe <VM-name>并查找 元数据中的“sshKeys”字段。

    要修复它, delete the per-instance SSH keys 来自实例元数据。

  6. 值得注意的是,这些功能并非正确所需 集群的运作。如果您希望保持群集的网络锁定 从所有外部访问,这是完全正常的。请注意 这些功能不会起作用。

答案 1 :(得分:2)

要考虑的另一件事:区域集群。区域集群具有多个主服务器,集群端点是负载均衡器。 因此,请检查您的网络路由!

如果您有一个VM实例充当NAT网关,则可能会有一些路由迫使流量通过它。因此,您必须从这些路由中排除多个Kubernetes主节点和节点之间的流量。

您可以通过检查名为gke-<cluster_name>-<short_uid>-ssh的防火墙规则来找到您的主IP,然后创建绕过NAT网关的路由。

以下gcloud命令可查找GKE主IP: bash FW_RULE_GKE_SSH=$(gcloud compute firewall-rules list --filter="name~'gke-.*-ssh'" --format="get(name)") GKE_MASTER_IP=$(gcloud compute firewall-rules describe ${FW_RULE_GKE_SSH} --format='value(sourceRanges)')

特别感谢您对此问题的解决,并已修复此Terraform模块:https://github.com/GoogleCloudPlatform/terraform-google-nat-gateway/issues/25

答案 2 :(得分:0)

Not a very good answer, but it's the only thing I got:

The first time deleting the cluster didn't help. The second time I deleted the cluster (the next day) it helped, now I can kubectl attach and kubectl exec again.

Might also have been just a temporary problem of the Google Container platform and nothing at all to do with me re-creating the cluster.