k8s高可用集群搭建-详细版
环境
系统: CenterOS 7.9
docker: 20.10.24
k8s: 1.23.17
目标
3个master节点、LoadBalancer、一个work节点
172.23.80.241 master1
172.23.80.242 master2
172.23.80.243 master3
172.23.80.244 worker1
三个阶段
1、搭建k8s master集群
每个k8s master节点都可以对外提供服务(apiserver),但是集群本身不提供负载和故障转移的功能,这些高可用功能由Load Balancer提供,woker节点或client均通过Load Balancer加入或访问k8s master。k8s master 集群至少需要三个节点,因为k8s集群在组网时,etcd组件构成集群时至少需要三个节点,etcd为高可用存储数据库。
每个k8s master节点之所以都可以独立对外提供服务,是因为k8s master唯一对外提高服务的组件apiserver是无状态实例,apiserver之所以无状态,是因为apiserver的数据都被存储到etcd数据库中,从而使得apiserver从有状态服务变成了一个无状态服务,所以Load Balancer 负载对象也就是apiserver(端口6443)。
对于controller-manager、scheduler这两个组件来说,高可用的逻辑也是启用多个实例来实现的,不同与apiserver,这两个组件由于工作逻辑的独特性,一个k8s集群中有且只有一个controller-manager和scheduler在工作,所以启动多个实例它们必须工作在主备模式,即一个active,多个backup的模式;它们通过分布式锁的方式实现内部选举,决定谁来工作,最终抢到分布式锁(k8s集群endpoint)的controller-manager、scheduler成为active状态代表集群controller-manager、scheduler组件工作,抢到锁的controller-manager和scheduler会周期性的向apiserver通告自己的心跳信息,以维护自己active状态,避免其他controller-manager、scheduler进行抢占;其他controller-manager、scheduler收到活动的controller-manager、scheduler的心跳信息后自动切换为backup状态;一旦在规定时间备用controller-manager、scheduler没有收到活动的controller-manager、scheduler的心跳,此时就会触发选举,重复上述过程;
2、搭建Load Balancer(提供负载和故障转移功能)
3、work节点(kubelet)通过Load Balancer join到k8s集群
前期准备(所有节点)
1、修改主机名和配置 hosts
hostnamectl set-hostname k8s-master-80-241
hostnamectl set-hostname k8s-master-80-242
hostnamectl set-hostname k8s-master-80-243
hostnamectl set-hostname k8s-worker-80-244
master节点hosts配置
cat >> /etc/hosts<<EOF
172.23.80.241 k8s-master-80-241 cluster-endpoint
172.23.80.242 k8s-master-80-242
172.23.80.243 k8s-master-80-243
EOF
woker节点hosts配置
cat >> /etc/hosts<<EOF
172.23.80.244 k8s-worker-80-244
${LoadBalancerVIP} cluster-endpoint
EOF
其中:
cluster-endpoint 是映射到该 IP 的自定义 DNS 名称,这里配置hosts映射:192.168.0.113 cluster-endpoint。 这将允许你将 --control-plane-endpoint=cluster-endpoint 传递给 kubeadm init,并将相同的 DNS 名称传递给 kubeadm join。 之后你可以修改 cluster-endpoint 以指向高可用性方案中的负载均衡器的地址。
${LoadBalancerVIP} 值为根据LoadBalancer设置的VIP地址。
2、时间同步
yum install chrony -y
systemctl start chronyd
systemctl enable chronyd
chronyc sources
3、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
4、关闭swap
# 临时关闭;关闭swap主要是为了性能考虑
swapoff -a
# 可以通过这个命令查看swap是否关闭了
free
# 永久关闭
sed -ri ‘s/.swap./#&/’ /etc/fstab
5、禁用SELinux
# 临时关闭
setenforce 0
# 永久禁用
sed -i ‘s/^SELINUX=enforcing$/SELINUX=disabled/’ /etc/selinux/config
6、允许 iptables 检查桥接流量(可选)
sudo modprobe br_netfilter
lsmod | grep br_netfilter
# 设置所需的 sysctl 参数,参数在重新启动后保持不变
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# 应用 sysctl 参数而不重新启动
sudo sysctl --system
第一阶段
安装Docker(所有)
参考: k8s-1.23.17离线安装
安装master1
参考: k8s-1.23.17离线安装
#安装kubelet、kubeadm、kubectl
#设置为开机自启并现在立即启动
systemctl enable --now kubelet
#初始化 高可用k8s集群 核心在于master 初始化参数–control-plane-endpoint --v=5
kubeadm init \
–image-repository=registry.cn-hangzhou.aliyuncs.com/google_containers \
–kubernetes-version=v1.23.17 \
–control-plane-endpoint=cluster-endpoint \
–service-cidr=10.1.0.0/16 \
–pod-network-cidr=10.244.0.0/16 \
–upload-certs \
–v=5
其中
–control-plane-endpoint 这里的值是配置的DNS名称,因为LoadBalancer是在k8s master集群安装好之后。如果值要配置IP地址,其值必须配成LoadBalancer的负载地址,所以需要先安装好LoadBalancer。端口是LoadBalancer的负载端口可以不配置,默认6443。
–upload-certs
#安装网络插件
安装master2、master3,加入master1集群,构建高可用集群
参考: k8s-1.23.17离线安装
#安装kubelet、kubeadm、kubectl
#设置为开机自启并现在立即启动
systemctl enable --now kubelet
#加入集群并初始化
1 | kubeadm join cluster-endpoint:6443 --token c1pg2r.bt0a83bv4c3io8o4 \ |
组网成功后修改hosts配置
master2
172.23.80.241 k8s-master-80-241
172.23.80.242 k8s-master-80-242 cluster-endpoint
172.23.80.243 k8s-master-80-243
master3
172.23.80.241 k8s-master-80-241
172.23.80.242 k8s-master-80-242
172.23.80.243 k8s-master-80-243 cluster-endpoint
安装Dashboard
参考k8s-1.23.17离线安装
至此k8s master高可用集群(三个master)已经搭建完成