这是在维护期间从群集中取出小兵的正确方法吗?

时间:2016-03-15 16:57:51

标签: kubernetes

我们正在使用kubernetes 1.1.8(带法兰绒),但1.2即将删除有关此特定于1.2的主题的任何输入都很好。

我们在我们自己的裸机数据中心运行kubernetes,这意味着我们需要对工作节点进行维护,这些节点将它们带入和退出生产。

我们有一个流程可以将节点从集群中取出来对其进行维护,我想知道我们的流程是否可以改进,以最大限度地减少用户面临停机的可能性。

我们正在使用f5负载平衡器。我们部署的每个服务都被赋予一个静态nodePort。例如,appXYZ有nodePort 30173.在服务appXYZ的F5池中,集群中的所有minions都作为池成员添加,并在端口30173上打开tcp端口。

在节点维护期间,我们采取以下步骤 1.将节点设置为unschedulable = true。 2.获取节点上运行的pod列表并删除每个pod。有时这将是每个节点40个pod 3.等待最多两分钟,使步骤#2中的容器关闭。 4.重新启动物理节点。

我想知道这是否是其他人正在做的事情,或者我们是否缺少一个或多个步骤,这些步骤可以进一步减少可能被设置为正在进行维护的节点上的死亡或死亡pod的流量? / p>

当我通读http://kubernetes.io/docs/user-guide/pods/#termination-of-pods时,我想知道是否向我们的删除命令添加更长时间(超过30秒)--grace-period =并暂停我们的重新启动更长时间将确保所有kube-proxy已更新,以从端点列表中删除该节点。

因此,如果有人能够确认我们正在做的事情是一种体面的做法,或者对如何改进它有任何建议。特别是关于在kubernetes 1.2中做什么的任何提示。

TIA!

3 个答案:

答案 0 :(得分:1)

结帐' kubectl drain'命令:

# Drain node "foo", even if there are pods not managed by a ReplicationController, Job, or DaemonSet on it.
$ kubectl drain foo --force

# As above, but abort if there are pods not managed by a ReplicationController, Job, or DaemonSet, and use a grace period of 15 minutes.
$ kubectl drain foo --grace-period=900

另请参阅Issue 3885及相关的相关问题

答案 1 :(得分:0)

添加更长的宽限期肯定不会受到伤害。

如果您想要非常谨慎,还可以在删除之前从这些节点上运行的pod中删除标签。这将使他们继续运行,以便他们可以完成他们正在做的任何工作,但是将它们从所有服务中移除,以便他们将停止接收新的请求。

答案 2 :(得分:0)

我遵循的方法是

  1. 使节点不可调度。
  2. 滚动部署应用程序,使其部署到其他节点。
  3. 取出节点。
  4. 我在更改节点时使用此策略切换(蓝绿色部署?)节点的AWS ASG。

    此博客文章也是一个很好的参考(虽然我不使用删除pod方法) - http://sttts.github.io/kubernetes/api/kubectl/2016/01/13/kubernetes-node-evacuation.html