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

我正在Google Container Engine上运行一些容器。 有一天一切都很好,第二天我就再也不能装attach我的容器了。 或exec ,或任何其他docker命令。

我删除了豆荚,让新的实例,没有帮助。 然后,我删除了节点,等待一个新的创build和豆荚部署,也没有帮助。

 $ kubectl attach www-controller-dev-xxxxx Error from server: No SSH tunnels currently open. Were the targets able to accept an ssh-key for user "gke-xxxxxxxxxxxxxxxxxxxxxxxx"? 

我还有什么可以尝试?

删除群集并重新创build后,问题可能已经出现,但我无法确定。 之前做过,这从来没有成为一个问题。

像attach这样的命令依赖于集群的主节点能够与集群中的节点进行通信。 但是,由于主节点与群集节点不在同一台计算引擎networking中,因此我们依靠SSH隧道来启用安全通信。

容器引擎将一个SSH公钥放入您的计算引擎项目元数据中 。 所有使用Google提供的映像的计算引擎虚拟机都会定期检查项目的公共元数据及其实例的SSH密钥元数据,以添加到虚拟机的授权用户列表中。 容器引擎还为计算引擎networking添加了防火墙规则,允许从主机的IP地址到群集中的每个节点进行SSH访问。

如果kubectl连接(或日志,exec和端口转发)不起作用,很可能是因为主服务器无法打开SSH隧道到节点。 要确定潜在的问题是什么,你应该检查这些潜在的原因:

  1. 群集没有任何节点。

    如果您将群集中的节点数量缩减为零,则SSH隧道将无法工作。

    要修复它, 调整您的群集至less有一个节点。

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

    这是一个只影响Kubernetes版本1.1的问题,但可能是由于集群不断重新resize而导致的。

    要修复它,请删除处于终止状态超过几分钟的豆荚 。 旧的节点将从主站的API中删除,并由新节点replace。

  3. 您的networking防火墙规则不允许SSH访问主站。

    所有计算引擎networking都使用名为“default-allow-ssh”的防火墙规则创build,该规则允许从所有IP地址(当然需要有效的私钥)进行SSH访问。 容器引擎还为forms为“gke — ssh”的每个集群插入一个SSH规则,允许SSH从集群的主IP专门访问集群的节点。 如果这些规则都不存在,那么主设备将无法打开SSH隧道。

    为了解决这个问题, 重新添加一个防火墙规则,允许通过主机IP地址的所有集群节点上的标签访问虚拟机。

  4. 您项目的sshKeys公共元数据条目已满。

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

    要修复它, 删除一些不再需要的SSH密钥 。

  5. 您已经在群集中的虚拟机上使用密钥“sshKeys”设置了元数据字段。

    虚拟机上的节点代理首选每个实例的sshKeys到项目范围的SSH密钥,所以如果你已经在集群的节点上专门设置了任何SSH密钥,那么节点将不会考虑项目元数据中主节点的SSH密钥。 要检查,运行gcloud compute instances describe <VM-name>并在元数据中查找“sshKeys”字段。

    要修复它,请从实例元数据中删除每个实例的SSH密钥 。

值得注意的是,这些function并不是集群正常运行所必需的。 如果您希望保持群集的networking不受外部访问的限制,那就太好了。 请注意,像这样的function不会因此而起作用。

不是一个很好的答案,但这是我得到的唯一的东西:

第一次删除群集没有帮助。 第二次删除集群(第二天)它帮助,现在我可以再次kubectl attachkubectl exec

可能也只是Google Container平台的一个暂时性问题,与我重新创build群集完全没有关系。