K8s 集群 master 节点迁移
背景
当前测试环境 K8s 集群 3 台 master 机器配置相对较高,之前为了充分利用资源将 workload 与 control plane + etcd 混部,这样大大降低了集群的稳定性,而 IaaS 层没有用虚拟化技术,不支持原地升级规格,因此我们决定通过迁移的方式来实现:
- 让 K8s master 组件独享 3 台机器,与 workload 分开部署
- 用 3 台性能较差的机器代替,避免资源浪费
旧的 master 节点为:oldmaster-1 oldmaster-2 oldmaster-3
新的 master 节点为:master-1 master-2 master-3
前置条件
检查客户端配置
- 检查所有 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' |
- 检查 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 - |
检查所有 controller-manager 和 scheduler server 配置为本机 apiserver 6443 地址
确保所有业务方 kubeconfig 都使用 LB 地址
检查 /etc/fstab 正确性
检查新的 master 机器 /etc/fstab 是否正确,防止重启启动失败。
操作步骤
排空 master-1-3,增加 labels 和 taints
- drain 掉 master-1 master-2 master-3,3台机器
1 | kubectl drain master-1 --ignore-daemonsets --force |
- 设置 labels 和 taints,uncordon 3台新机器,防止其他 Pod 调度上来
1 | kubectl label node master-1 master-2 master-3 node-role.kubernetes.io/master=true |
部署 master 组件
etcd 加入集群
初始化存储目录
1 | rm /disk4/* -rf |
将 3 个新的 etcd 依次加入集群,保持 6 节点 etcd
1 | etcdctl member add master-1 http://10.200.20.101:2380 |
依次启动 3 个新的 etcd
注意执行一次 member add 后启动一个 etcd
准备证书
拷贝证书 /etc/kubernetes/pki
重新签发 apiserver 证书,包含 3 个新 apiserver 的 IP 和 LB 地址
参考:Kubernetes-APIServer-证书的手动签发
- 替换 master-1-3 apiserver.crt
配置并启动 apiserver
- 将 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
- 启动 apiserver
配置并启动 apiserver-nginx-lb
- 将 apiserver-nginx-lb upstream 配置为 新的 3 台 apiserver地址
1 | upstream kube_apiserver { |
启动 apiserver-nginx-lb
kubectl 测试 3 台新节点的 443 端口是否可以正常访问集群。
配置并启动 kube-controller-manager 和 kube-scheduler
拷贝并修改
controller-manager.conf
和scheduler.conf
拷贝 controller-manager 和 scheduler 配置和 manifests 文件,启动组件
更新 calico 配置
修改 cm calico-config
更新 etcd 地址
重启 calico-node 和 calico-policy-controller
切换流量
- master-1 master-2 master-3 安装配置 keepalived,配置 VIP
- 停掉 oldmaster-1-3 的 keepalived,让 VIP 漂移至 master-1-3
移除老的组件
- 将 apiserver-nginx-lb、apiserver 移除
- 将 etcd 依次踢出集群
1 | etcdctl member remove <member_id> |
- 修改新的 etcd 配置,
--initial-cluster
参数去掉老的 etcd url
删除 labels 和 taints
1 | kubectl label node oldmaster-1 oldmaster-2 oldmaster-3 node-role.kubernetes.io/master- |
更新监控
更新 kube-apiserver-exporter endpoints
K8s 集群 master 节点迁移