由于之前单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