k8s高可用集群搭建
参考官方文档:Kubernetes 文档支持的版本 | Kubernetes
注:本文章搭建的k8s集群版本为1.31.1,系统版本:CentOS 8 (stream)
一、概述
创建高可用集群有两种方法:
1、使用堆叠(stacked)控制平面节点,其中 etcd 节点与控制平面节点共存
2、使用外部 etcd 节点,其中 etcd 在与控制平面不同的节点上运行
1.1 堆叠(Stacked)etcd 拓扑
堆叠(Stacked)HA 集群是一种这样的拓扑, 其中 etcd 分布式数据存储集群堆叠在 kubeadm 管理的控制平面节点上,作为控制平面的一个组件运行。
每个控制平面节点运行 kube-apiserver
、kube-scheduler
和 kube-controller-manager
实例。 kube-apiserver
使用负载均衡器暴露给工作节点。
每个控制平面节点创建一个本地 etcd 成员(member),这个 etcd 成员只与该节点的 kube-apiserver
通信。 这同样适用于本地 kube-controller-manager
和 kube-scheduler
实例。
这种拓扑将控制平面和 etcd 成员耦合在同一节点上。相对使用外部 etcd 集群, 设置起来更简单,而且更易于副本管理。
然而,堆叠集群存在耦合失败的风险。如果一个节点发生故障,则 etcd 成员和控制平面实例都将丢失, 并且冗余会受到影响。你可以通过添加更多控制平面节点来降低此风险。
因此,你应该为 HA 集群运行至少三个堆叠的控制平面节点。
这是 kubeadm 中的默认拓扑。当使用 kubeadm init
和 kubeadm join --control-plane
时, 在控制平面节点上会自动创建本地 etcd 成员。
1.2 外部 etcd 拓扑
具有外部 etcd 的 HA 集群是一种这样的拓扑, 其中 etcd 分布式数据存储集群在独立于控制平面节点的其他节点上运行。
就像堆叠的 etcd 拓扑一样,外部 etcd 拓扑中的每个控制平面节点都会运行 kube-apiserver
、kube-scheduler
和 kube-controller-manager
实例。 同样,kube-apiserver
使用负载均衡器暴露给工作节点。但是 etcd 成员在不同的主机上运行, 每个 etcd 主机与每个控制平面节点的 kube-apiserver
通信。
这种拓扑结构解耦了控制平面和 etcd 成员。因此它提供了一种 HA 设置, 其中失去控制平面实例或者 etcd 成员的影响较小,并且不会像堆叠的 HA 拓扑那样影响集群冗余。
但此拓扑需要两倍于堆叠 HA 拓扑的主机数量。 具有此拓扑的 HA 集群至少需要三个用于控制平面节点的主机和三个用于 etcd 节点的主机。
综上,第二种方法适合大规模集群,成本较高,所以我们选择使用Stacked来部署高可用集群,因为 etcd 和控制平面共享相同的节点,节约了硬件资源,适合中小型集群,安装和维护较为简单。
二、节点规划
三个主节点,三个从节点,保证master节点数>=3的奇数
角色 | 主机名 | IP地址 | CPU/内存 |
---|---|---|---|
master | k8s-master1 | ens33: 10.45.25.100; ens37: 10.13.20.100 | 2G/2C |
master | k8s-master2 | ens33: 10.45.25.101; ens37: 10.13.20.101 | 2G/2C |
master | k8s-master3 | ens33: 10.45.25.102; ens37: 10.13.20.102 | 2G/2C |
node | k8s-node1 | ens33: 10.45.25.103; ens37: 10.13.20.103 | 2G/2C |
node | k8s-node2 | ens33: 10.45.25.104; ens37: 10.13.20.104 | 2G/2C |
node | k8s-node3 | ens33: 10.45.25.105; ens37: 10.13.20.105 | 2G/2C |
VIP | master.k8s.io | 10.45.25.200 | / |
主节点所需服务:keepalived、haproxy、containerd、kubectl、kubeadm、kubelet。
从节点所需服务:containerd、kubectl、kubeadm、kubelet
三、环境准备
3.1 配置hosts解析
每台主机都需要配置
# 修改主机名,以k8s-master1为例。
hostnamectl set-hostname k8s-master1
# 配置hosts解析,只以master1为例。
[root@k8s-master1 ~]# vim /etc/hosts
[root@k8s-master1 ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.45.25.100 k8s-master1
10.45.25.101 k8s-master2
10.45.25.102 k8s-master3
10.45.25.103 k8s-node1
10.45.25.104 k8s-node2
10.45.25.105 k8s-node3
10.45.25.200 master.k8s.io
[root@k8s-master1 ~]#
3.2 关闭防火墙和selinux
每台主机都需要配置
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
3.3 关闭交换分区
每台主机都要配置
sudo swapoff -a
sed -ri 's/.*swap.*/#&/' /etc/fstab
3.4 master免密登录
配置所有主节点之间的免密登录,只在主节点配置
[root@k8s-master1 ~]# ssh-keygen
[root@k8s-master1 ~]# ssh-copy-id 10.45.25.100
[root@k8s-master1 ~]# ssh-copy-id 10.45.25.101
[root@k8s-master1 ~]# ssh-copy-id 10.45.25.102
[root@k8s-master2 ~]# ssh-keygen
[root@k8s-master2 ~]# ssh-copy-id 10.45.25.100
[root@k8s-master2 ~]# ssh-copy-id 10.45.25.101
[root@k8s-master2 ~]# ssh-copy-id 10.45.25.102
[root@k8s-master3 ~]# ssh-keygen
[root@k8s-master3 ~]# ssh-copy-id 10.45.25.100
[root@k8s-master3 ~]# ssh-copy-id 10.45.25.101
[root@k8s-master3 ~]# ssh-copy-id 10.45.25.102
3.5 启用ipvs内核模块
所有节点都要启用,kube-proxy默认使用的是iptables,但ipvs性能更好
# 加载模块
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
# 验证
lsmod | grep -e ip_vs -e nf_conntrack
# 配置开机自启脚本
$ chmod +x /etc/rc.local
$ vim /etc/rc.local
$ tail -5 /etc/rc.local
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
$ yum -y install ipvsadm
3.6 安装容器运行时
所有节点都安装
参考官网:CentOS | Docker Docs
前提
# 开启IPv4 数据包转发
$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
EOF
$ sysctl --system
使用yum(dnf)安装
#安装前移除docker
$ yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \