kubernetes-1.32高可用集群部署(kubeadm)

一、主机规划

角色 IP地址 OS 配置
k8s-master01 172.173.10.111/24 Rocky 9.5 4C+8G+40GB
k8s-master02 172.173.10.112/24 Rocky 9.5 4C+8G+40GB
k8s-master03 172.173.10.113/24 Rocky 9.5 4C+8G+40GB
k8s-node01 172.173.10.114/24 Rocky 9.5 4C+8G+40GB
k8s-node02 172.173.10.115/24 Rocky 9.5 4C+8G+40GB
LB 172.173.10.110/24 Rocky 9.5

二、环境初始化

2.1生成新唯一标识(非克隆跳过)

2.1.1克隆的时候重新生成mac地址

2.1.2 生成新machine-id

# 注意!
# 若虚拟机是进行克隆的那么网卡的UUID和MachineID会重复
# 需要重新生成新的UUIDUUID和MachineID
# UUID和MachineID重复无法DHCP获取到IPV6地址
ssh root@172.173.10.111 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
ssh root@172.173.10.112 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
ssh root@172.173.10.113 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
ssh root@172.173.10.114 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"
ssh root@172.173.10.115 "rm -rf /etc/machine-id; systemd-machine-id-setup;reboot"

2.2 配置IP地址

#生成新网卡UUID
sed -i "s/^uuid=.*/uuid=$(uuidgen)/" /etc/NetworkManager/system-connections/ens32.nmconnection
sed -i "s/^uuid=.*/uuid=$(uuidgen)/" /etc/NetworkManager/system-connections/ens32.nmconnection
sed -i "s/^uuid=.*/uuid=$(uuidgen)/" /etc/NetworkManager/system-connections/ens32.nmconnection
sed -i "s/^uuid=.*/uuid=$(uuidgen)/" /etc/NetworkManager/system-connections/ens32.nmconnection
sed -i "s/^uuid=.*/uuid=$(uuidgen)/" /etc/NetworkManager/system-connections/ens32.nmconnection

#配置网卡静态IP
nmcli con mod ens32 ipv4.addresses 172.173.10.111/24; nmcli con mod ens32 ipv4.gateway 172.173.10.254; nmcli con mod ens32 ipv4.method manual; nmcli con mod ens32 ipv4.dns 223.5.5.5; nmcli con up ens32

nmcli con mod ens32 ipv4.addresses 172.173.10.112/24; nmcli con mod ens32 ipv4.gateway 172.173.10.254; nmcli con mod ens32 ipv4.method manual; nmcli con mod ens32 ipv4.dns 223.5.5.5; nmcli con up ens32

nmcli con mod ens32 ipv4.addresses 172.173.10.113/24; nmcli con mod ens32 ipv4.gateway 172.173.10.254; nmcli con mod ens32 ipv4.method manual; nmcli con mod ens32 ipv4.dns 223.5.5.5; nmcli con up ens32

nmcli con mod ens32 ipv4.addresses 172.173.10.114/24; nmcli con mod ens32 ipv4.gateway 172.173.10.254; nmcli con mod ens32 ipv4.method manual; nmcli con mod ens32 ipv4.dns 223.5.5.5; nmcli con up ens32

nmcli con mod ens32 ipv4.addresses 172.173.10.115/24; nmcli con mod ens32 ipv4.gateway 172.173.10.254; nmcli con mod ens32 ipv4.method manual; nmcli con mod ens32 ipv4.dns 223.5.5.5; nmcli con up ens32

2.3 设置主机名

hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-master02
hostnamectl set-hostname k8s-master03
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

2.4 配置终端提示符(可选)

cat > ~/.bashrc << 'EOF'
PS1='[\[\e[31m\]\u\[\e[33m\]@\[\e[36m\]\h \[\e[32m\]\w\[\e[37m\]]\$ \[\e[m\]'
EOF
source ~/.bashrc

2.5 配置国内软件仓库

sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-*.repo

dnf makecache

2.6 关闭swap

swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

2.7 关闭防火墙和selinux

# 关闭防火墙和selinux
systemctl disable firewalld --now && setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
grubby --update-kernel ALL --args selinux=0


#把防火墙改为iptables
yum -y install iptables-services
systemctl enable iptables --now
iptables -F
service iptables save
systemctl restart iptables
iptables -nL

2.8 配置主机名解析和免密

cat <<EOF>> /etc/hosts
172.173.10.111	k8s-master01 m1
172.173.10.112	k8s-master02 m2
172.173.10.113	k8s-master03 m3
172.173.10.114  k8s-node01 n1
172.173.10.115  k8s-node02 n2
172.173.10.110  lb-vip
EOF
yum install -y sshpass
ssh-keygen -f /root/.ssh/id_rsa -P ''
export IP="m1 m2 m3 n1 n2"
export SSHPASS=123123 #换成自己的root登录密码
for HOST in $IP;do
     sshpass -e ssh-copy-id -o StrictHostKeyChecking=no $HOST
done

2.9 配置时钟同步

配置k8s-master01作为chronyd服务端:

[root@k8s-master01 ~]# grep -Ev '^#|^$' /etc/chrony.conf
server ntp.aliyun.com iburst        #修改原来的,向阿里云时钟服务器同步时间
sourcedir /run/chrony-dhcp
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 172.173.10.0/24               #允许过来请求同步的网段
local stratum 10                    #取消注释,启用后,即使没有公网NTP,chronyd仍可作为时间服务器给客户端同步。
keyfile /etc/chrony.keys
ntsdumpdir /var/lib/chrony
leapsectz right/UTC
logdir /var/log/chrony

其它节点向它同步时间:

# grep -Ev '^#|^$' /etc/chrony.conf
server k8s-master01 iburst          #向k8s-master01节点同步
sourcedir /run/chrony-dhcp
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
ntsdumpdir /var/lib/chrony
leapsectz right/UTC
logdir /var/log/chrony

重启并查看:

systemctl restart chronyd
chronyc sources

2.10 启用 IPv4 数据包转发

cat <<EOF> /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1        # 启用 IPv6 桥接流量进入 ip6tables(可选,若使用 IPv6 网络插件则必须)
net.bridge.bridge-nf-call-iptables = 1         # 启用 IPv4 桥接流量进入 iptables(必须,Kubernetes 网络插件依赖)
net.ipv4.ip_forward = 1                        # 启用 IPv4 转发(必须,Pod 网络通信依赖)
vm.swappiness = 0                              # 禁用 swap 的内核倾向(必须,Kubelet 要求 swap 被关闭)
EOF
sysctl --system
sysctl net.ipv4.ip_forward

2.11 加载br_betfilter模块

modprobe br_netfilter
cat <<EOF> /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

2.12 加载 ipvs 网络转发模块

#安装软件
yum -y install ipset ipvsadm

#加载转发模块
modprobe ip_vs
modprobe ip_vs_rr
modprobe ip_vs_wrr
modprobe ip_vs_sh
modprobe nf_conntrack

#开机自动加载转发模块
cat <<EOF > /etc/modules-load.d/ipvs.conf
ip_vs                 # 核心 IPVS 模块,启用虚拟服务调度功能
ip_vs_rr              # IPVS 轮询调度算法(Round Robin)
ip_vs_wrr             # IPVS 加权轮询调度算法(Weighted Round Robin)
ip_vs_sh              # IPVS 源地址哈希调度算法(Source Hash)
nf_conntrack          # IPv4 连接跟踪模块(用于 NAT、防火墙等连接状态管理)
EOF

#检查加载情况
lsmod | grep -E 'ip_vs|nf_conntrack'

三、安装docker-ce作为容器运行时

3.1 安装docker

# 添加仓库
yum install -y yum-utils
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 查看软件支持版本
yum list docker-ce --showduplicates | sort -r
# 安装docker-ce
yum -y install docker-ce-27.4.0 docker-ce-cli-27.4.0


# 配置 daemon.
cat > /etc/docker/daemon.json <<EOF
{
  "data-root": "/data/docker",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "100m",
    "max-file": "100"
  },
  "insecure-registries": ["harbor.xinxainghf.com"],
  "registry-mirrors": ["https://kfp63jaj.mirror.aliyuncs.com"]
}
EOF
mkdir -p /etc/systemd/system/docker.service.d


# 重启docker服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker

设置 Docker 使用 systemd 作为 cgroup 驱动,确保与 Kubernetes 的资源管理一致
"exec-opts": ["native.cgroupdriver=systemd"]

检查:

docker info | grep 'Cgroup Driver'

3.2 安装cri-docker

k8s调度docker的过程如下,需要依赖cri-docker:

Kubelet
   │
   │-- CRI socket: unix:///run/cri-dockerd.sock
   ↓
cri-dockerd
   │
   │-- Docker socket: unix:///run/docker.sock
   ↓
Docker Engine
# 下载
curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.16/cri-dockerd-0.3.16.amd64.tgz
#解压
tar xvf cri-dockerd-*.amd64.tgz 
#拷贝
cp cri-dockerd/cri-dockerd /usr/bin/
#给执行权限
chmod +x /usr/bin/cri-dockerd
#删除
rm -rf cri-dockerd*

#查看软件启动帮助
cri-dockerd --help

  • --container-runtime-endpoint :后端运行时服务的端点。目前在 Linux 上支持 Unix 套接字和 TCP 端点,在 Windows 上支持命名管道(npipe)和 TCP 端点。
  • --pod-infra-container-image :沙箱容器(pause 容器)使用的镜像,在 Kubernetes 中扮演的是 Pod 的基础容器,每隔pod里面都会有这个容器,用于管理 Pod 的生命周期,网络等等。从默认仓库拉取比较困难,下面是配置了从国内阿里云拉取

3.2.1 写入启动cri-docker配置文件

cat <<"EOF" > /usr/lib/systemd/system/cri-docker.service
[Unit]
Description=CRI Interface for Docker Application Container Engine
Documentation=https://docs.mirantis.com
After=network-online.target firewalld.service docker.service
Wants=network-online.target
Requires=cri-docker.socket
[Service]
Type=notify
ExecStart=/usr/bin/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
StartLimitBurst=3
StartLimitInterval=60s
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes
KillMode=process
[Install]
WantedBy=multi-user.target
EOF

3.2.2 写入cri-docker的socket配置文件

cat <<"EOF" > /usr/lib/systemd/system/cri-docker.socket
[Unit]
Description=CRI Docker Socket for the API
PartOf=cri-docker.service
[Socket]
ListenStream=%t/cri-dockerd.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker
[Install]
WantedBy=sockets.target
EOF

启动cri-docker

systemctl daemon-reload
systemctl enable cri-docker
systemctl start cri-docker
systemctl is-active cri-docker

测试是否接管成功:

#下载crictl工具
curl -LO https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.27.0/crictl-v1.27.0-linux-amd64.tar.gz

#解压
tar xf crictl-v1.27.0-linux-amd64.tar.gz -C /usr/local/bin/

#配置crictl工具
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///var/run/cri-dockerd.sock
image-endpoint: unix:///var/run/cri-dockerd.sock
timeout: 10
debug: false
EOF

#测试
crictl image ls

#测试cri-dockerd是否接管成功
crictl --runtime-endpoint unix:///var/run/cri-dockerd.sock info

四、keepalived和haproxy 高可用方案

所有master节点安装:

yum -y install keepalived haproxy

4.1 haproxy配置

修改最后后面的三个master节点的检查IP端口,检查的是api-server的端口,所有master节点配置一致:

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak
cat >/etc/haproxy/haproxy.cfg<<"EOF"
# =========================
# HAProxy 高可用配置文件
# 用于三主节点 Kubernetes API 负载均衡
# =========================

global
    maxconn 2000                          # 最大并发连接数,防止连接过载
    ulimit-n 16384                        # 设置文件描述符上限,适配高并发场景
    log 127.0.0.1 local0 err              # 日志输出到本地 syslog,级别为 err(建议改为 info)
    stats timeout 30s                     # 状态页面连接超时时间

defaults
    log global                            # 使用 global 段定义的日志配置
    mode http                             # 默认使用 HTTP 模式(适用于 monitor)
    option httplog                        # 使用 HTTP 格式日志
    timeout connect 5000                  # 连接超时:5 秒
    timeout client 50000                  # 客户端超时:50 秒
    timeout server 50000                  # 后端服务器响应超时:50 秒
    timeout http-request 15s              # HTTP 请求超时:15 秒
    timeout http-keep-alive 15s           # HTTP keep-alive 超时:15 秒

# =========================
# 健康检查入口(供 Keepalived 使用)
# =========================
frontend monitor-in
    bind *:33305                          # 监听所有 IP 的 33305 端口,用于健康检查
    mode http                             # 使用 HTTP 模式
    option httplog                        # 启用 HTTP 日志
    monitor-uri /monitor                 # 访问 /monitor 返回 200,用于 Keepalived 检查

# =========================
# Kubernetes API Server 接入入口
# =========================
frontend k8s-master
    bind 0.0.0.0:9443                     # 所有外部 IP 可访问的 9443 端口
    bind 127.0.0.1:9443                   # 本地回环地址也监听 9443(便于本机访问)
    mode tcp                              # 使用 TCP 模式,适用于 Kubernetes API Server
    option tcplog                         # 启用 TCP 层日志
    tcp-request inspect-delay 5s          # 延迟 TCP 请求检查 5 秒(用于连接检测)
    default_backend k8s-master            # 默认转发到 backend k8s-master

# =========================
# 后端 Kubernetes API Server 集群
# =========================
backend k8s-master
    mode tcp                              # 使用 TCP 模式
    option tcp-check                      # 启用 TCP 健康检查
    balance roundrobin                    # 使用轮询方式分发请求
    default-server inter 10s downinter 5s rise 2 fall 2 slowstart 60s maxconn 250 maxqueue 256 weight 100
                                          # 健康检查与连接控制参数:
                                          # inter:正常检查间隔 10 秒
                                          # downinter:异常检查间隔 5 秒
                                          # rise:连续 2 次成功认为恢复
                                          # fall:连续 2 次失败认为故障
                                          # slowstart:恢复后 60 秒内缓慢接入
                                          # maxconn:最大连接数 250
                                          # maxqueue:最大排队数 256
                                          # weight:权重 100

    server k8s-master01 172.173.10.111:6443 check  # 第一个 master 节点
    server k8s-master02 172.173.10.112:6443 check  # 第二个 master 节点
    server k8s-master03 172.173.10.113:6443 check  # 第三个 master 节点
EOF

配置文件检查,确认有效:

haproxy -c -f /etc/haproxy/haproxy.cfg

4.2 keepalived配置

注意检查注释部分。

4.2.1 配置k8s-master01为MASTER:

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"        #检查脚本,检查失败将漂移VIP地址
    interval 5 
    weight -5
    fall 2
    rise 1

}
vrrp_instance VI_1 {
    state MASTER                                       #配置为BACKUP角色
    interface ens32                                    #网卡名称,vip地址漂移使用的网卡
    mcast_src_ip 172.173.10.111                        #本机IP,用于发送 VRRP 多播包
    virtual_router_id 51                               #虚拟路由器 ID,必须在所有节点保持一致
    priority 100                                       #当前节点优先级,数值越大越优先成为 MASTER
    nopreempt
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        172.173.10.110                                 #虚拟 IP(VIP),供外部访问 Kubernetes API Server
    }
    track_script {
      chk_apiserver 
} }

EOF

4.2.2 配置k8s-master02为BACKUP:

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"        #检查脚本,检查失败将漂移VIP地址
    interval 5 
    weight -5
    fall 2
    rise 1

}
vrrp_instance VI_1 {
    state BACKUP                                       #配置为BACKUP角色
    interface ens32                                    #网卡名称,vip地址漂移使用的网卡
    mcast_src_ip 172.173.10.112                        #本机IP,用于发送 VRRP 多播包
    virtual_router_id 51                               #虚拟路由器 ID,必须在所有节点保持一致
    priority 80                                        #当前节点优先级,数值越大越优先成为 MASTER
    nopreempt
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        172.173.10.110                                 #虚拟 IP(VIP),供外部访问 Kubernetes API Server
    }
    track_script {
      chk_apiserver 
} }

EOF

4.2.3 配置k8s-master03为BACKUP:

cp /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
cat > /etc/keepalived/keepalived.conf << EOF
! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}
vrrp_script chk_apiserver {
    script "/etc/keepalived/check_apiserver.sh"         #检查脚本,检查失败将漂移VIP地址
    interval 5 
    weight -5
    fall 2
    rise 1

}
vrrp_instance VI_1 {
    state BACKUP                                        #配置为BACKUP角色
    interface ens32                                     #网卡名称,vip地址漂移使用的网卡
    mcast_src_ip 172.173.10.113                         #本机IP,用于发送 VRRP 多播包
    virtual_router_id 51                                #虚拟路由器 ID,必须在所有节点保持一致
    priority 50                                         #当前节点优先级,数值越大越优先成为 MASTER
    nopreempt
    advert_int 2
    authentication {
        auth_type PASS
        auth_pass K8SHA_KA_AUTH
    }
    virtual_ipaddress {
        172.173.10.110                                  #虚拟 IP(VIP),供外部访问 Kubernetes API Server
    }
    track_script {
      chk_apiserver 
} }

EOF

4.3 准备健康检查脚本

所有master节点配置一致。

cat >  /etc/keepalived/check_apiserver.sh << EOF
#!/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
EOF

# 给脚本授权
chmod +x /etc/keepalived/check_apiserver.sh

每 5 秒执行一次(由 Keepalived 配置控制)。

连续 3 次未检测到 haproxy 进程,则认为当前节点不健康。

自动停止 keepalived 服务,释放 VIP 给其他节点。

如果 haproxy 正常运行,则返回 0,维持 VIP。

4.4 启动服务

systemctl daemon-reload
# 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
systemctl enable --now haproxy.service
# 启用并立即启动haproxy.service单元。haproxy.service是haproxy守护进程的systemd服务单元。
systemctl enable --now keepalived.service
# 启用并立即启动keepalived.service单元。keepalived.service是keepalived守护进程的systemd服务单元。
systemctl status haproxy.service
# haproxy.service单元的当前状态,包括运行状态、是否启用等信息。
systemctl status keepalived.service

4.5 验证高可用

查看网卡的ip地址,发现目前VIP地址停留在k8s-master01节点上:

ip address show ens32

我们把k8s-master01节点关闭测试VIP是否回漂移:

[root@k8s-master01 ~]# shutdown -h now

漂到了k8s-master02节点上:

再把k8s-master02节点关闭:

[root@k8s-master02 ~]# shutdown -h now

漂到了k8s-master03节点上:

重新打开之后发现vip又回到到k8s-master01节点上:

五、安装kubectl、kubeadm、kubelet

5.1 所有节点安装kubectl、kubeadm、kubelet

配置仓库:

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.32/rpm/repodata/repomd.xml.key
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni
EOF

查看可以安装的版本:

yum list kubeadm --showduplicates --disableexcludes=kubernetes | sort -r

由于仓库我们配置的是1.32版本,所以找到的也只有这个版本:

所有节点安装软件:

yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

# kubelet开启开机自启动
systemctl enable kubelet --now

安装结果测试:

[root@k8s-master01 ~]# kubeadm version
kubeadm version: &version.Info{Major:"1", Minor:"32", GitVersion:"v1.32.7", GitCommit:"158eee9fac884b429a92465edd0d88a43f81de34", GitTreeState:"clean", BuildDate:"2025-07-15T18:06:15Z", GoVersion:"go1.23.10", Compiler:"gc", Platform:"linux/amd64"}

5.2 k8s-master01节点上初始化

初始化参考说明:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/

使用kubeadm --help查看帮助:

kubeadm --help

可以查看需要的镜像有哪些:

kubeadm config images list --kubernetes-version=v1.32.7 
#这里会指出沙箱版本,看见版本后重新核对cri-docker的服务文件中指定的版本,保持和这里一致。

但是这些镜像国内很难拉取,需要换成国内aliyun的镜像仓库。

# 初始化 Kubernetes 控制平面节点
# 参数说明:
# --apiserver-advertise-address:API 服务器所公布的其正在监听的 IP 地址。当前主节点IP。
# --control-plane-endpoint:为控制平面指定一个稳定的IP地址或DNS名称。VIP 或 LB 地址
# --upload-certs:将控制平面证书上传到kubeadm-certs Secret。上传证书以便其他控制平面节点加入时不用拷贝证书
# --image-repository:使用阿里云镜像仓库
# --service-cidr:Service 虚拟 IP 范围
# --pod-network-cidr:Pod 网络地址范围
# --kubernetes-version:指定版本
# --cri-socket:使用 cri-dockerd 作为容器运行时

kubeadm init \
  --apiserver-advertise-address=172.173.10.111 \
  --control-plane-endpoint="172.173.10.110:9443" \
  --upload-certs \
  --image-repository=registry.aliyuncs.com/google_containers \
  --service-cidr="10.96.0.0/12" \
  --pod-network-cidr="10.244.0.0/16" \
  --kubernetes-version=v1.32.7 \
  --cri-socket=unix:///var/run/cri-dockerd.sock

其它master节点按照提示加入,需要指定容器运行时的套接字:

  kubeadm join 172.173.10.110:9443 --token xz8n20.90e5orpdbd2gehxh \
        --discovery-token-ca-cert-hash sha256:a48d02b5a5a8960c8d979ee11929cd3b9a226a340ae85f409424f20d954d3d64 \
        --control-plane --certificate-key a9a4eaf11d5f7ac2e2885a047f82c78064d9cdb5042cbbc955f50361471d1f4c \
        --cri-socket=unix:///var/run/cri-dockerd.sock

node节点不需要拷贝证书,直接加入即可,但是也要指定容器运行时的套接字路径:

kubeadm join 172.173.10.110:9443 --token xz8n20.90e5orpdbd2gehxh \
        --discovery-token-ca-cert-hash sha256:a48d02b5a5a8960c8d979ee11929cd3b9a226a340ae85f409424f20d954d3d64 \
        --cri-socket=unix:///var/run/cri-dockerd.sock

添加完成之后在master节点上查看:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl get node

然后再按照它给的提示安装网络插件:
https://docs.tigera.io/calico/latest/getting-started/kubernetes/self-managed-onprem/onpremises#install-calico-with-kubernetes-api-datastore-more-than-50-nodes

curl -LO https://raw.githubusercontent.com/projectcalico/calico/v3.26.3/manifests/calico-typha.yaml
# 编辑文件修改如下配置
	CALICO_IPV4POOL_CIDR	指定为 pod 地址
# 修改为 BGP 模式
# Enable IPIP
- name: CALICO_IPV4POOL_IPIP
  value: "Always"  #改成Off

修改kube-proxy 模式为 ipvs

# kubectl edit configmap kube-proxy -n kube-system
mode: ipvs
kubectl delete pod -n kube-system -l k8s-app=kube-proxy
posted @ 2025-08-12 02:44  国杰响当当  阅读(51)  评论(0)    收藏  举报