Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在kubernetes中重新启动主节点_Kubernetes - Fatal编程技术网

如何在kubernetes中重新启动主节点

如何在kubernetes中重新启动主节点,kubernetes,Kubernetes,我有一个kubernetes集群,有3个主机和3个工人,我想重新启动其中一个主机来更新主机的系统 因此,我可以直接在控制台上用reboot重新启动机器吗, 或者在重新启动之前需要执行一些步骤以避免服务中断和数据丢失的风险?如果需要重新启动节点(如内核升级、libc升级、硬件修复等),并且停机时间很短,那么当Kubelet重新启动时,它将尝试重新启动为其安排的POD。如果重新启动需要更长时间(默认时间为5分钟,由控制器管理器上的--pod收回超时控制),则节点控制器将终止绑定到不可用节点的pod。

我有一个kubernetes集群,有3个主机和3个工人,我想重新启动其中一个主机来更新主机的系统

因此,我可以直接在控制台上用
reboot
重新启动机器吗,
或者在重新启动之前需要执行一些步骤以避免服务中断和数据丢失的风险?

如果需要重新启动节点(如内核升级、libc升级、硬件修复等),并且停机时间很短,那么当Kubelet重新启动时,它将尝试重新启动为其安排的POD。如果重新启动需要更长时间(默认时间为5分钟,由控制器管理器上的--pod收回超时控制),则节点控制器将终止绑定到不可用节点的pod。如果存在相应的副本集(或复制控制器),则pod的新副本将在不同的节点上启动。因此,在所有POD都被复制的情况下,可以在不需要特别协调的情况下进行升级,前提是并非所有节点都会同时停机

如果希望对升级过程进行更多控制,可以使用以下工作流:

使用kubectl drain正常终止节点上的所有POD,同时将节点标记为不可调度:

kubectl drain $NODENAME
这可以防止新的吊舱在您试图将其卸下时降落到节点上。 对于具有副本集的pod,pod将被一个新pod替换,该pod将被调度到一个新节点。此外,如果pod是服务的一部分,则客户端将自动重定向到新的pod。 对于没有副本集的pod,您需要打开pod的新副本,并假设它不是服务的一部分,将客户端重定向到它。 在节点上执行维护工作。 使节点再次可调度:

kubectl uncordon $NODENAME

此外,如果节点承载ETCD,则需要滚动升级ETCD并备份数据

如果节点承载
ETCD
,则备份
ETCD
。您可以使用内置命令来备份数据,如

ETCDCTL_API=3 etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt \
     --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key \
     snapshot save /tmp/snapshot-pre-boot.db
现在使用

kubectl drain <master01>
kubectl排水管
执行系统更新|补丁并重新启动

现在将节点解压回集群

kubectl uncordon <master01>
kubectl uncordon

每当您希望在特定节点(主节点、工作节点)上重新启动操作系统时,K8s群集引擎都不会意识到该操作,它会将所有与群集相关的事件保存在ETCD键值存储中,备份最新的数据。一旦您希望仔细准备群集节点重新启动,您可能必须调整此节点上的维护作业,以便将其从调度中排出,并优雅地终止所有现有POD

如果您在定义的副本集中组合任何相关的K8s资源,则可以保证在任何时间通过每个可用节点运行指定数量的pod副本。如果POD未通过运行状况检查、被删除或终止,并与所需的副本匹配,它只需重新生成POD。对于承载ETCD的主节点,您需要特别小心ETCD的滚动升级和数据备份

1.备份单个主设备 如前所述,我们需要备份etcd。除此之外,我们还需要证书和 (可选)kubeadm配置文件,用于轻松恢复 大师。如果您使用kubeadm设置集群(没有特殊的 配置)您可以这样做:

 Backup certificates:

    $ sudo cp -r /etc/kubernetes/pki backup/

Make etcd snapshot:

    $ sudo docker run --rm -v $(pwd)/backup:/backup \
        --network host \
        -v /etc/kubernetes/pki/etcd:/etc/kubernetes/pki/etcd \
        --env ETCDCTL_API=3 \
        k8s.gcr.io/etcd-amd64:3.2.18 \
        etcdctl --endpoints=https://127.0.0.1:2379 \
        --cacert=/etc/kubernetes/pki/etcd/ca.crt \
        --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
        --key=/etc/kubernetes/pki/etcd/healthcheck-client.key \
        snapshot save /backup/etcd-snapshot-latest.db

Backup kubeadm-config:

    $ sudo cp /etc/kubeadm/kubeadm-config.yaml backup/
请注意,备份文件夹的内容应该存储在安全的地方,如果主文件夹被完全销毁,备份文件夹可以保存在安全的地方。为此,您可能需要使用AWS S3(或类似产品)

本例中有三个命令,所有这些命令都应该在主节点上运行。第一个复制包含kubeadm创建的所有证书的文件夹。这些证书用于Kubernetes群集中各个组件之间的安全通信。最后一个命令是可选的,仅当您使用kubeadm的配置文件时才相关。存储此文件可以方便地使用与恢复主文件时完全相同的配置初始化主文件

如果主节点更新出错,则只需恢复主节点的旧版本即可

您还可以自动化etcd备份。 手动执行单个备份可能是一个很好的第一步,但您确实需要进行定期备份才能使其有用。最简单的方法可能是使用上面示例中的命令,创建一个小脚本和一个不时运行脚本的cron作业。但既然我们正在运行Kubernetes,就使用Kubernetes。这将允许您跟踪Kubernetes中的备份作业,就像监视工作负载一样

您可以在此处找到更多信息:

2。下一步是将节点标记为不可调度,请运行以下命令:

    $ kubectl drain $NODENAME
kubectl drain命令一次只能向单个节点发出。但是,可以在不同的终端或后台为不同的节点并行运行多个kubectl drain命令。同时运行的多个drain命令仍将遵守您指定的规则

3.执行系统更新或补丁并重新启动

4.最后将节点解压回集群,执行以下命令:

$ kubectl uncordon $NODENAME
在GCP上有这样的选项,可以改进节点更新的管理。 关于维护Kubernetes节点,您可以在此处阅读: