首页 > 解决方案 > 意外耗尽了 Kubernetes 中的所有节点(甚至是主节点)。我怎样才能把我的 Kubernetes 带回来?

问题描述

我不小心耗尽了 Kubernetes 中的所有节点(甚至是主节点)。我怎样才能把我的 Kubernetes 带回来?kubectl 不再工作:

kubectl get nodes

结果:

The connection to the server 172.16.16.111:6443 was refused - did you specify the right host or port?

这是systemctl status kubelet主节点(node1)上的输出:

● kubelet.service - Kubernetes Kubelet Server
   Loaded: loaded (/etc/systemd/system/kubelet.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-06-23 21:42:39 UTC; 25min ago
     Docs: https://github.com/GoogleCloudPlatform/kubernetes
 Main PID: 15541 (kubelet)
    Tasks: 0 (limit: 4915)
   CGroup: /system.slice/kubelet.service
           └─15541 /usr/local/bin/kubelet --logtostderr=true --v=2 --node-ip=172.16.16.111 --hostname-override=node1 --bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --config=/etc/kubernetes/kubelet-config.yaml --kubeconfig=/etc/kubernetes/kubelet.conf --pod-infra-container-image=gcr.io/google_containers/pause-amd64:3.1 --runtime-cgroups=/systemd/system.slice --cpu-manager-policy=static --kube-reserved=cpu=1,memory=2Gi,ephemeral-storage=1Gi --system-reserved=cpu=1,memory=2Gi,ephemeral-storage=1Gi --network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin

Jun 23 22:08:34 node1 kubelet[15541]: I0623 22:08:34.330009   15541 kubelet_node_status.go:286] Setting node annotation to enable volume controller attach/detach
Jun 23 22:08:34 node1 kubelet[15541]: I0623 22:08:34.330201   15541 setters.go:73] Using node IP: "172.16.16.111"
Jun 23 22:08:34 node1 kubelet[15541]: I0623 22:08:34.331475   15541 kubelet_node_status.go:472] Recording NodeHasSufficientMemory event message for node node1
Jun 23 22:08:34 node1 kubelet[15541]: I0623 22:08:34.331494   15541 kubelet_node_status.go:472] Recording NodeHasNoDiskPressure event message for node node1
Jun 23 22:08:34 node1 kubelet[15541]: I0623 22:08:34.331500   15541 kubelet_node_status.go:472] Recording NodeHasSufficientPID event message for node node1
Jun 23 22:08:34 node1 kubelet[15541]: I0623 22:08:34.331661   15541 policy_static.go:244] [cpumanager] static policy: RemoveContainer (container id: 6dd59735cabf973b6d8b2a46a14c0711831daca248e918bfcfe2041420931963)
Jun 23 22:08:34 node1 kubelet[15541]: E0623 22:08:34.332058   15541 pod_workers.go:191] Error syncing pod 93ff1a9840f77f8b2b924a85815e17fe ("kube-apiserver-node1_kube-system(93ff1a9840f77f8b2b924a85815e17fe)"), skipping: failed to "StartContainer" for "kube-apiserver" with CrashLoopBackOff: "back-off 5m0s restarting failed container=kube-apiserver pod=kube-apiserver-node1_kube-system(93ff1a9840f77f8b2b924a85815e17fe)"
Jun 23 22:08:34 node1 kubelet[15541]: E0623 22:08:34.427587   15541 kubelet.go:2267] node "node1" not found
Jun 23 22:08:34 node1 kubelet[15541]: E0623 22:08:34.506152   15541 reflector.go:123] k8s.io/kubernetes/pkg/kubelet/kubelet.go:450: Failed to list *v1.Service: Get https://172.16.16.111:6443/api/v1/services?limit=500&resourceVersion=0: dial tcp 172.16.16.111:6443: connect: connection refused
Jun 23 22:08:34 node1 kubelet[15541]: E0623 22:08:34.527813   15541 kubelet.go:2267] node "node1" not found

我使用的是 Ubuntu 18.04,我的集群中有 7 个计算节点。全部耗尽(不小心,有点!)!我已经使用 Kubespray 安装了我的 K8s 集群。

有没有办法解开这些节点中的任何一个?这样可以调度 k8s 必要的 pod。

任何帮助,将不胜感激。

更新

我在这里问了一个关于如何连接到 etcd 的单独问题:Can't connect to the ETCD of Kubernetes

标签: dockerkubernetescontainerskubectl

解决方案


如果您有生产或“实时”工作负载,最好的安全方法是配置一个新集群并逐步切换工作负载。

Kubernetes 将其状态保存在etcd中,因此您可能会连接到 etcd 并清除“已耗尽”状态,但您可能必须查看源代码并查看发生的位置以及特定键/值存储在 etcd 中的位置。

您共享的日志基本上显示 kube-apiserver 无法启动,因此很可能它正在尝试连接到 etcd/startup 并且 etcd 告诉它:“您无法在此节点上启动,因为它已被耗尽”。

master 的典型启动顺序是这样的:

  • kube-apiserver
  • kube-控制器-管理器
  • kube-调度器

您还可以按照任何指南连接到 etcd 并查看是否可以进一步排除故障。比如这个。然后,您可以自担风险检查/删除一些节点密钥:

/registry/minions/node-x1
/registry/minions/node-x2
/registry/minions/node-x3

推荐阅读