前言
搭建多master集群Kubernetes之前先要完成单节点部署,单节点部署参照上一篇博客【云原生Kubernetes系列第三篇】二进制部署单节点Kubernetes(k8s)v1.20
一、多master集群概述
1.1 node如何找到master
node节点的kubelet.kubeconfig和kube-proxy.kubeconfig文件写明了apiserver的端口号和master节点的IP地址,从而找到master节点,当我们在部署集群的时候,就要有两个master,但是一个集群中只能有一个主,该如何指定呢?我们可以使用VIP地址。
1.2 如何配置master集群
我们可以把master集群当做nginx服务器群,node节点是客户端,客户端想要找到服务器需要通过负载均衡器实现转发,我们可以安装一个调度器,调度器使用LVS、nginx、haproxy都可以,为了简单我们安装nginx做负载均衡器,再考虑负载均衡器的高可用,搭建两台nginx服务器实现调度器的高可用。
1.3 集群架构
多master一般装两到三台,三台比两台更有保障,同时会有一个选举机制,需要使用奇数台,两台master可仅仅满足高可用和负载
#scheduler.sh文件中定义了多节点的选举机制 --leader-elect=true:当该组件启动多个时,自动启动 leader 选举
k8s中Controller-Manager和Scheduler的选主逻辑:k8s中的etcd是整个集群所有状态信息的存储,涉及数据的读写和多个etcd之间数据的同步,对数据的一致性要求严格,所以>使用较复杂的 raft 算法来选择用于提交数据的主节点。而 apiserver 作为集群入口,本身是无状态的web服务器,多个 apiserver 服务之间直接负载请求并不需要做选主。Controller-Manager 和 Scheduler 作为任务类型的组件,比如 controller-manager 内置的 k8s 各种资源对象的控制器实时的 watch apiserver 获取对象最新的变化事件做期望状>态和实际状态调整,调度器watch未绑定节点的pod做节点选择,显然多个这些任务同时工作是完全没有必要的,所以 controller-manager 和 scheduler 也是需要选主的,但是选主逻辑和 etcd 不一样的,这里只需要保证从多个 controller-manager 和 scheduler 之间选出一个 leader 进入工作状态即可,而无需考虑它们之间的数据一致和同步。
二、多master集群部署过程
2.1 实验环境
主机 |
IP地址 | 组件 |
k8s集群master01 | 192.168.109.131 | kube-apiserver kube-controller-manager kube-scheduler |
k8s集群master02 |
192.168.109.134 | |
k8s集群node01 |
192.168.109.132 | kubelet kube-proxy docker |
k8s集群node02 | 192.168.109.133 | kubelet kube-proxy docker |
etcd集群节点1 | 192.168.109.131 | etcd |
etcd集群节点2 | 192.168.109.132 | etcd |
etcd集群节点3 | 192.168.109.133 | etcd |
负载均衡nginx+keepalive01(master) | 192.168.109.135 | |
负载均衡nginx+keepalive02(backup) | 192.168.109.137 | |
VIP | 192.168.109.200 |
考虑到电脑性能,我将etcd部署在master和node节点上,master集群实现高可用,并且我这边只搭建两个node节点
2.2 操作系统初始化配置
#关闭防火墙 systemctl stop firewalld systemctl disable firewalld iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X #-X清除自定义的规则 #关闭selinux setenforce 0 sed -i 's/enforcing/disabled/' /etc/selinux/config #关闭swap swapoff -a sed -ri 's/.*swap.*/#&/' /etc/fstab #根据规划设置主机名 hostnamectl set-hostname master01 hostnamectl set-hostname node01 hostnamectl set-hostname node02 #在master添加hosts cat >> /etc/hosts << EOF 192.168.109.131 master01 192.168.109.134 master02 192.168.109.132 node01 192.168.109.133 node02 EOF #调整内核参数 cat > /etc/sysctl.d/k8s.conf << EOF #开启网桥模式,可将网桥的流量传递给iptables链 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 #关闭ipv6协议 net.ipv6.conf.all.disable_ipv6=1 net.ipv4.ip_forward=1 EOF sysctl --system #时间同步 yum install ntpdate -y ntpdate time.windows.com
2.3 配置master02节点
#我们直接将master01的文件复制到master02,不在重复安装 [root@master01 opt]# scp -r kubernetes/ master02:/opt #创建软连接到系统,便于识别 [root@master02 bin]# ln -s /opt/kubernetes/bin/* /usr/local/bin/ [root@master02 cfg]# vim kube-apiserver --bind-address=192.168.109.134 #修改 --advertise-address=192.168.109.134 #修改 #将master01的etcd证书复制过去 [root@master01 opt]# scp -r etcd/ master02:/opt #将master01中kubectl的配置文件复制过去 [root@master01 ~]# scp -r .kube/ master02:/root #此时master02可以查看到node [root@master02 opt]# kubectl get node NAME STATUS ROLES AGE VERSION 192.168.109.132 Ready <none> 7h11m v1.20.11 192.168.109.133 Ready <none> 7h1m v1.20.11 #将master01节点的服务复制谷片区 [root@master01 ~]# cd /usr/lib/systemd/system [root@master01 system]# ls kube* kube-apiserver.service kube-scheduler.service kube-controller-manager.service [root@master01 system]# scp kube* master02:`pwd` #master02开启服务 ls kube* systemctl start kube-apiserver.service kube-scheduler.service kube-controller-manager.service systemctl enable kube-apiserver.service kube-scheduler.service kube-controller-manager.service systemctl status kube-apiserver.service kube-scheduler.service kube-controller-manager.service