我怎样才能阻止Kubernetes控制飞机吊舱?

时间:2017-12-01 17:44:10

标签: kubernetes

只是好奇,使用mesos我已经习惯了systemctl stop mesos-mastersystemctl start mesos-master(如果我因某些原因需要弹跳它)。使用k8s,控制平面中有多个“停止”组件,例如apiserver,controller-manager等。

使用kubeadm创建集群时,它将控制平面作为pod运行(没有副本集,或类似的东西,也许是因为我此刻只有一个主服务器。)

在不拆除群集的情况下,停止控制平面中的内容然后再次启动它们的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

Kubernetes集群被划分为微服务,这意味着每个组件应该彼此独立。如果其中一个组件发生故障,它不应该影响其他组件以避免可怕的级联效应。

让我们从 Linux内核开始。它确保 Systemd 健康并正常工作。现在 Kubeadm 确保Kubelet(在主节点中)作为systemd服务运行。您可以通过以下命令

进行检查
systemctl status kubelet

Kubelet(在主节点中)确保控制平面组件是由docker引擎作为pod运行的etcd,kube-apiserver,kube-controller-manager和kube-scheduler,但它们是systemd service.As他们正在使用在其清单文件中托管网络和主机套接字。您可以使用 systemctl journalctl 检查其状态。

 systemctl status kube-apiserver

工作节点中的Pod,使用CNI插件使用Pod网络。

现在K8s群集还活着,Kube-apiServer和其他组件都很健康。您可以提供所有其他k8资源,如部署,副本集,服务等,并将部署到工作节点。它将根据您的愿望工作,这将是etd中的期望状态

一旦部署的资源(pod,服务等)在工作节点中运行。主节点的职责是确保所需状态===当前状态

如果主节点已死,则工作节点将为孤立,这意味着您当前的状态将是最终状态。

回答您的问题

您可以在主节点中启动每个组件,但要记住它们的可靠性。

示例

如果Kube api-server失败,其他组件(kube-scheduler,kube-controller-manager)将无法与etcd(事实来源)交谈。

Kube-Controller-manager进一步分为控制器,如replicaSet Controller,Deployment Controller,Service Controller等。他们关注自己的业务并确保所需的状态===当前状态。 有趣的事情是如果其中一个控制器在Kube-controller-manager中失败将停止所有控制器并终止自身。现在Kubelet会把它变成agian。

总之,我们需要确保我们的主节点没有任何单点故障,这就是为什么我们总是希望拥有高度可用的控制平面。

答案 1 :(得分:1)

Kubernetes控制平面吊舱通常部署为Static Pods。这些不是由任何类型的Deployment控制器管理,而是在静态(因此名称)配置文件中定义,这些配置文件放在配置目录中(例如/etc/kubelet.d//etc/kubernetes/manifests,具体取决于您的群集已设置)。这些定义文件由Kubernetes主节点上运行的Kubelet选取,该节点创建相应的pod。

根据文档,您可以通过删除相应的配置文件来停止/删除静态pod,并通过创建新文件再次启动/创建它们:

  

运行kubelet定期扫描配置的目录(在我们的示例中为/etc/kubelet.d)进行更改,并在文件出现/消失在此目录中时添加/删除pod。

[joe@my-node1 ~] $ mv /etc/kubelet.d/static-web.yaml /tmp
[joe@my-node1 ~] $ sleep 20
[joe@my-node1 ~] $ docker ps
// no nginx container is running
[joe@my-node1 ~] $ mv /tmp/static-web.yaml  /etc/kubelet.d/
[joe@my-node1 ~] $ sleep 20
[joe@my-node1 ~] $ docker ps
CONTAINER ID        IMAGE         COMMAND                CREATED           ...
e7a62e3427f1        nginx:latest  "nginx -g 'daemon of   27 seconds ago

要暂时禁用/启用这些广告连播,只需将定义文件移至安全位置然后再返回:

$ mv /etc/kubelet.d/*.yaml /tmp   # Disable static pods
$ mv /tmp/*.yaml /etc/kubelet.d   # Re-enable static pods