环境介绍
本次搭建的集群使用window11专业版自带的hyper-v管理工具构建6台虚拟机,容器运行时采用containerd,采用1台lb,3台master节点,2台worker节点,其他软件环境信息如下:
k8s: 1.28.3
containerd :1.6
虚拟机:centos 7.9 mini
整体架构与 IP 规划:
| 主机名 | 角色 | IP 地址 | 需要装的软件 | 说明 |
|---|---|---|---|---|
| k8s-master01 | master | 192.168.1.101 | kubeadm、kubelet、kubectl、containerd | 控制平面 + etcd |
| k8s-master02 | master | 192.168.1.102 | kubeadm、kubelet、kubectl、containerd | 控制平面 + etcd |
| k8s-master03 | master | 192.168.1.103 | kubeadm、kubelet、kubectl、containerd | 控制平面 + etcd |
| k8s-worker01 | worker | 192.168.1.104 | kubeadm、kubelet、containerd | 工作节点 |
| k8s-worker02 | worker | 192.168.1.105 | kubeadm、kubelet、containerd | 工作节点 |
| k8s-lb | load balancer | 192.168.1.100 | keepalived + haproxy | api入口 |
准备工作
设置静态ip(所有机器)
CentOS 7 使用 /etc/sysconfig/network-scripts/ifcfg-<网卡名> 文件配置网络
# 编辑配置文件(假设网卡是 eth0)
vi /etc/sysconfig/network-scripts/ifcfg-eth0
将内容修改为如下
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static # ← 改为 static(原来是 dhcp)
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0 # ← 网卡名
UUID=... # ← 保留原有 UUID(不要改)
DEVICE=eth0 # ← 网卡名
ONBOOT=yes # ← 开机自动启用
# === 静态 IP 配置(按你的网络改)===
IPADDR=192.168.1.101 # ← 本机 IP(master01 示例)
NETMASK=255.255.255.0 # 或写 PREFIX=24
GATEWAY=192.168.1.1 # ← 你的网关(Hyper-V 虚拟交换机的网关)
DNS1=8.8.8.8 # ← DNS(可选)
DNS2=114.114.114.114
重启网卡
systemctl enable network
systemctl restart network
yum包管理器配置(所有节点)
备份原有 repo 文件
mkdir -p /etc/yum.repos.d/bak
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/ 2>/dev/null
使用阿里云 CentOS 7 官方源
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
(可选)启用 EPEL 源
# 先安装 epel-release 包(使用阿里云镜像)
yum install -y https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
# 然后替换为阿里云 EPEL 源
sed -i 's|^#baseurl=|baseurl=|g' /etc/yum.repos.d/epel*.repo
sed -i 's|^metalink|#metalink|g' /etc/yum.repos.d/epel*.repo
sed -i 's|//download\.fedoraproject\.org|//mirrors.aliyun.com|g' /etc/yum.repos.d/epel*.repo
配置 Kubernetes 官方源(使用阿里云镜像
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
设置主机名(分别在每台机器上执行)
# master01
hostnamectl set-hostname k8s-master01
# master02
hostnamectl set-hostname k8s-master02
# master03
hostnamectl set-hostname k8s-master03
# worker01
hostnamectl set-hostname k8s-worker01
# worker02
hostnamectl set-hostname k8s-worker02
# lb
hostnamectl set-hostname k8s-lb
配置 hosts(所有节点)
cat >> /etc/hosts <<EOF
192.168.1.101 k8s-master01
192.168.1.102 k8s-master02
192.168.1.103 k8s-master03
192.168.1.104 k8s-worker01
192.168.1.105 k8s-worker02
192.168.1.100 k8s-lb
EOF
关闭防火墙 & SELinux(所有节点执行)
systemctl stop firewalld && systemctl disable firewalld
setenforce 0
sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
关闭 swap & 加载内核模块 & 调优
#关闭交换分区
swapoff -a
sed -i '/swap/s/^/#/' /etc/fstab
#内核模块
cat > /etc/modules-load.d/k8s.conf <<EOF
br_netfilter
EOF
modprobe br_netfilter
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
搭建集群
安装容器运行时 containerd (所有master和worker节点)
安装 containerd
# 1. 安装 containerd,指定版本
# 查看可用版本(CentOS)
yum list containerd.io --showduplicates | grep -E '1\.6|1\.7|1\.8'
yum install -y containerd.io-1.6.5
#yum install -y containerd.io
# 2. 生成默认配置
containerd config default > /etc/containerd/config.toml
# 3. 启用 systemd cgroup 驱动(必须与 kubelet 一致!)
sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 4. 启动
systemctl enable --now containerd
# 5. 安装 crictl(CRI 调试工具)
VERSION="v1.28.0"
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/$VERSION/crictl-$VERSION-linux-amd64.tar.gz
tar zxvf crictl-$VERSION-linux-amd64.tar.gz -C /usr/local/bin
rm -f crictl-$VERSION-linux-amd64.tar.gz
编辑容器运行时的配置文件,配置镜像加速器(国外镜像无法访问)
#编辑/etc/containerd/config.toml 添加docker和k8s镜像加速
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
endpoint = ["https://docker.1ms.run", "https://hub.rat.dev", "https://dockerproxy.net"]
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."registry.k8s.io"]
endpoint = ["https://k8s.m.daocloud.io"]
#修改指定pause版本,k8s 1.28需要pause:3.9
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "registry.k8s.io/pause:3.9"
重启containerd
systemctl restart containerd
安装k8s工具(所有master和worker节点)
#worker节点只需装kubelet kubeadm
yum install -y kubelet-1.28.3 kubeadm-1.28.3 kubectl-1.28.3
systemctl enable --now kubelet
安装 load balancer 机器(lb节点)
# 安装 EPEL 源
yum install -y epel-release
# 安装 keepalived 和 haproxy
yum install -y keepalived haproxy
# 允许绑定非本地 IP(必须!)
echo 'net.ipv4.ip_nonlocal_bind = 1' >> /etc/sysctl.conf
sysctl -p
配置负载均衡,即HAProxy(如果lb考虑集群,多台机器配置相同)
cat > /etc/haproxy/haproxy.cfg <<EOF
global
log 127.0.0.1 local2
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 4000
user haproxy
group haproxy
daemon
stats socket /var/lib/haproxy/stats
defaults
mode tcp
log global
option tcplog
option dontlognull
timeout connect 10s
timeout client 300s
timeout server 300s
timeout check 5s
maxconn 3000
# Kubernetes API Server 前端
frontend k8s-api-frontend
bind *:6443
mode tcp
option tcplog
default_backend k8s-api-backend
# 后端 Kubernetes Master 节点
backend k8s-api-backend
mode tcp
balance roundrobin
server master1 192.168.1.101:6443 check
server master2 192.168.1.102:6443 check
server master3 192.168.1.103:6443 check
# 可选:HAProxy 监控页面(HTTP)
listen stats
bind *:8888
mode http
stats enable
stats uri /stats
stats auth admin:123456 # 用户名:密码
stats refresh 5s
EOF
配置虚拟ip,即Keepalived(如果lb考虑集群,主备配置不同)
cat > /etc/keepalived/keepalived.conf <<EOF
global_defs {
router_id LVS_DEVEL
}
vrrp_script chk_haproxy {
script "killall -0 haproxy" # 检查 haproxy 是否运行
interval 2
weight -5
fall 2
rise 1
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # ← 替换为你的网卡名(如 ens33)
virtual_router_id 51
priority 100 # 主节点优先级更高
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
192.168.1.100/24 # ← 这是你的 VIP
}
track_script {
chk_haproxy
}
}
EOF
配置完启动
systemctl enable --now haproxy
初始化集群
任意master节点执行
kubeadm init --control-plane-endpoint "192.168.1.100:6443" --upload-certs --pod-network-cidr=10.244.0.0/16 --kubernetes-version=v1.28.2 --v=5
等待一段时间,初始化完毕后面会有提示,提示安装 CNI 网络插件,以及其他master节点加入集群的join命令,和worker节点加入集群的join命令
# 安装 Flannel 网络插件(只需要在主节点,后续加入的节点自动部署 CNI 所需的组件)
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
其他master节点加入集群
kubeadm join 192.168.1.100:6443 --token q9b0qo.ygjjzx5jutamvq61 \
--discovery-token-ca-cert-hash sha256:863747ea6190254f09715103d25bcce5da3161e022fa6d033f9185a3be0b079b \
--control-plane --certificate-key 63f890b556d78a9d31f11bf662d5f2f50e2f9e6a5920c344f0bac575dabc7e1c
其他worker节点加入集群
kubeadm join 192.168.1.100:6443 --token q9b0qo.ygjjzx5jutamvq61 \
--discovery-token-ca-cert-hash sha256:863747ea6190254f09715103d25bcce5da3161e022fa6d033f9185a3be0b079b
验证
kubectl get nodes
所有节点状态为ready表示安装完毕!