1. 高可用集群简介
在之前我们做的k8s实验中,都只使用了一个master节点进行调度,所以当这个节点down掉的时候集群将无法进行部署管理工作。而使用k8s高可用集群设置多个master节点来实现高可用,haproxy配置三个master节点实现负载均衡,并且实现高可用。
实验准备如下:
准备五台虚拟机(server1-5)(172.25.10.1-5)
其中server1是harbor仓库
server2,server3,server4是集群的master端
server2作haproxy负载均衡
server5是集群的worker端
2. haproxy负载均衡
在server2上安装haproxy
[root@server2 ~]# yum install haproxy -y
编辑配置文件
[root@server2 ~]# cd /etc/haproxy/
[root@server2 haproxy]# ls
haproxy.cfg
[root@server2 haproxy]# vim haproxy.cfg
添加一个监控haproxy的模块,端口为80
server2既是k8s集群的master节点,又是haproxy端,所以要使用其他端口,启用8443端口访问haproxy,然后访问的模式为tcp
这三个是后端,使用负载均衡,三个master节点使用6443端口,模式为tcp
启动haproxy服务
[root@server2 haproxy]# systemctl start haproxy.service
查看端口,80监视haproxy,8443作为haproxy传输端口
访问http://172.25.10.2/admin
3. 配置高可用集群
提前安装配置好三台master主机的docker和k8s
server3,4下载haproxy
将server2上配置好的配置文件发送过去
配置好高可用的yum源
安装高可用集群套件
yum install -y pacemaker pcs psmisc policycoreutils-python
给另外两台主机也配置yum源(提前做好免密,操作方便)
三台master主机都要安装高可用套件
ssh server3 yum install -y pacemaker pcs psmisc policycoreutils-python
ssh server4 yum install -y pacemaker pcs psmisc policycoreutils-python
启动服务并且设置开机自启
给集群用户一个密码
添加成功
配置集群节点认证
创建三个节点的集群,前提是要认证通过
启动集群,只启动两个集群,第一个是高可用心跳,第二个是集群资源管理器
查看集群状态,有警告
禁掉stonith,再次查看节点online
停掉haproxy服务,因为集群需要调用资源,不可以手动启动
创建vip
[root@server2 ~]# pcs resource create vip ocf:heartbeat:IPaddr2 ip=172.25.10.100 cidr_netmask=32 op monitor interval=30s
手动停掉node
[root@server2 ~]# pcs node standby
查看发现,因为高可用,vip转移到了server3
开启
[root@server2 ~]# pcs node unstandby
server2回来了
通过本地资源配置haproxy,60s监控一次,将启动haproxy服务交给集群完成
[root@server3 sysctl.d]# pcs resource create haproxy systemd:haproxy op monitor interval=60s
查看状态,发现两个服务并不在一个server上,资源不再一个节点上,需要添加约束
添加约束,将两个服务放到一个组内,值得注意的是,添加服务的顺序就是启动服务的顺序,谁在前先启动谁
[root@server2 ~]# pcs resource group add hagroup vip haproxy
查看状态,两个服务在一个节点上
停掉server3节点,查看服务漂移到了其他节点上
4. 搭建k8s高可用集群
打印默认情况下的配置,然后编辑生成文件
kubeadm config print init-defaults > kubeadm-init.yaml
vim kubeadm-init.yaml
添加IP
更改主机名
添加vip
添加私有仓库地址和pod子网,注意k8s的版本要和仓库内的apiserver版本一致
配置haproxy工作模式ipvs
拉取镜像
kubeadm config images pull --config kubeadm-init.yaml
初始化集群, --upload-certs同步证书
kubeadm init --config kubeadm-init.yaml --upload-certs
初始化成功,一个添加master,一个添加worker
查看发现还有pod没有ready,这是因为网络插件没有准备好
编辑文件,修改网络类型为host-gw直连网关
[root@server2 ~]# vim kube-flannel.yml
应用文件,pod就绪,网络组件就绪
使用初始化结束后提示的信息,将server3,server4加入master集群
所有节点就绪
5. 添加worker节点
在server5上安装docker和k8s,开机自启
发送json文件和证书给server5
添加server5的解析
发送内核参数文件给server5,重新获取内核参数
docker info查看cgroup类型修改为systemd
关闭swap分区
安装ipvs模块
[root@server5 ~]# yum install -y ipvsadm
安装kubeadm和kubelet,设置开机自启
[root@server5 ~]# yum install kubeadm kubelet
加入集群
6、高可用测试
运行一个pod节点于当前master主机,当此master主机down掉后,节点仍然可在其他master主机上查看状况并进行操作管理。现在我们应该关闭其中一个master端,测试其他master能否正常接管,由于我这里server5有haproxy也是master,关掉他,看不到效果了,所以测试关掉server6。
注意三个master k8s主机只容忍最多一个down掉,其余两个保持高可用。
关闭其中一个master端
pod仍然运行