分享知识,分享快乐

0%

k8s高可用集群搭建-详细版

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
2
3
4
5
6
7
8
9
10
11
12
kubeadm join cluster-endpoint:6443 --token c1pg2r.bt0a83bv4c3io8o4 \
--discovery-token-ca-cert-hash sha256:7a3586d7cdf45e5d7c681e22ebb7004f2a3a20c9dee31622ca2e887c56f25900 \
--control-plane \
--certificate-key 93a07f3e181677a5a18485f1eef5d374c7c874a80402f292a9440446bcc8d42c
--v=5

# 证如果过期了,可以使用下面命令生成新证书上传,这里会打印出certificate key(在master节点执行)
kubeadm init phase upload-certs --upload-certs
# 你还可以在 【init】期间指定自定义的 --certificate-key,以后可以由 join 使用。 要生成这样的密钥,可以使用以下命令
# kubeadm certs certificate-key
# --control-plane 标志通知 kubeadm join 创建一个新的控制平面,加入master必须加这个标记
# --certificate-key ... 将导致从集群中的 kubeadm-certs Secret 下载控制平面证书并使用给定的密钥进行解密

组网成功后修改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)已经搭建完成