下述内容是公司可能经常会遇见的情况。此文档会不断去完善。
比如:如果加一个worker节点、ETCD节点,下线一个master,再替换一个master,各种各样的日常遇到的问题和使用方式,如何办?
Master节点
#1、增加master节点
# 1.编辑hosts.yaml,增加master节点配置
$ vi inventory/mycluster/hosts.yaml
# 2.执行cluster.yml(不要用scale.yml) 此命令跟部署集群时是一模一样的。因为涉及到master节点的变动,现有的master节点也需要有配置调整。
$ ansible-playbook -i inventory/mycluster/hosts.yaml cluster.yml -b -v
# 3.重启nginx-proxy - 在所有节点执行下面命令重启nginx-proxy 这个要在每个节点都操作。这里用的是docker,用containerd的话,要把docker替换成ctl???。
为什么要重启,因为nginx的配置会变化,nginx配置的文件里写了所有apiserver的地址
如果增加master,那么apiserver地址就会变化。那么nginx重启就会重新记载配置文件。
$ docker ps | grep k8s_nginx-proxy_nginx-proxy | awk '{print $1}' | xargs docker restart
#2、删除master节点(比增加节点稍微麻烦一些)
#如果你要删除的是配置文件中第一个节点,需要先调整配置,将第一行(node-1)配置下移,再重新运行cluster.yml,使其变成非第一行配置。举例如下:
# 场景1:下线node-1节点
$ vi inventory/mycluster/hosts.yaml
# 变更前的配置
children:
kube-master:
hosts:
node-1:
node-2:
node-3:
# 变更后的配置
children:
kube-master:
hosts:
#如果要删除node-1节点,首先要调整node-1和node-2的位置
node-2:
node-1:
node-3:
# 再执行一次cluster.yml
$ ansible-playbook -i inventory/mycluster/hosts.yaml -b cluster.yml
# 场景2:非第一行的master节点下线流程: 那么上述的调整就映射成了此时的非第一行的流程。
# 执行remove-node.yml
(不要在hosts.yaml中编辑删除要下线的节点,
因为要保证hosts.yaml不变,然后执行remove-node.yml,传一个环境变量node=NODE-NAME你的要下线的节点的名字。
上述命令执行成功之后,为了保证一致性,要把hosts.yaml也编辑一下,同步下线的节点。)
$ ansible-playbook -i inventory/mycluster/hosts.yaml remove-node.yml -b -v -e "node=NODE-NAME"
# 同步hosts.yaml(编辑hosts.yaml将下线的节点删除,保持集群状态和配置文件的一致性)
$ vi inventory/mycluster/hosts.yaml
Worker节点
#1、增加worker节点
# 刷新缓存
$ ansible-playbook -i inventory/mycluster/hosts.yaml facts.yml -b -v
# 修改配置hosts.yaml,增加节点 这个编辑之后,才能执行下述的scale.yml。
$ vi inventory/mycluster/hosts.yaml
# 执行scale添加节点,--limit限制只在某个固定节点执行
--一定要要加上--limit=NODE-NAME,指定添加worker节点的名字。限定ansible-playbook只在哪一个节点NODE-NAME上执行,而不会影响现有的节点,当然,现有的节点也不会做任何操作的。
$ ansible-playbook -i inventory/mycluster/hosts.yaml scale.yml --limit=NODE-NAME -b -v
#2、删除worker节点
#跟删除master节点是类似的。只需要执行remove-node.yml,环境变量把要移除的节点传进去。
# 此命令可以下线节点,不影响其他正在运行中的节点,并清理节点上所有的容器以及kubelet,恢复初始状态,多个节点逗号分隔
$ ansible-playbook -i inventory/mycluster/hosts.yaml remove-node.yml -b -v -e "node=NODE-NAME-1,NODE-NAME-2,..."
# 手工同步hosts.yaml(编辑hosts.yaml将下线的节点删除即可,保持集群状态和配置文件的一致性)
$ vi inventory/mycluster/hosts.yaml
ETCD节点
#如果要变更的etcd节点同时也是master或worker节点,需要先将master/worker节点按照前面的文档操作下线,保留纯粹的etcd节点
--要求在生产环境部署时,最好保证ETCD节点和集群节点分开部署。那么日常运维也更加方便。
#1、增加etcd节点
# 编辑hosts.yaml(可以增加1个或2个etcd节点配置) 在ETCD节点那段增加ETCD节点配置。
$ vi inventory/mycluster/hosts.yaml
# 更新etcd集群
$ ansible-playbook -i inventory/mycluster/hosts.yaml upgrade-cluster.yml --limit=etcd,kube-master -e ignore_assert_errors=yes -e etcd_retries=10
#2、删除etcd节点
# 执行remove-node.yml(不要在hosts.yaml中删除要下线的节点)
$ ansible-playbook -i inventory/mycluster/hosts.yaml remove-node.yml -b -v -e "node=NODE-NAME"
# 把node下线之后,手工同步hosts.yaml(编辑hosts.yaml将下线的节点删除,保持集群状态和配置文件的一致性)
$ vi inventory/mycluster/hosts.yaml
# 运行cluster.yml给node节点重新生成etcd节点相关的配置(把用到etcd的主键同步更新掉)
$ ansible-playbook -i inventory/mycluster/hosts.yaml -b cluster.yml
其他常用命令
#1、集群reset
# 运行reset.yml一键清理集群
$ ansible-playbook -i inventory/mycluster/hosts.yaml -b -v reset.yml
#2、自定义play起始点
#当我们执行play的过程中如果有问题,需要重新执行的时候,如果重新执行指令会重新经历前面漫长的等待,这个时候“跳过”功能就显得非常有用
#当运行集群,出现问题时,不从头不来,而从出错的前一步或前几步继续运行的话,那么可以指定--start-at-task,会跳过前面的任务。
# 通过--start-at-task指定从哪个task处开始执行,会跳过前面的任务,举例如下
$ ansible-playbook --start-at-task="reset | gather mounted kubelet dirs"
#3、忽略错误
#当有些错误是我们确认可以接受的或误报的,可以配置ignore_errors: true,避免task出现错误后影响整个流程的执行。
#当运行集群,出现的错误,确认是不影响集群的,或者说环境比较特殊,可配置ignore_errors: true自动跳过。
# 示例片段如下:
- name: "Remove physical volume from cluster disks."
environment:
PATH: "{{ ansible_env.PATH }}:/sbin"
become: true
command: "pvremove {{ disk_volume_device_1 }} --yes"
ignore_errors: true
标题:Kubernetes(四)kubespray方式(4.6)基于kubespray的集群运维(暂未测试)
作者:yazong
地址:https://blog.llyweb.com/articles/2022/11/02/1667322281711.html