K8s 集群 master 节点迁移

背景

当前测试环境 K8s 集群 3 台 master 机器配置相对较高,之前为了充分利用资源将 workload 与 control plane + etcd 混部,这样大大降低了集群的稳定性,而 IaaS 层没有用虚拟化技术,不支持原地升级规格,因此我们决定通过迁移的方式来实现:

  1. 让 K8s master 组件独享 3 台机器,与 workload 分开部署
  2. 用 3 台性能较差的机器代替,避免资源浪费

旧的 master 节点为:oldmaster-1 oldmaster-2 oldmaster-3
新的 master 节点为:master-1 master-2 master-3

前置条件

检查客户端配置

  1. 检查所有 kubelet server 配置为 LB 地址

如果不是则改为 LB 地址

1
ansible all -m shell -a 'sed -i "s#server: https://.*#server: https://10.200.20.241:443#" /etc/kubernetes/kubelet.conf'
  1. 检查 kube-proxy server 配置为 LB 地址
1
kubectl -n kube-system get configmap kube-proxy -o yaml | sed 's#server: https://.*#server: https://10.200.20.241:443#' | kubectl apply -f -
  1. 检查所有 controller-manager 和 scheduler server 配置为本机 apiserver 6443 地址

  2. 确保所有业务方 kubeconfig 都使用 LB 地址

检查 /etc/fstab 正确性

检查新的 master 机器 /etc/fstab 是否正确,防止重启启动失败。

操作步骤

排空 master-1-3,增加 labels 和 taints

  1. drain 掉 master-1 master-2 master-3,3台机器
1
2
3
kubectl drain master-1 --ignore-daemonsets --force
kubectl drain master-2 --ignore-daemonsets --force
kubectl drain master-3 --ignore-daemonsets --force
  1. 设置 labels 和 taints,uncordon 3台新机器,防止其他 Pod 调度上来
1
2
3
kubectl label node master-1 master-2 master-3 node-role.kubernetes.io/master=true
kubectl taint node master-1 master-2 master-3 node-role.kubernetes.io/master=true:NoSchedule
kubectl taint node master-1 master-2 master-3 test-only=true:NoSchedule

部署 master 组件

etcd 加入集群

初始化存储目录

1
2
3
4
rm /disk4/* -rf
umount /disk4
mkdir /var/lib/etcd
mount /dev/sdo1 /var/lib/etcd

将 3 个新的 etcd 依次加入集群,保持 6 节点 etcd

1
2
3
etcdctl member add master-1 http://10.200.20.101:2380
etcdctl member add master-2 http://10.200.20.102:2380
etcdctl member add master-3 http://10.200.20.103:2380

依次启动 3 个新的 etcd

注意执行一次 member add 后启动一个 etcd

准备证书

  1. 拷贝证书 /etc/kubernetes/pki

  2. 重新签发 apiserver 证书,包含 3 个新 apiserver 的 IP 和 LB 地址

参考:Kubernetes-APIServer-证书的手动签发

  1. 替换 master-1-3 apiserver.crt

配置并启动 apiserver

  1. 将 apiserver etcd url 配置为 3 个 新的 etcd 集群地址
1
--etcd-servers=http://10.200.20.101:2379,http://10.200.20.102:2379,http://10.200.20.103:2379

apiserver-count 设置为 2

  1. 启动 apiserver

配置并启动 apiserver-nginx-lb

  1. 将 apiserver-nginx-lb upstream 配置为 新的 3 台 apiserver地址
1
2
3
4
5
upstream kube_apiserver {
server 10.200.20.101:8686 max_fails=0;
server 10.200.20.102:8686 max_fails=0;
server 10.200.20.103:8686 max_fails=0;
}
  1. 启动 apiserver-nginx-lb

  2. kubectl 测试 3 台新节点的 443 端口是否可以正常访问集群。

配置并启动 kube-controller-manager 和 kube-scheduler

  1. 拷贝并修改 controller-manager.confscheduler.conf

  2. 拷贝 controller-manager 和 scheduler 配置和 manifests 文件,启动组件

更新 calico 配置

修改 cm calico-config更新 etcd 地址

重启 calico-node 和 calico-policy-controller

切换流量

  1. master-1 master-2 master-3 安装配置 keepalived,配置 VIP
  2. 停掉 oldmaster-1-3 的 keepalived,让 VIP 漂移至 master-1-3

移除老的组件

  1. 将 apiserver-nginx-lb、apiserver 移除
  2. 将 etcd 依次踢出集群
1
etcdctl member remove <member_id>
  1. 修改新的 etcd 配置, --initial-cluster 参数去掉老的 etcd url

删除 labels 和 taints

1
2
kubectl label node oldmaster-1 oldmaster-2 oldmaster-3 node-role.kubernetes.io/master-
kubectl taint node master-1 master-2 master-3 test-only-

更新监控

更新 kube-apiserver-exporter endpoints

Author

whypro

Posted on

2019-01-01

Updated on

2022-11-11

Licensed under

Comments

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×