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