官方文档(中文)
节点名称
节点IP
配置
系统版本
VIP
192.168.50.220
虚拟IP
k8s-master-221
192.168.50.221
4核 2G
debian 11
k8s-master-222
192.168.50.222
4核 2G
debian 11
k8s-master-223
192.168.50.223
4核 2G
debian 11
k8s-node-224
192.168.50.224
4核 2G
debian 11
k8s-node-225
192.168.50.225
4核 2G
debian 11
主机配置 时间同步
配置 hostname 注意节名称不能重复
1 hostnamectl --static set-hostname k8s-master-221
配置防火墙 1 2 3 4 5 service iptables stop iptables -F systemctl stop firewalld && systemctl disable firewalld
如果需要打开防火墙,执行以下配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 ufw allow 6443/tcp ufw allow 2379/tcp ufw allow 2380/tcp ufw allow 10250/tcp ufw allow 10251/tcp ufw allow 10252/tcp ufw allow 10255/tcp ufw reload ufw allow 10250/tcp ufw allow 30000:32767/tcp ufw reload
关闭交换分区 1 2 swapoff -a set -ri 's/.*swap.*/#&/' /etc/fstab
若需允许交换分区参考官方文档 交换分区的配置
配置hosts 1 2 3 4 5 6 7 cat >> /etc/hosts << EOF 192.168.50.221 k8s-master-221 192.168.50.222 k8s-master-222 192.168.50.223 k8s-master-223 192.168.50.224 k8s-worker-224 192.168.50.225 k8s-worker-225 EOF
开启 bridge 网桥过滤功能 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 cat << EOF | sudo tee /etc/modules-load.d/k8s.conf overlay br_netfilter EOF sudo modprobe overlaysudo modprobe br_netfiltercat << 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 # 转发模式(默认开启) vm.panic_on_oom = 0 # 开启OOM(默认开启) vm.swappiness = 0 # 禁止使用swap空间 vm.overcommit_memory = 1 # 不检查物理内存是否够用 EOF sudo sysctl --system
配置 IPVS 1 2 3 4 5 6 7 8 9 10 11 modprobe br_netfilter cat > /etc/sysconfig/modules/ipvs.modules << EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv EOF
安装工具 安装 Containerd 1 2 3 4 5 6 7 apt update apt install -y containerd containerd config default | sudo tee /etc/containerd/config.toml >/dev/null 2>&1
设置cgroupdriver
为systemd
,编辑 /etc/containerd/config.toml
文件,找到 [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
部分,添加一行内容:SystemdCgroup = true
1 sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
重启containerd并设置开机启动
1 2 systemctl restart containerd systemctl enable containerd
安装 keadm,kubelete,kubectl 1 2 3 4 5 6 apt update apt install -y kubelet kubeadm kubectl apt-mark hold kubelet kubeadm kubectl
部署高可用(仅 master 节点) 安装 1 apt install keepalived haproxy
修改haproxy配置 /etc/haproxy/haproxy.cfg
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 global maxconn 2000 ulimit-n 16384 log 127.0.0.1 local0 err stats timeout 30s defaults log global mode http option httplog timeout connect 5000 timeout client 50000 timeout server 50000 timeout http-request 15s timeout http-keep-alive 15s frontend monitor-in bind *:33305 mode http option httplog monitor-uri /monitor frontend k8s-master bind 0.0.0.0:16443 bind 127.0.0.1:16443 mode tcp option tcplog tcp-request inspect-delay 5s default_backend k8s-master backend k8s-master mode tcp option tcplog option tcp-check balance roundrobin default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100 server k8s-master1 172.16.12.111:6443 check server k8s-master2 172.16.12.112:6443 check server k8s-master3 172.16.12.113:6443 check
配置 keepalived
interface # 网卡名称 mcast_src_ip # 节点ip virtual_ipaddress # vip地址
k8s-master-221配置文件/etc/keepalived/keepalived.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL script_user root enable_script_security } vrrp_script chk_apiserver { script "/etc/keepalived/check_apiserver.sh" #健康检查脚本 interval 5 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state MASTER #高可用主1 interface eth0 #网卡名称 mcast_src_ip 192.168.50.221 #该节点 IP virtual_router_id 51 priority 100 #设置最高级优先级 advert_int 2 authentication { auth_type PASS auth_pass K8SHA_KA_AUTH } virtual_ipaddress { 192.168.50.220 #vip地址 } track_script { chk_apiserver } }
k8s-master-222配置文件/etc/keepalived/keepalived.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL script_user root enable_script_security } vrrp_script chk_apiserver { script "/etc/keepalived/check_apiserver.sh" interval 5 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP #高可用 从1 interface ens33 #网卡名称 mcast_src_ip 192.168.50.222 #该节点 IP virtual_router_id 51 priority 50 #设置优先级 advert_int 2 authentication { auth_type PASS auth_pass K8SHA_KA_AUTH } virtual_ipaddress { 192.168.50.220 #vip地址 } track_script { chk_apiserver } }
k8s-master-222配置文件/etc/keepalived/keepalived.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ! Configuration File for keepalived global_defs { router_id LVS_DEVEL script_user root enable_script_security } vrrp_script chk_apiserver { script "/etc/keepalived/check_apiserver.sh" interval 5 weight -5 fall 2 rise 1 } vrrp_instance VI_1 { state BACKUP #高可用从2 interface ens33 #网卡名称 mcast_src_ip 192.168.50.223 #该节点 IP virtual_router_id 51 priority 49 #设置优先级 advert_int 2 authentication { auth_type PASS auth_pass K8SHA_KA_AUTH } virtual_ipaddress { 192.168.50.220 #vip地址 } track_script { chk_apiserver } }
健康检查脚本 /etc/keepalived/check_apiserver.sh
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #!/bin/bash err=0 for k in $(seq 1 3);do check_code=$(pgrep haproxy) if [[ $check_code == "" ]]; then err=$(expr $err + 1) sleep 1 continue else err=0 break fi done if [[ $err != "0" ]]; then echo "systemctl stop keepalived" /usr/bin/systemctl stop keepalived exit 1 else exit 0 fi
给监测脚本添加执行权限
1 chmod +x /etc/keepalived/check_apiserver.sh
启动keepalive和haproxy
1 2 3 4 5 6 systemctl daemon-reload systemctl start haproxy && systemctl enable haproxy systemctl start keepalived && systemctl enbale keepalived
测试vip漂移 1 2 3 4 5 hostname -I nc -v 192.168.50.220 16443
初始化集群 拉取镜像 1 2 3 4 5 kubeadm config images list kubeadm config images pull
master 节点初始化 1 2 3 4 5 kubeadm config print init-defaults > kubeadm-config.yaml kubeadm token create --print-join-command
master 节点加入集群 1 2 3 4 5 6 kubeadm init --control-plane-endpoint=192.168.50.220:16443 kubeadm join 192.168.50.220:16443 --token {token} \ --discovery-token-ca-cert-hash {} \ --control-plane --certificate-key {}
worker 节点加入集群 1 2 kubeadm join 192.168.50.220:16643 --token {token} \ --discovery-token-ca-cert-hash {}
从集群种移除节点
1 kubectl delete node {node-name}
配置环境变量,用于访问集群 1 2 3 4 5 cat << EOF >> ~/.bashrc export KUBECONFIG=/etc/kubernetes/admin/conf EOF source ~/.bashrc
查看集群节点状态
1 2 3 4 5 6 kubectl get nodes kubectl get all -n kube-system -o wide
安装网络组件(只在master-221节点操作) Calico Flannel
去除 master节点污点 如果你打算让Master节点也参与到平常的Pod调度(生产环境一般不会这样做,以保证master节点的稳定性),那么你需要使用以下命令将Master节点上的 taint(污点标记)解除
1 kubectl taint nodes --all node-role.kubernetes.io/master-
最后我们使用以下命令查看当前集群的状态,发现Scheduler和Controller Manager组件处理不健康状态:
解决上述问题需要将每个Master节点上的 /etc/kubernetes/manifests/kube-scheduler.yaml 和 /etc/kubernetes/manifests/kube-controller-manager.yaml 文件中的- –port=0注释掉,然后重启一下各Master节点上的kubelet即可.
测试集群 1 2 3 4 kubectl create deployment nginx --image nginx --replicas 2 kubectl expose deployment nginx --name nginx --type NodePort --port 80 --target-port 80 --node-port 8080 curl http://192.168.50.220:8080
参考如何用 Kubeadm 在 Debian 11 上安装 Kubernetes 集群 | Linux 中国 - 知乎 (zhihu.com) Kubernetes多主多从高可用集群部署 - 个人文章 - SegmentFault 思否 搭建多主节点k8s高可用集群(三主两从一VIP)_kubernetes部署多主多从集群-CSDN博客 github - 基于Ubuntu22.04部署KubeEdge-v1.18.0环境 - 云原生_KubeEdge - SegmentFault 思否