由于之前单master集群在主节点发生故障时会导致集群整个不可用,生产环境中有很大风险所以要把集群升级为多master模式,其中任何一个节点宕机都不影响集群正常运行。
集群环境:
k8s版本:1.18.6
主节点1个从节点2个
主节点IP:192.168.192.133
从节点IP:192.192.192.189、192.168.192.139
新增主节点2个:192.168.192.181、192.168.192.198
下面开始配置多master集群,这里采用nginx作为apiserver的高可用。
第一步配置 /etc/hosts 每个节点都配置
192.168.192.181 k8s-master2 192.168.192.198 k8s-master3 192.168.192.133 k8smaster 192.168.192.189 k8snod1 192.168.192.139 k8snod2
第二步更新k8s证书
1,准备集群配置文件,如果忘记了可以用如下命令导出。
kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}' > kubeadm.yaml
2,现在我们需要把新增加的节点IP和nginx高可用域名加入到配置文件中加入后如下
apiServer: certSANs: - yourapihostname - k8smaster - k8s-master2 - k8s-master3 - 192.168.192.133 - 192.168.192.181 - 192.168.192.198 extraArgs: authorization-mode: Node,RBAC timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controlPlaneEndpoint: yourapihostname:8443 controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/k8sxio kind: ClusterConfiguration kubernetesVersion: v1.18.6 networking: dnsDomain: cluster.local podSubnet: 10.100.0.1/16 serviceSubnet: 10.96.0.0/16 scheduler: {}
3,以防万一备份k8s配置
cp -a /etc/kubernetes /etc/kubernetes.bak
4,移除现有证书
mv /etc/kubernetes/pki/apiserver.{crt,key} ~
5,直接用现有配置文件更新所有证书。
kubeadm init phase certs apiserver --config kubeadm.yaml
6,重启apiserver等相关容器
docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart
7,将最新的配置信息保存到集群
kubeadm config upload from-file --config kubeadm.yaml
第三步配置高可用负载均衡器,每个主节点都要配置:
1,编辑配置文件
vi /etc/kubernetes/nginx.conf
配置如下
error_log stderr notice; worker_processes 4; worker_rlimit_nofile 130048; worker_shutdown_timeout 10s; events { multi_accept on; use epoll; worker_connections 16384; } stream { upstream kube_apiserver { least_conn; server k8smaster:6443; server k8s-master2:6443; server k8s-master3:6443; } server { listen 8443; proxy_pass kube_apiserver; proxy_timeout 10m; proxy_connect_timeout 1s; } } http { aio threads; aio_write on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 5m; keepalive_requests 100; reset_timedout_connection on; server_tokens off; autoindex off; server { listen 8081; location /stub_status { stub_status on; access_log off; } } }
2,启动docker
docker run --restart=always -v /etc/kubernetes/nginx.conf:/etc/nginx/nginx.conf -v /etc/localtime:/etc/localtime:ro --name k8snginx --net host -d nginx
3,将旧的apiserver地址换成新的apiserver地址
sed -i "s/oldapiservername/newapiservername/g" `grep oldapiservername -rl /etc/kubernetes`
修改默认配置文件中的apiserver地址
vi ~/.kube/config
第四步更新控制面板:
在配置文件中增加 controlPlaneEndpoint 属性指向api负载均衡域名
上图已添加
更新完后再用命令上传回集群保存
kubeadm config upload from-file --config kubeadm.yaml
第五步添加主节点(提前安装好docker k8s基本环境)
1,在现有主节点操作把证书上传到集群
kubeadm init phase upload-certs --upload-certs
上面的命令会生成一个key下面会用到
2,下面的命令会生成一个token和命令后面会用到
kubeadm token create --print-join-command --config kubeadm.yaml
3,根据上面操作的信息屏凑一个加入主节点的命令,在新加入的2个主节点执行
kubeadm join api.k8s.local:8443 \ --token f27w7m.adelvl3waw9kqdhp \ --discovery-token-ca-cert-hash 第二步生成的token \ --control-plane --certificate-key 第一步生成的key
最后重启所有k8s相关组件,所有节点执行
docker ps |grep -E 'k8s_kube-apiserver|k8s_kube-controller-manager|k8s_kube-scheduler|k8s_etcd_etcd' | awk -F ' ' '{print $1}' |xargs docker restart
过一会查看集群状态不出意外多master集群就升级完成了
注意:
1,修改k8s默认端口范围
2,修改master /etc/kubenetes/admin.conf 下面的 api域名和端口
3,同步 新的配置文件到 /root/.kube/config
4,执行其他节点命令前拷贝 /usr/bin/kubeadm 到 其他节点 保证证书时间
查看etcd集群状态
docker run --rm -it \ --net host \ -v /etc/kubernetes:/etc/kubernetes registry.aliyuncs.com/k8sxio/etcd:3.4.3-0 etcdctl \ --cert /etc/kubernetes/pki/etcd/peer.crt \ --key /etc/kubernetes/pki/etcd/peer.key \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --endpoints https://192.168.192.198:2379 endpoint health --cluster
docker run --rm -it \ --net host \ -v /etc/kubernetes:/etc/kubernetes registry.aliyuncs.com/k8sxio/etcd:3.4.3-0 etcdctl \ --cert /etc/kubernetes/pki/etcd/peer.crt \ --key /etc/kubernetes/pki/etcd/peer.key \ --cacert /etc/kubernetes/pki/etcd/ca.crt \ --endpoints https://192.168.192.198:2379 endpoint health --cluster