如何从Kubernetes中优雅地删除节点?

时间:2016-03-02 20:40:04

标签: kubernetes

我想扩大/缩小计算机数量,以增加/减少Kubernetes集群中的节点数量。当我添加一台机器时,我能够成功地将其注册到Kubernetes;因此,按预期创建新节点。但是,我不清楚如何在以后顺利关闭机器。一个好的工作流程是:

  1. 将与我要关闭的机器相关的节点标记为不可调度;
  2. 启动在其他节点中的节点中运行的pod;
  3. 正常删除节点中正在运行的pod;
  4. 删除节点。
  5. 如果我理解正确,即使kubectl draindiscussion)也没有做到我所期望的,因为它在删除之前没有启动pod(它依赖于复制控制器来启动之后的吊舱可能导致停机)。我错过了什么吗?

    我应该如何正确关闭机器?

6 个答案:

答案 0 :(得分:13)

列出节点并获取要耗尽或(从集群中删除)的<node-name>

kubectl get nodes

1)首先排空节点

kubectl drain <node-name>

您可能不得不忽略计算机中的守护程序和本地数据

kubectl drain <node-name> --ignore-daemonsets --delete-local-data

2)编辑节点的实例组(仅在使用kops的情况下)

kops edit ig nodes

将MIX和MAX大小设置为-1    只需保存文件(无需执行其他操作)

在耗尽的节点中,您仍然可能会看到一些与守护程序相关的pod,例如网络插件,流利的日志,kubedns / coredns等

3)最后删除节点

kubectl delete node <node-name>

4)在s3中提交KOPS的状态:

kops update cluster --yes

答案 1 :(得分:10)

在主节点上

找到节点

kubectl get nodes

排干

kubectl drain nodetoberemoved

删除

kubectl delete node nodetoberemoved

在工作节点上(nodetoberemoved)。从节点中删除加入/初始化设置

kubeadm reset

答案 2 :(得分:4)

圣拉斐尔。 kubectl drain确实可以按照您的描述运作。有一些停机时间,就像机器崩溃一样。

您能描述一下您的设置吗?您有多少个副本,是否配置了这样的副本以便您无法处理单个副本的停机时间?

答案 3 :(得分:0)

If the cluster is created by kops

1.kubectl drain <node-name>
now all the pods will be evicted

ignore daemeondet:
2.kubectl drain <node-name> --ignore-daemonsets --delete-local-data

3.kops edit ig  nodes-3  --state=s3://bucketname

set max and min value of instance group to 0

4. kubectl delete node

5. kops update cluster --state=s3://bucketname  --yes

Rolling update if required:

6. kops rolling-update cluster  --state=s3://bucketname  --yes

validate cluster:

7.kops validate cluster --state=s3://bucketname

Now the instance will be terminated.

答案 4 :(得分:0)

kubectl drain 时,我会出现一些奇怪的行为。这是我的额外步骤,否则在我的情况下数据将丢失

简短回答:检查是否没有 PersistentVolume 安装到此节点。如果有一些PV,请参阅以下说明将其删除。


在执行 kubectl drain 时,我注意到一些 Pod 没有被驱逐(它们只是没有像 evicting pod xxx 那样出现在那些日志中)。

就我而言,有些是具有软反亲和性的 pod(所以他们不喜欢去剩余的节点),有些是大小为 1 的 StatefulSet 的 pod,并希望保留至少 1 个 pod。

如果我直接删除该节点(使用其他答案中提到的命令),数据将丢失,因为这些 Pod 有一些 PersistentVolume,删除一个节点也会删除 PersistentVolume(如果使用某些云提供商)。

因此,请手动一一删除这些 Pod。删除后,kuberentes 会重新调度 pod 到其他节点(因为这个节点是 SchedulingDisabled)。

删除所有 Pod(不包括 DaemonSets)后,请检查是否没有 PersistentVolume 挂载到该节点。

然后你可以安全地删除节点本身:)

答案 5 :(得分:0)

从 Kubernetes 中删除工作节点

  1. kubectl 获取节点
  2. kubectl drain <节点名称> --ignore-daemonsets
  3. kubectl 删除节点 <节点名>