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

Scy*_*Dev 5 ssh docker kubernetes google-kubernetes-engine

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

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

$ 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"?
Run Code Online (Sandbox Code Playgroud)

我还能尝试什么?

我删除群集并重新创建它后,问题可能已经开始,但我无法确定.之前做过这件事并且从来都不是问题.

Ale*_*son 11

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

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

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

  1. 群集没有任何节点.

    如果您已将群集中的节点数减少到零,则SSH隧道将无法运行.

    要修复它,请 调整群集大小 以至少拥有一个节点.

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

    这个问题应该只影响Kubernetes 1.1版,但可能是由于向下和向上重复调整群集大小造成的.

    要解决此问题,请 删除 处于终止状态超过几分钟的窗格.然后,旧节点将从主节点API中删除,并由新节点替换.

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

    所有计算引擎网络都使用名为"default-allow-ssh"的防火墙规则创建,该规则允许从所有IP地址进行SSH访问(当然,需要有效的私钥).Container Engine还为"gke --- ssh"形式的每个集群插入一个SSH规则,该集群允许SSH访问,特别是从集群的主IP到集群的节点.如果这些规则都不存在,则主服务器将无法打开SSH隧道.

    要解决此问题,请 重新添加防火墙规则,以 允许从主服务器的IP地址访问具有所有群集节点上的标记的VM.

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

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

    要解决此问题,请 删除一些 不再需要的SSH密钥.

  5. 您已在群集中的VM上设置了具有密钥"sshKeys"的元数据字段.

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

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

值得注意的是,群集的正确运行不需要这些功能.如果您希望将群集的网络从所有外部访问中锁定,那就完全没问题了.请注意,这些功能不会起作用.