搭建k8s高可用集群
一、方案:debian11使用kubeadm搭建一个k8s集群,实现master高可用
说明:master主要组件,controller manager、scheduler、etcd、apiserver,master高可用必须确保这些组件实现高可用,至少需要3台机器,因为etcd组件,在其中一个实例宕机后,etcd集群需要自动选举去实现它的高可用
二、ip地址规划
master1:192.168.152.10
master2:192.168.152.20
master3:192.168.152.30
node1:192.168.152.40
haproxy:192.168.152.50
三、部署
1、搭建haproxy服务,转发master各节点的apiserver端口6443
下载安装haproxy
curl https://haproxy.debian.net/bernat.debian.org.gpg | gpg --dearmor > /usr/share/keyrings/haproxy.debian.net.gpg
echo deb "[signed-by=/usr/share/keyrings/haproxy.debian.net.gpg]" http://haproxy.debian.net bullseye-backports-2.6 main > /etc/apt/sources.list.d/haproxy.list
apt-get update
apt-get install haproxy=2.6.\*
修改haproxy配置文件/etc/haproxy/haproxy.cfg,添加以下内容
frontend apiserver bind *:6443 mode tcp option tcplog default_backend apiserver backend apiserver option httpchk GET /healthz http-check expect status 200 mode tcp option ssl-hello-chk balance roundrobin server master1 192.168.152.10:6443 check server master2 192.168.152.20:6443 check
server master2 192.168.152.30:6443 check
重启服务并设置开机启动
systemctl restart haproxy
systemctl enable haproxy
2、master、node各节点初始化操作
修改/etc/hosts
192.168.152.10 master1 192.168.152.20 master2 192.168.152.30 master3 192.168.152.40 node1
修改hostname,根据各节点名称做相应修改
cat << EOF > /etc/hostname
master1
EOF
hostname master1
关闭swap
swapoff -a sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
内核调整,将桥接的IPv4流量传递到iptables的链
cat << EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system
安装docker,配置cgroup驱动,如果部署的k8s版本超过1.24以上就必须安装一个额外的服务 cri-dockerd,这里部署的是1.23版本就不需要了
curl -sSL https://get.daocloud.io/docker | sh
touch /etc/docker/daemon.json
cat << EOF > /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"]
}
EOF
systemctl start docker
systemctl enable docker
安装kubeadm、kubelet、kubectl
**更新 apt
包索引并安装使用 Kubernetes apt
仓库所需要的包
sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl
**下载 Google Cloud 公开签名秘钥
sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
**添加 Kubernetes apt
仓库
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
**更新 apt
包索引,安装 kubelet、kubeadm 和 kubectl
sudo apt-get update sudo apt-get install -y kubelet-1.23.0 kubeadm-1.23.0 kubectl-1.23.0
systemctl enable kubelet
3、master、node各节点init、join操作
先在master1节点操作init
说明:control-plane-endpoint:指定负载均衡的地址和端口,pod-network-cidr:pod的网段,upload-certs:集群自动上传证书
sudo kubeadm init --control-plane-endpoint 192.168.152.50:6443 --pod-network-cidr 10.244.0.0/16 --upload-certs
master1 init成功后,会出现加入master节点的join命令和加入node节点的join命令
配置当前用户使用kubectl连接apiserver
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
在master2、master3节点上执行master的kubeadm join命令加入集群
在node1节点上执行node的kubeadm join命令加入集群
4、安装flannel网络插件
说明:如果kube-flannel.yml中pod网段不是10.240.0.0/16,需要先改成该网段后执行。
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml kubectl apply -f kube-flannel.yml
至此k8s master高可用集群就搭建完成,这个集群允许三台master的其中任意一台master无法提供服务,如果在云上环境,建议haproxy实现的master负载均衡器可以使用云上的公网或私网的slb替代,control-plane-endpoint地址可以改成外网或内网域名,方便后期调整。