我在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
我还能尝试什么?
在我删除群集并重新创建群集后,问题可能已经开始,但我无法确定。之前做过这件事并且从未出现问题。
答案 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隧道。至 确定潜在的问题是什么,你应该检查这些潜力 原因:
群集没有任何节点。
如果您已将群集中的节点数减少到零,请使用SSH 隧道不起作用。
要修复它, resize your cluster 至少有一个节点。
群集中的Pod已陷入终止状态并被阻止 不再存在的节点不会从群集中删除。
这是一个只会影响Kubernetes 1.1版的问题,但可以 是因为重复调整群集的大小而导致的。
要修复它, delete the pods 已经处于终止状态超过几分钟。 然后将从主API的API中删除旧节点并进行替换 由新节点。
您的网络的防火墙规则不允许SSH访问主服务器。
所有计算引擎网络都是使用名为的防火墙规则创建的 “default-allow-ssh”允许从所有IP地址进行SSH访问(需要 当然是一个有效的私钥。 Container Engine还会插入SSH规则 对于每个形式为“gke --- ssh”的集群 允许SSH访问专门从集群的主IP到 集群的节点。如果这些规则都不存在,那么主人就会 无法打开SSH隧道。
要修复它, re-add a firewall rule 允许访问具有所有群集节点上的标记的VM 主人的IP地址。
您的项目的sshKeys常用元数据条目已满。
如果项目的名为“sshKeys”的元数据条目接近32KiB大小
限制,然后Container Engine无法添加自己的SSH密钥来让它
打开SSH隧道。您可以通过运行来查看项目的元数据
gcloud compute project-info describe [--project=PROJECT]
,然后查看
sshKeys列表的长度。
要修复它, delete some of the SSH keys 不再需要了。
您已在虚拟机中设置了一个元数据字段,其中包含“sshKeys”键 群集。
VM上的节点代理程序更喜欢每个实例的sshKeys到项目范围的SSH密钥,
因此,如果您在群集的节点上专门设置了任何SSH密钥,那么
项目元数据中的master的SSH密钥不会被节点遵守。
要检查,请运行gcloud compute instances describe <VM-name>
并查找
元数据中的“sshKeys”字段。
要修复它, delete the per-instance SSH keys 来自实例元数据。
值得注意的是,这些功能并非正确所需 集群的运作。如果您希望保持群集的网络锁定 从所有外部访问,这是完全正常的。请注意 这些功能不会起作用。
答案 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.