一、主机规划
角色 | 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 ens32nmcli 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 ens32nmcli 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 ens32nmcli 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 ens32nmcli 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 关闭swap
swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab
2.6 关闭防火墙和selinux
systemctl disable firewalld --now && setenforce 0 && sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
2.7 配置主机名解析和免密
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;dosshpass -e ssh-copy-id -o StrictHostKeyChecking=no $HOST
done
2.8 配置时钟同步
配置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.9 启用 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.10 加载br_betfilter模块
modprobe br_netfilter
cat <<EOF> /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
2.11 加载 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
#下载docker-ce
curl -LO https://mirrors.aliyun.com/docker-ce/linux/static/stable/x86_64/docker-27.4.0.tgz
#解压,可能要先安装tar:yum -y install tar
tar xf docker-*.tgz
cp docker/* /usr/bin/
3.1.1 创建containerd服务文件:
cat >/etc/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target local-fs.target[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/bin/containerd
Type=notify
Delegate=yes
KillMode=process
Restart=always
RestartSec=5
LimitNPROC=infinity
LimitCORE=infinity
LimitNOFILE=1048576
TasksMax=infinity
OOMScoreAdjust=-999[Install]
WantedBy=multi-user.target
EOF#设置开机自启
systemctl enable --now containerd.service
systemctl status containerd.service
3.1.2 创建docker的服务文件:
cat > /etc/systemd/system/docker.service <<EOF
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network-online.target firewalld.service cri-docker.service docker.socket containerd.service
Wants=network-online.target
Requires=docker.socket containerd.service[Service]
Type=notify
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
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
OOMScoreAdjust=-500[Install]
WantedBy=multi-user.target
EOF
3.1.3 准备docker的socket文件
cat > /etc/systemd/system/docker.socket <<EOF
[Unit]
Description=Docker Socket for the API[Socket]
ListenStream=/var/run/docker.sock
SocketMode=0660
SocketUser=root
SocketGroup=docker[Install]
WantedBy=sockets.target
EOF
配置镜像加速
mkdir /etc/docker/ -pv
cat >/etc/docker/daemon.json <<EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://jockerhub.com"],"max-concurrent-downloads": 10,"log-driver": "json-file","log-level": "warn","log-opts": {"max-size": "10m","max-file": "3"},"data-root": "/var/lib/docker"
}
EOF
设置 Docker 使用 systemd 作为 cgroup 驱动,确保与 Kubernetes 的资源管理一致
"exec-opts": ["native.cgroupdriver=systemd"]
启动docker
groupadd docker
#创建docker组systemctl daemon-reload
# 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。systemctl enable --now docker.socket
# 启用并立即启动docker.socket单元。docker.socket是一个systemd的socket单元,用于接收来自网络的Docker API请求。systemctl enable --now docker.service
# 启用并立即启动docker.service单元。docker.service是Docker守护进程的systemd服务单元。systemctl status docker.service
# 显示docker.service单元的当前状态,包括运行状态、是否启用等信息。docker info
#验证rm -rf docker*
#删除
检查:
docker info | grep 'Cgroup Driver
3.1.4 安装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 -r cri-dockerd/ /usr/bin/
#给执行权限
chmod +x /usr/bin/cri-dockerd/cri-dockerd
#删除
rm -rf cri-dockerd*#查看软件启动帮助
/usr/bin/cri-dockerd/cri-dockerd --help
- --container-runtime-endpoint :后端运行时服务的端点。目前在 Linux 上支持 Unix 套接字和 TCP 端点,在 Windows 上支持命名管道(npipe)和 TCP 端点。
- --pod-infra-container-image :沙箱容器(pause 容器)使用的镜像,在 Kubernetes 中扮演的是 Pod 的基础容器,每隔pod里面都会有这个容器,用于管理 Pod 的生命周期,网络等等。从默认仓库拉取比较困难,下面是配置了从国内阿里云拉取
3.1.5 写入启动cri-docker配置文件
cat > /usr/lib/systemd/system/cri-docker.service <<EOF
[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/cri-dockerd --network-plugin=cni --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.9
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.1.6 写入cri-docker的socket配置文件
cat > /usr/lib/systemd/system/cri-docker.socket <<EOF
[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
# 用于重新加载systemd管理的单位文件。当你新增或修改了某个单位文件(如.service文件、.socket文件等),需要运行该命令来刷新systemd对该文件的配置。
systemctl daemon-reload# 启用并立即启动cri-docker.service单元。cri-docker.service是cri-docker守护进程的systemd服务单元。
systemctl enable --now cri-docker.service# 查看状态
systemctl status docker.service
测试是否接管成功:
#下载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 负载均衡
# =========================globalmaxconn 2000 # 最大并发连接数,防止连接过载ulimit-n 16384 # 设置文件描述符上限,适配高并发场景log 127.0.0.1 local0 err # 日志输出到本地 syslog,级别为 err(建议改为 info)stats timeout 30s # 状态页面连接超时时间defaultslog 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-inbind *:33305 # 监听所有 IP 的 33305 端口,用于健康检查mode http # 使用 HTTP 模式option httplog # 启用 HTTP 日志monitor-uri /monitor # 访问 /monitor 返回 200,用于 Keepalived 检查# =========================
# Kubernetes API Server 接入入口
# =========================
frontend k8s-masterbind 0.0.0.0:9443 # 所有外部 IP 可访问的 9443 端口bind 127.0.0.1:9443 # 本地回环地址也监听 9443(便于本机访问)mode tcp # 使用 TCP 模式,适用于 Kubernetes API Serveroption tcplog # 启用 TCP 层日志tcp-request inspect-delay 5s # 延迟 TCP 请求检查 5 秒(用于连接检测)default_backend k8s-master # 默认转发到 backend k8s-master# =========================
# 后端 Kubernetes API Server 集群
# =========================
backend k8s-mastermode 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:权重 100server 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 keepalivedglobal_defs {router_id LVS_DEVEL
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh" #检查脚本,检查失败将漂移VIP地址interval 5 weight -5fall 2rise 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 #当前节点优先级,数值越大越优先成为 MASTERnopreemptadvert_int 2authentication {auth_type PASSauth_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 keepalivedglobal_defs {router_id LVS_DEVEL
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh" #检查脚本,检查失败将漂移VIP地址interval 5 weight -5fall 2rise 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 #当前节点优先级,数值越大越优先成为 MASTERnopreemptadvert_int 2authentication {auth_type PASSauth_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 keepalivedglobal_defs {router_id LVS_DEVEL
}
vrrp_script chk_apiserver {script "/etc/keepalived/check_apiserver.sh" #检查脚本,检查失败将漂移VIP地址interval 5 weight -5fall 2rise 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 #当前节点优先级,数值越大越优先成为 MASTERnopreemptadvert_int 2authentication {auth_type PASSauth_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)
docheck_code=\$(pgrep haproxy)if [[ \$check_code == "" ]]; thenerr=\$(expr \$err + 1)sleep 1continueelseerr=0breakfi
doneif [[ \$err != "0" ]]; thenecho "systemctl stop keepalived"/usr/bin/systemctl stop keepalivedexit 1
elseexit 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查看帮助:
可以查看需要的镜像有哪些:
但是这些镜像国内很难拉取,需要换成国内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
然后再按照它给的提示安装网络插件:
Installing Addons | Kubernetes
#下载yaml文件curl -LO https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml#替换镜像仓库sed -i 's#ghcr.io/flannel-io#registry.cn-hangzhou.aliyuncs.com/guojie-k8s#g' kube-flannel.yml#创建网络插件资源kubectl create -f kube-flannel.yml
等资源启动完毕节点状态就会Ready: