说明:示例是kubernetesV1.23.6版本的master扩容,kubernetes使用的是kubeadm的rpm包部署
环境之前有的是单节点master和两个ndoe,一个ingress
由于之前将master02添加到集群了,所以现在删除设置为不可调度
![](https://img-blog.csdnimg.cn/img_convert/29b07b6275a13a127221007fdb667bdc.png)
服务器的环境是CentOs7.8
![](https://img-blog.csdnimg.cn/img_convert/1cc316e753625e65dbc98ff515e3798a.png)
第一步:先准备master02机器环境(最基础的环境不在冗余叙述,不是重点)
防火墙关闭,selinux设置为disabled,内核转发等功能打开,安装docker-ce 20.0.14版本,kubelet,kubectl和kubeadm版本是V1.23.6版本,各个节点hosts文件配置master02,master02配置免密登录;
第二步:如果服务器的内核比较低需要先升级一下内核,最好在大于4.0版本之上;
![](https://img-blog.csdnimg.cn/img_convert/ee85e0ccecc654d923e1bf0f08706198.png)
第三步:在master01上面查看需要的镜像,然后再借点master02上下载对应的镜像,通过杭州阿里云或者是docker hub的镜像游乐园下载官方镜像:Play with Docker,或者将master01上的镜像打包过来docker save和docker load;
![](https://img-blog.csdnimg.cn/img_convert/fced9da52302ce323e80326e6872261a.png)
此处采用的是将master01上的镜像上传到master02上,比较方便;
![](https://img-blog.csdnimg.cn/img_convert/ff1037c12efde24e08b0e5415a489fe2.png)
包括calico的网络插件也一并上传到master02上;
![](https://img-blog.csdnimg.cn/img_convert/48e7a8694e04e8c0b39f0029305e7eb4.png)
第四步:在master01上执行,生成配置文件;
$ kubectl -n kube-system get configmap kubeadm-config -o jsonpath='{.data.ClusterConfiguration}'> /tmp/kubeadm.yaml
![](https://img-blog.csdnimg.cn/img_convert/cb11e3dd8bde62ded47b80af0df1b905.png)
上面的配置中并没有列出额外的 SAN 信息,我们要添加一个新的数据,需要在 apiServer 属性下面添加一个 certsSANs 的列表。
controlPlaneEndpoint: 192.168.66.50:6443
apiServer:
certSANs:
- master01
- master02
- 192.168.66.50
- 192.1568.66.55
extraArgs:
authorization-mode: Node,RBAC
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: k8s.gcr.io
controlPlaneEndpoint: 192.168.66.50:6443
kind: ClusterConfiguration
kubernetesVersion: v1.23.6
networking:
dnsDomain: cluster.local
podSubnet: 10.42.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}
![](https://img-blog.csdnimg.cn/img_convert/80a238b55dfcc2d5c7b0f6d37d2d6f67.png)
生成配置文件这种方法添加扩展master节点,我始终不成功,不知道什么原因,添加的master02节点作为集群的node节点,而不是controller节点存在(自己琢磨应该是参数问题);
还可以使用命令直接编辑添加参数;
# kubectl edit cm kubeadm-config -n kube-system
![](https://img-blog.csdnimg.cn/img_convert/d171aac4aa889670fad0d2479a0884a4.png)
第五步:移除apiserver的证书,在master01上面执行;
#mv /etc/kubernetes/pki/apiserver.{crt,key} /tmp/
![](https://img-blog.csdnimg.cn/img_convert/692d32c3d95c64a0df86b18cc6fbf321.png)
![](https://img-blog.csdnimg.cn/img_convert/33eff8196cea2c7f12a99100702b1b9e.png)
第六步:使用kubnadm命令生成新的apiserver证书,在master01上面执行;
# kubeadm init phase certs apiserver --config /tmp/kubeadm.yaml
第七步:重启apiserver容器,在master01上面执行;
docker kill $(docker ps | grep apiserver | grep -v pause | awk '{print $1}')
![](https://img-blog.csdnimg.cn/img_convert/8d73512892e0a0f3b1b62ca4b87704db.png)
查看证书使用openssl命令;
# openssl x509 -in /etc/kubernetes/pki/apiserver.crt -text
![](https://img-blog.csdnimg.cn/img_convert/972501bd7513280f669fa95991092b3c.png)
第八步:将master01上的证书同步到master02上面;
# cd /etc/kubernetes/pki/
# scp ca.* master02:/etc/kubernetes/pki/
# scp sa.* master02:/etc/kubernetes/pki/
# scp front-proxy-ca.* master02:/etc/kubernetes/pki/
# scp ./etcd/ca.* master02:/etc/kubernetes/pki/etcd/
# scp ../admin.conf master02:/etc/kubernetes/
![](https://img-blog.csdnimg.cn/img_convert/05a58fe6351a1eaf3359fc4a639f7a23.png)
![](https://img-blog.csdnimg.cn/img_convert/d828c05e5e39d8410aa703600ea112e4.png)
第十步:添加控制平面
将集群的证书上传到集群中,供其他控制节点使用(在master01上完成):
# kubeadm init phase upload-certs --upload-certs
![](https://img-blog.csdnimg.cn/img_convert/e61ed948a8f65b57aa90e1456afff832.png)
生成token(master01上面完成):
# kubeadm token create --print-join-command
![](https://img-blog.csdnimg.cn/img_convert/562398eb412a2e41335f39c6c51a9934.png)
master02加入集群(在master02上面完成);
在master02加入集群之前先要保证master02上面的kubelet可以正常启动,否则会报错;
# kubeadm join 192.168.66.50:6443 --token h305n1.vpc223usk7yze0fm --discovery-token-ca-cert-hash sha256:5d73260eb588e2f31183bfa04b63fab12f614fa6cba8c382ceb9ea555b1e70e7 --control-plane --certificate-key 74890361532bc100970cb253c7cd6e939c985694324f5233b29c721b79e4e693
![](https://img-blog.csdnimg.cn/img_convert/24d90cbb3f6d198ad593393445e9349c.png)
![](https://img-blog.csdnimg.cn/img_convert/83ee845271dfdad223651de7c3552c02.png)
#mkdir -p $HOME/.kube
#cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
#chown $(id -u):$(id -g) $HOME/.kube/config
![](https://img-blog.csdnimg.cn/img_convert/384a544077bca50a28e1cf1018b14c5e.png)
参数:
--control-plane:是将节点加入进群,作为控制节点,如果是加入worker不需要此参数;
--certificate-key:在k8s新的版本中加入节点是需要此参数,感觉很多博客没有此参数,不知道是不是k8s版本的原因(自己猜测);
注意:
1:在kubeadm join之后/var/lib/kubelet才会存在下面的文件,在kubeadm join之前/var/lib/kubelet是没有任何文件,systemctl stat kubelet会报错,加载不到配置文件;
![](https://img-blog.csdnimg.cn/img_convert/fbf65a85e19d31310a9bbc414027f38c.png)
2:把master02在加入集群控制平面的时候可能会报错,此时需要用kubeadm reset命令回滚,此时还不够,还需要删除master02:/etc/kubernetes/下的所有文件,重新上传证书等;
![](https://img-blog.csdnimg.cn/img_convert/986f9bbe30f105c3ebea66ccbe782336.png)
第十一步:验证master02节点时候已经加入到k8s集群,以及是否作为master节点出现
#kubectl get nodes