Rocky9.7部署kubernetes 1.32【双主双从】
1、环境要求
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
- 一台或多台机器,操作系统 RockyLinux9.7
- 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘50GB或更多
- 可以访问外网,需要拉取镜像,如果服务器不能上网,需要提前下载镜像并导入节点
- 禁止swap分区
1.1、硬件配置要求
| 节点名称 | 资源最低要求 | IP |
|---|---|---|
| k8s-master1 | 2C/4G+ 硬盘50G+ | 192.168.60.140 |
| k8s-master2 | 2C/4G+ 硬盘50G+ | 192.168.60.143 |
| k8s-node1 | 2C/4G+ 硬盘50G+ | 192.168.60.141 |
| k8s-node1 | 2C/4G+ 硬盘50G+ | 192.168.60.142 |
1.2、组件版本要求
| 组件 | 版本要求 |
|---|---|
| Containerd | 1.7.29(1.7 系列) |
| runc | 1.1.x |
| CNI-plugins | 1.9.1 |
| HAProxy | 系统 yum 自带 2.4 |
| Keepalived | 系统 yum 自带 2.2 |
| Docker | 任意新版 |
2、初始化系统配置(各节点)
2.1、关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
2.2、关闭selinux
# 临时关闭
setenforce 0
# 永久关闭
sed -i 's/enforcing/disabled/' /etc/selinux/config
2.3、关闭swap
为了保证内存调度准确、容器资源限制生效、节点性能稳定、避免整机卡顿雪崩,kubernetes集群必须关闭swap分区。
# 临时关闭
swapoff -a
# 永久关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab
2.4、更换阿里云 YUM 源
# 备份原有官方源
mkdir -p /etc/yum.repos.d/bak/
mv /etc/yum.repos.d/*.repo /etc/yum.repos.d/bak/
# 下载阿里云 Rocky9 镜像源
curl -o /etc/yum.repos.d/aliyun-rocky.repo https://mirrors.aliyun.com/repo/Rocky-9.repo
# 清理并生成新缓存
dnf clean all
dnf makecache
2.5、分别设置四个节点的主机名
# k8s-master1
hostnamectl set-hostname k8s-master1 && exec bash
# k8s-master2
hostnamectl set-hostname k8s-master2 && exec bash
# k8s-node1
hostnamectl set-hostname k8s-node1 && exec bash
# k8s-node2
hostnamectl set-hostname k8s-node2 && exec bash
2.6、添加hosts
cat << EOF >>/etc/hosts
192.168.60.140 k8s-master1
192.168.60.143 k8s-master2
192.168.60.141 k8s-node1
192.168.60.142 k8s-node2
EOF
2.7、配置内核参数
内核优化是为适配 K8s 容器网络、放开系统资源上限、稳定内存调度必备配置,开启网桥转发与 IP 转发保障 Pod 跨节点和 Service 正常通信,调大文件句柄、inotify、连接跟踪数,避免容器因资源上限出现文件句柄耗尽、连接打满闪退问题,同时优化内存调度、禁用 Swap 和无用 IPv6,防止节点卡顿、OOM 宕机与网络解析异常,满足 K8s 生产稳定运行要求。
cat > /etc/sysctl.d/99-k8s-production.conf <<EOF
# 网络基础 K8s 刚需
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
# 内存&Swap 生产关键
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
# 容器 inotify 限制
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
# 文件句柄 彻底突破131072限制
fs.file-max=52706963
fs.nr_open=52706963
# 关闭IPv6(内网无IPv6必开)
net.ipv6.conf.all.disable_ipv6=1
# 连接跟踪最大值 高并发必备
net.netfilter.nf_conntrack_max=2310720
EOF
加载br_netfilter、nf_conntrack模块
br_netfilter:给 K8s 网桥网络铺路,让 iptables 规则能管住容器流量;
nf_conntrack:开启内核连接跟踪,保证 K8s NAT、Service、高并发网络稳定不丢包。
modprobe br_netfilter
modprobe nf_conntrack
手动刷新,让优化文件立即生效
sysctl --system
2.8、配置资源使用限制。
cat >> /etc/security/limits.conf <<EOF
# 普通用户
* soft nofile 655360
* hard nofile 1048576
* soft nproc 655350
* hard nproc 655350
* soft memlock unlimited
* hard memlock unlimited
# root 单独配置(k8s/containerd/kubelet 关键)
root soft nofile 655360
root hard nofile 1048576
root soft nproc 655350
root hard nproc 655350
EOF
2.9、Systemd 限制
Rocky9下:
containerd、kubelet不读取limits.conf必须配置 systemd 全局限制,否则前面全部白搭。
mkdir -p /etc/systemd/system.conf.d/
cat > /etc/systemd/system.conf.d/99-k8s-limit.conf <<EOF
[Manager]
DefaultLimitNOFILE=655360:1048576
DefaultLimitNPROC=655350:655350
DefaultLimitMEMLOCK=infinity
EOF
# 重载系统配置
systemctl daemon-reload
2.10、安装依赖环境
dnf install -y conntrack ipvsadm ipset iptables \
libseccomp net-tools iproute \
curl wget vim jq sysstat bash-completion git chrony
2.11、设置时间同步
# 修改同步服务器
sed -i '/^pool/ c pool ntp1.aliyun.com iburst' /etc/chrony.conf
systemctl restart chronyd
systemctl enable chronyd
2.12、设置日志保存方式
# 创建保存日志的目录
mkdir /var/log/journal
# 创建配置文件存放目录
mkdir /etc/systemd/journald.conf.d
# 创建配置文件
cat > /etc/systemd/journald.conf.d/99-prophet.conf <<EOF
[Journal]
Storage=persistent //持久化存储
Compress=yes //日志文件是否需要压缩
SyncIntervalSec=5m //同步时间间隔
RateLimitInterval=30s //频率限制
RateLimitBurst=1000 //短时间内最大请求数量限制
SystemMaxUse=10G //日志文件最大系统空间使用量
SystemMaxFileSize=200M //单个文件的最大大小,超出该大小的文件可能会被分割或不再写入
MaxRetentionSec=2week //数据保留的时间
ForwardToSyslog=no //将日志转发到系统日志
EOF
重启systemd journald的配置
systemctl restart systemd-journald
2.13、kube-proxy 开启 ipvs 前置条件
cat > /etc/modules-load.d/ipvs.conf << EOF
# K8s 网桥网络必备
br_netfilter
# 连接跟踪
nf_conntrack
# IPVS 核心必装
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
# 防火墙/IP集合依赖
ip_tables
ip_set
xt_set
ipt_set
ipt_rpfilter
ipt_REJECT
# 隧道网络
ipip
EOF
重载配置文件
systemctl daemon-reload
# 重载后可查看
lsmod | grep -E "br_netfilter|ip_vs|nf_conntrack"

2.14、关闭NUMA
NUMA是为多路 CPU 优化内存访问性能的架构,但在 K8s 中禁用它是为了消除内核内存均衡带来的性能抖动与调度复杂度,让所有 CPU / 内存作为统一资源池,保障集群调度稳定、运维简单。
# 永久关闭
grubby --update-kernel=ALL --args="numa=off"
# 重启服务器,配置才能生效
reboot
验证是否关闭成功,[ 0.009004] NUMA turned off代表完全成功关闭 NUMA
dmesg | grep -i numa

关了硬件 NUMA 后,再把内核 NUMA 均衡也关掉,双重稳
echo "kernel.numa_balancing=0" >> /etc/sysctl.d/99-k8s-sysctl.conf
sysctl --system
3、部署containerd(各节点)
K8s自 1.24 版本起正式移除对
Dockershim的支持,因此不再原生兼容Docker作为容器运行时,1.32版本生产首选containerd 1.7.x最新稳定版,当前推荐:1.7.29+。
3.1、下载官方二进制包
cd /opt
# containerd 1.7.29
wget https://github.com/containerd/containerd/releases/download/v1.7.29/containerd-1.7.29-linux-amd64.tar.gz
# runc 1.1.12
wget https://github.com/opencontainers/runc/releases/download/v1.1.12/runc.amd64
# cni-plugins v1.9.1
wget https://github.com/containernetworking/plugins/releases/download/v1.9.1/cni-plugins-linux-amd64-v1.9.1.tgz
3.2、解压安装
# 解压 containerd 到 /usr/local
tar -zxf containerd-1.7.29-linux-amd64.tar.gz -C /usr/local
# 安装 runc
install -m 755 runc.amd64 /usr/local/sbin/runc
# 安装 cni-plugins
mkdir -p /opt/cni/bin
tar zxf cni-plugins-linux-amd64-v1.9.1.tgz -C /opt/cni/bin
3.3、配置 containerd
# 生成默认配置
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
# 修改关键配置:SystemdCgroup=true + pause 镜像(国内可拉)
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sed -i 's|registry.k8s.io/pause:3.8|registry.aliyuncs.com/google_containers/pause:3.9|g' /etc/containerd/config.toml
# 给 docker.io 添加国内镜像源
sed -i '/\[plugins."io.containerd.grpc.v1.cri".registry.mirrors\]/a \
[plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]\
endpoint = ["https://hub-mirror.c.163.com","https://docker.m.daocloud.io","https://docker.1ms.run","https://docker.jiaxin.site"]' /etc/containerd/config.toml
3.4、配置 systemd 服务
cat > /etc/systemd/system/containerd.service <<EOF
[Unit]
Description=containerd container runtime
Documentation=https://containerd.io
After=network.target
[Service]
ExecStartPre=-/sbin/modprobe overlay
ExecStart=/usr/local/bin/containerd
Restart=always
RestartSec=5
Delegate=yes
KillMode=process
OOMScoreAdjust=-999
LimitNOFILE=1048576
LimitNPROC=infinity
LimitCORE=infinity
[Install]
WantedBy=multi-user.target
EOF
3.5、启动 & 开机自启
systemctl daemon-reload
systemctl enable --now containerd
systemctl is-active containerd # 必须显示 active

4、安装 crictl
crictl 是 Kubernetes 容器运行时的通用命令行工具,核心作用是直接和 containerd 这类容器运行时交互,不依赖 Docker 或 kubectl,专门用来管理集群节点上的容器和镜像。
wget https://github.com/kubernetes-sigs/cri-tools/releases/download/v1.32.0/crictl-v1.32.0-linux-amd64.tar.gz
tar -zxf crictl-v1.32.0-linux-amd64.tar.gz -C /usr/local/bin
# 配置 crictl 默认指向 containerd
cat > /etc/crictl.yaml <<EOF
runtime-endpoint: unix:///run/containerd/containerd.sock
image-endpoint: unix:///run/containerd/containerd.sock
timeout: 10
debug: false
EOF
5、检查部署的组件版本和内核参数
# 1. 查看 containerd 版本
ctr version
# 2. 查看 runc 版本
runc --version
# 3. crictl 连通性
crictl info
# 4. 检查内核模块
lsmod | grep -E "overlay|br_netfilter|nf_conntrack"
# 5. 检查 sysctl 参数
sysctl net.bridge.bridge-nf-call-iptables


6、在Master节点中部署docker
仅用于拉取、打包镜像,不参与 K8s
# 添加官方源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装最新版 Docker
dnf install -y docker-ce docker-ce-cli containerd.io
# 注意!必须关闭 docker 自启(避免抢占资源)
systemctl disable --now docker
配置国内镜像加速地址
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.xuanyuan.me",
"https://docker.1ms.run",
"https://docker.m.daocloud.io"
]
}
EOF
# 重载配置
systemctl daemon-reload
systemctl restart docker
# 查看镜像地址
docker info

7、Kubernetes软件安装
控制平面(Master 节点)核心组件
| 组件名称 | 核心作用 | 说明 |
|---|---|---|
kube-apiserver |
集群统一入口,处理所有 REST 请求(kubectl、各组件通信、外部调用),提供认证、授权、准入控制,唯一与 etcd 直接交互的组件。 | 集群的 “大脑中枢”,没有它所有操作都无法执行,是控制平面中最核心的组件。 |
etcd |
分布式键值存储,保存集群所有状态数据(节点、Pod、Service、配置等),保证数据强一致性。 | 集群的 “数据库”,数据丢失则集群状态丢失,是高可用集群的重中之重。 |
kube-scheduler |
监控未分配节点的 Pod,根据资源、策略、亲和性等规则,选择最合适的节点调度 Pod。 | 集群的 “调度器”,决定 Pod 跑在哪,没有它 Pod 只会处于 Pending 状态。 |
kube-controller-manager |
运行各类控制器(节点控制器、副本控制器、服务账号控制器等),持续调谐集群实际状态与期望状态。 | 集群的 “运维管家”,保证集群按配置自动恢复(如 Pod 故障重启、节点故障驱逐)。 |
cloud-controller-manager |
对接云厂商 API(如阿里云、AWS),管理云资源(负载均衡、存储卷等),在自建裸金属集群中可不部署。 | 仅在云环境中必需,自建集群无依赖。 |
工作节点(Worker 节点)核心组件
| 组件名称 | 核心作用 | 说明 |
|---|---|---|
kubelet |
节点上的代理,接收 kube-apiserver 指令,管理本节点的 Pod 和容器生命周期(创建、监控、健康检查)。 | 节点的 “管家”,没有它节点无法加入集群,Pod 无法运行。 |
kube-proxy |
运行在节点上,维护网络规则,实现 Service 的负载均衡、IPVS/iptables 转发,让集群内外能访问 Pod。 | 集群的 “网络路由器”,没有它 Service 无法工作,Pod 网络无法互通。 |
containerd |
容器运行时,负责拉取镜像、启动 / 停止容器、管理容器生命周期,是 kubelet 的底层依赖。 | 容器的 “引擎”,没有它节点无法运行任何容器。 |
CoreDNS(或 kube-dns) |
集群内部 DNS 服务,负责 Service/Pod 的域名解析,让 Pod 能通过服务名互相访问。 | 集群的 “域名系统”,没有它微服务之间无法按名称通信。 |
7.1、配置kubernetes源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes Stable v1.32
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
EOF
7.2、安装kubeadm,kubelet和kubectl
由于版本更新频繁,这里指定版本号部署:
dnf install -y kubelet-1.32.0 kubeadm-1.32.0 kubectl-1.32.0
7.3、设置 kubelet 开机自启
systemctl enable --now kubelet
查看kubelet运行状态
systemctl status kubelet
activating (auto-restart)是正常的前置状态,是因为还没执行 kubeadm init,执行后生成 kubelet 的配置文件,此时 kubelet 会自动退出重启,之后就会变成 running 状态。
8、在所有 Master 节点上配置高可用
K8s 主节点是整个集群的大脑 + 管控中心,所有业务调度、发布、自愈、网络规则全靠它。如果只部署单主:只要这一台物理机 / 虚拟机宕机、死机、系统崩溃、重启维护,整个集群所有业务全部瘫痪,直接影响线上业务可用性。双主就是部署两台控制平面主节点,关键组件做集群冗余、etcd 数据库同步、apiserver 负载均衡。
8.1、安装Keepalived和HAProxy
dnf install haproxy keepalived -y
8.2、配置HAProxy
HAProxy是一款高性能、专业的四层 + 七层负载均衡软件,免费、稳定、并发能力强,专门做流量分发、故障转移,在K8s 中是多主节点的流量调度管家,统一入口、自动负载、自动剔除故障主节点,解决单主宕机集群瘫痪问题。
备份初始配置,防止修改错了无法找回原来的配置。
cp /etc/haproxy/haproxy.cfg{,_bak}
# 增加Haproxy配置的目录,存放子配置文件
mkdir -p /etc/haproxy/conf.d
修改haproxy.cfg 文件中的以下内容。默认的配置示例可以注释或者删除。
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local0 info
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
maxconn 20000
user haproxy
group haproxy
daemon
ulimit-n 65535
# turn on stats unix socket
stats socket /var/lib/haproxy/stats
stats timeout 30s
# utilize system-wide crypto-policies
ssl-default-bind-ciphers PROFILE=SYSTEM
ssl-default-server-ciphers PROFILE=SYSTEM
defaults
mode tcp
log global
option tcplog
option dontlognull
# option http-server-close
# option forwardfor except 127.0.0.0/8
option redispatch
retries 3
timeout http-request 15s
timeout queue 1m
timeout connect 5s
timeout client 30m
timeout server 30m
# timeout http-keep-alive 10s
timeout check 10s
maxconn 3000

新增k8s HAproxy子配置文件
cat <<EOF> /etc/haproxy/conf.d/k8s-haproxy.cfg
frontend monitor-in
bind *:33305
mode http
monitor-uri /monitor
frontend k8s-master
bind 0.0.0.0:16443
mode tcp
option tcplog
option clitcpka
default_backend k8s-master
backend k8s-master
mode tcp
balance roundrobin
option tcp-check
default-server inter 3s downinter 2s rise 3 fall 2
server k8s-master1 192.168.60.140:6443 check
server k8s-master2 192.168.60.143:6443 check
EOF
haproxy -c -f /etc/haproxy/haproxy.cfg

重启 HAProxy 并设开机自启
systemctl daemon-reload
systemctl restart haproxy
systemctl enable haproxy
8.3、配置Keeplived
Keeplived主要负责给 HAProxy 搭一个 虚拟 VIP,自动检测健康、故障自动漂移,保证 K8s apiserver 入口永远可用。
备份初始配置,防止修改错了无法找回原来的配置。
cp /etc/keepalived/keepalived.conf{,_bak}
第一台 master1 192.168.60.140 MASTER 的配置
cat <<EOF >/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_K8S_MASTER1
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id 51
priority 100
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.60.145/32 dev ens192 # ens192 网卡名
}
track_script {
check_haproxy
}
}
EOF
第二台 master2 192.168.60.143 BACKUP 的配置
cat <<EOF >/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_K8S_MASTER2
script_user root
enable_script_security
}
vrrp_script check_haproxy {
script "/etc/keepalived/check_haproxy.sh"
interval 2
weight -20
}
vrrp_instance VI_1 {
state BACKUP
interface ens192
virtual_router_id 51
priority 80
advert_int 1
nopreempt
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.60.145/32 dev ens192 # ens192 网卡名
}
track_script {
check_haproxy
}
}
EOF
参数说明:
● router_id:节点唯一标识,同集群两台主机不能相同,用于区分 Keepalived 节点
● script_user root:指定健康检查脚本以 root 用户身份运行
● enable_script_security:开启脚本安全校验,限制脚本权限与执行规则,生产环境安全加固
● script:指定 HAProxy 健康检查脚本的绝对路径
● interval 2:每 2 秒 执行一次健康检测
● weight -20:检测失败时,当前节点优先级自动扣减 20,让备节点优先级更高,触发 VIP 漂移
● state MASTER/BACKUP:节点角色,主节点填 MASTER,备节点填 BACKUP
● interface ens192:VRRP 心跳与 VIP 绑定的物理网卡,你当前网卡为 ens192
● virtual_router_id 51:虚拟路由 ID,同一集群两台节点必须一致,网段内唯一不冲突
● priority 100:节点优先级,数值越高越优先持有 VIP;主节点 100,备节点建议 80
● advert_int 1:节点之间 VRRP 心跳播报间隔 1 秒
● nopreempt:开启不抢占模式,主节点故障恢复后,不会强行抢回 VIP,避免业务抖动
● auth_type PASS:集群节点间认证方式,简易密码认证
● auth_pass 123456:集群认证密码,两台节点必须完全一致,防止非法设备接入
● 192.168.60.145/32:虚拟 VIP 地址,/32 代表单个主机路由,适合 K8s 生产环境
● dev ens192:将 VIP 绑定到指定物理网卡 ens192
● label ens192:1:给 VIP 设置子接口别名,方便 ip a 查看与网络排错
● check_haproxy:引用上方定义的健康检测规则,关联 HAProxy 状态,异常则触发 VIP 切换
两台机器都创建健康检测脚本check_haproxy.sh
cat <<EOF >/etc/keepalived/check_haproxy.sh
#!/bin/bash
# 检测HAProxy监控接口
curl -s http://127.0.0.1:33305/monitor | grep -q "OK"
if [ \$? -eq 0 ]; then
exit 0
else
# 探测失败,停止keepalived触发VIP漂移
systemctl stop keepalived
exit 1
fi
EOF
为健康检查脚本赋权
chmod +x /etc/keepalived/check_haproxy.sh
两台Master节点开机自启 + 启动服务
systemctl enable keepalived
systemctl start keepalived
8.3、检查VIP(192.168.60.145)能否正常漂移
在k8s-master1执行
ip a
可以看到vip绑定在这台服务器ens192网卡上
在k8s-master2执行
ip a
可以看到vip不在这台服务器上
模拟k8s-master1宕机,执行
systemctl stop keepalived
ip a
此时VIP不在k8s-master1
查看k8s-master2
ip a
可以看到VIP绑定在这k8s-master2的ens192网卡上
现在恢复k8s-master1,执行
systemctl start keepalived
ip a
VIP又飘回到了k8s-master1
9、初始化K8S集群
初始化失败时可以进行重置操作(可选)
kubeadm reset -f
rm -rf ~/.kube/ /etc/kubernetes/* /var/lib/etcd/*
9.1、在K8s-master1节点操作
节点创建kubeadm.yaml 配置文件如下:当然,也可以利用命令kubeadm config print init-defaults生成配置文件模板,然后进行修改:
需要自行修改的有:
◎ advertiseAddress #自己的master节点IP
◎ name #自己的master节点的名称
◎ certSANs #vip和master节点地址
◎ controlPlaneEndpoint #vip地址:端口
◎ kubernetesVersion #kubernets版本
◎ serviceSubnet #service网段
创建初始化文件 kubeadm-init.yaml
# 进入k8s安装目录
mkdir -p /etc/kubernetes/ &&cd /etc/kubernetes/
# 创建初始化文件
kubeadm config print init-defaults > kubeadm-init.yaml
# 1. 修改当前 Master 节点 IP
sed -i 's#advertiseAddress: 1.2.3.4#advertiseAddress: 192.168.60.140#' kubeadm-init.yaml
# 2. 修改节点主机名
sed -i 's#name: node#name: k8s-master1#' kubeadm-init.yaml
# 3. 替换 apiServer: {} 为 apiServer:(YAML 格式必须)
sed -i 's#apiServer: {}#apiServer:#' kubeadm-init.yaml
# 4. 添加证书信任列表(VIP + 双Master)
sed -i '\#apiServer:#a \ certSANs:\n - 192.168.60.140\n - 192.168.60.143\n - 192.168.60.145' kubeadm-init.yaml
# 5. 替换为阿里云镜像仓库
sed -i 's#imageRepository: registry.k8s.io#imageRepository: registry.aliyuncs.com/google_containers#' kubeadm-init.yaml
# 6. 添加高可用 VIP 入口
sed -i '\#apiVersion: kubeadm.k8s.io/v1beta4#a \controlPlaneEndpoint: "192.168.60.145:16443"' kubeadm-init.yaml
# 7. 添加Pod的网段
sed -i '/serviceSubnet: 10.96.0.0\/12/a \ podSubnet: 10.244.0.0\/16' kubeadm-init.yaml
# 8. 删除上方多余的 controlPlaneEndpoint
sed -i '0,/controlPlaneEndpoint/{//d}' kubeadm-init.yaml


完整配置文件
apiVersion: kubeadm.k8s.io/v1beta4
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 192.168.60.140
bindPort: 6443
nodeRegistration:
criSocket: unix:///var/run/containerd/containerd.sock
imagePullPolicy: IfNotPresent
imagePullSerial: true
name: k8s-master1
taints: null
timeouts:
controlPlaneComponentHealthCheck: 4m0s
discovery: 5m0s
etcdAPICall: 2m0s
kubeletHealthCheck: 4m0s
kubernetesAPICall: 1m0s
tlsBootstrap: 5m0s
upgradeManifests: 5m0s
---
apiServer:
certSANs:
- 192.168.60.140
- 192.168.60.143
- 192.168.60.145
apiVersion: kubeadm.k8s.io/v1beta4
controlPlaneEndpoint: "192.168.60.145:16443"
caCertificateValidityPeriod: 87600h0m0s
certificateValidityPeriod: 8760h0m0s
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
encryptionAlgorithm: RSA-2048
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: 1.32.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
proxy: {}
scheduler: {}
执行初始化
kubeadm init --config kubeadm-init.yaml
初始化成功截图
执行配置 kubectl 命令
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
查看节点状态
kubectl get node

开启IPVS模式
kubectl edit cm kube-proxy -n kube-system
把 mode: "" 改为 mode: "ipvs"
提前同步证书
# 1. 同步所有证书
scp -r /etc/kubernetes/pki/* root@k8s-master2:/etc/kubernetes/pki/
# 2. 删除 master2 不能用的 4 类冲突证书(全部在 master1 执行)
ssh root@k8s-master2 "rm -f /etc/kubernetes/pki/apiserver-kubelet-client.*"
ssh root@k8s-master2 "rm -f /etc/kubernetes/pki/apiserver.{crt,key}"
ssh root@k8s-master2 "rm -f /etc/kubernetes/pki/etcd/server.*"
ssh root@k8s-master2 "rm -f /etc/kubernetes/pki/etcd/peer.*"
如果加入指令忘记了,可以执行指令重新生成,生成的指令默认是加入work节点,如果需要加入控制节点,需要在生成的指令后加入参数--control-plane
kubeadm token create --print-join-command
9.2、在K8s-master2节点操作
k8s-master1节点初始化是出现两个kubeadm join 命令,第一个命令用来加入Master控制节点,第二个命令用来加入Node节点。
加入集群
kubeadm join 192.168.60.145:16443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:34de6724e11223840fdc25b2f0dd2dc66e03ed8e80e59d642c11347d0af47425 \
--control-plane

加入控制节点成功后,执行
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

10、K8S集群网络插件使用
网络插件选型对比
| 插件 | 网络模式 | 性能损耗 | 适用场景 |
|---|---|---|---|
| Flannel | VXLAN | 8-10% | 中小型集群 |
| Calico | BGP | 3-5% | 大规模生产环境 |
| Cilium | eBPF | 1-3% | 云原生安全场景 |
| Weave | mesh | 10-15% | 混合云环境 |
只在k8s-master1上操作
Calico具备完备的网络策略能力,可实现Pod访问隔离与流量管控,同时支持多种组网模式适配各类集群架构,网络转发性能出色,还自带监控运维能力,集群扩展性强,能够满足生产环境安全管控、高并发业务、大规模部署等各类核心需求。v3.29.1是一个经过长时间生产环境验证的成熟版本,能有效降低生产环境中遇到未预见问题的风险。v3.31.x并非最佳选择:虽然是最新版本,但作为新近推出的版本,生产环境的验证案例积累不足,而且从v3.30.x开始大幅引入 eBPF 等新特性,短期内的默认配置可能不太适合追求极致稳定性的用户。
# 拉取calico v3.29.1
wget https://raw.githubusercontent.com/projectcalico/calico/v3.29.1/manifests/calico.yaml
# 替换镜像仓库地址
sed -i 's|docker.io/|quay.io/|g' calico.yaml
# 修改calico默认的Pod IP池同k8s初始化文件的一样
sed -i '/# - name: CALICO_IPV4POOL_CIDR/{s/# //; n; s/# //; s/value: "[^"]*"/value: "10.244.0.0\/16"/}' calico.yaml
检查calico的配置是否生效
grep -A1 CALICO_IPV4POOL_CIDR calico.yaml

部署calico
kubectl apply -f calico.yaml
查看calico部署情况
kubectl get pods -n kube-system

11、将Node节点加入到集群中
在 Master 节点执行,生成 Node 节点加入 Kubernetes 集群的指令
kubeadm token create --print-join-command
在Node1、Node2节点执行
kubeadm join 192.168.60.145:16443 --token dlspny.xmatib1a4yzks1z4 --discovery-token-ca-cert-hash sha256:a8e4f2b89fa4f79a01b209873c1424380254ad3fe2f37fdbe5719e2fd2974782
加入成功
在k8s-master1节点验证集群的状态
kubectl get nodes

12、部署metrics-server服务
在新版的K8S中,系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存、磁盘、CPU和网络的使用率等信息。通过 Metrics API 获取。
● Metrics API 只可以查询当前的度量数据,并不保存历史数据
● Metrics API URI 为 /apis/metrics.k8s.io/,在 k8s.io/metrics维护
● 必须部署 metrics-server 才能使用该 API,metrics-server 通过调用 Kubelet Summary API 获取数据
● 版本:v0.7.2(兼容 K8s 1.27+,含 1.32 版本)
● 镜像:阿里云国内镜像
● 关键参数:–kubelet-insecure-tls 关闭节点证书校验,避免节点通信失败
# 获取官方 yaml文件
wget -O metrics-server.yaml https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.7.2/components.yaml
# 修改镜像地址
sed -i 's|registry.k8s.io/metrics-server|registry.aliyuncs.com/google_containers|' metrics-server.yaml
# 官方 metrics-server yaml 默认开启 kubelet TLS 证书校验,自建 K8s 集群证书不受信任会导致健康检查返回 500 错误。必须添加启动参数:--kubelet-insecure-tls 关闭证书校验,才能正常采集节点指标。
sed -i '/--metric-resolution=15s/a \ - --kubelet-insecure-tls' metrics-server.yaml
一键部署
kubectl apply -f metrics-server.yaml
查看各节点的资源使用情况
kubectl top node

查看kube-system名称空间下的Pod使用资源的情况
kubectl top pod -n kube-system

更多推荐



所有评论(0)