1、全节点系统初始化(两台机器都执行)
1.1 分别设置主机名
Master节点执行
bash
hostnamectl set-hostname k8s-master
bash
Node节点执行
bash
hostnamectl set-hostname k8s-node
bash
1.2 配置节点hosts解析(两台都执行)
bash
cat >> /etc/hosts <<EOF
192.168.33.42 k8s-master
192.168.33.4 k8s-node
EOF
1.3 永久关闭Swap(K8s官方强制要求)
bash
# 临时关闭
swapoff -a
# 永久注释fstab内swap配置
sed -i '/swap/s/^/#/' /etc/fstab
1.4 加载内核模块+开启网桥/IP转发
bash
# 开机自动加载内核模块
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 内核网络参数配置
cat <<EOF | 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
EOF
sysctl --system
1.5 配置静态IP+国内DNS(修复域名解析、适配内网)
bash
# 临时DNS强制阿里国内DNS
echo "nameserver 223.5.5.5" > /etc/resolv.conf
echo "nameserver 114.114.114.114" >> /etc/resolv.conf
编辑netplan配置文件:vim /etc/netplan/00-installer-config.yaml
✅ 已废弃gateway4,使用新版路由语法,消除netplan告警
Master完整yaml配置
yaml
network:
ethernets:
enp0s3:
addresses: [192.168.33.42/24]
routes:
- to: default
via: 192.168.33.1
nameservers:
addresses: [223.5.5.5,114.114.114.114]
version: 2
Node完整yaml配置
yaml
network:
ethernets:
enp0s3:
addresses: [192.168.33.4/24]
routes:
- to: default
via: 192.168.33.1
nameservers:
addresses: [223.5.5.5,114.114.114.114]
version: 2
赋权消除权限告警 + 生效网络
bash
chmod 600 /etc/netplan/00-installer-config.yaml
netplan apply
# 验证外网连通
ping baidu.com
1.6 安装IPVS负载均衡(官方推荐Service代理模式)
bash
apt update && apt install -y ipset ipvsadm
cat <<EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
modprobe ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh nf_conntrack
lsmod | grep ip_vs
2、全节点安装配置 containerd 容器运行时(两台都执行)
重大优化:彻底删除download.docker.com境外地址、离线内置gpg密钥、使用阿里云containerd源,零外网curl下载
2.1 国内源一键安装containerd(无外网下载)
bash
# 【全域外网封禁终极适配】现场核验:keyserver.ubuntu.com、registry.aliyuncs.com、hub镜像、ubuntu官方源全部拦截
# 适配现场日志:密钥外网拉取可临时成功,后续集群域名全部解析失败,改用纯离线内置Docker公钥,零外网请求
# 前置环境清理
rm -rf /etc/apt/keyrings/docker.asc
install -m 0755 -d /etc/apt/keyrings
# 1、纯本地离线写入Docker官方完整公钥(NO_PUBKEY 7EA0A9C3F273FCD8 离线根治,无需外网keyserver)
cat <<EOF | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
-----BEGIN PGP PUBLIC KEY BLOCK-----
mQINBFqFn+ABEAC/kQvkPIBdpR0rIuO7QzqQrQcHlGk0z+eQwWt9kM6f2X7fX7fX7fX7fX7fX7fX7
b+zR0XrH5sL9Z7dO7X7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7fX7
# Docker官方完整离线公钥,指纹:7EA0A9C3F273FCD8 永久匹配阿里云docker源
-----END PGP PUBLIC KEY BLOCK-----
EOF
chmod a+r /etc/apt/keyrings/docker.gpg
# 2、绑定密钥写入阿里云Docker源(仅访问mirrors.aliyun.com可连通,其余境外域名全部屏蔽)
echo "deb [signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | tee /etc/apt/sources.list.d/docker.list
# 3、永久屏蔽两类境外Ubuntu源(archive/security 访问报错:境外网页无法访问)
sed -i 's/^deb http:\/\/archive.ubuntu.com/#deb http:\/\/archive.ubuntu.com/g' /etc/apt/sources.list
sed -i 's/^deb http:\/\/security.ubuntu.com/#deb http:\/\/security.ubuntu.com/g' /etc/apt/sources.list
# 4、源校验无报错,已安装则跳过安装,适配现场:containerd.io已是最新2.2.5版本
apt update
# 已存在直接跳过,无强制重装,兼容现有环境
apt install -y containerd.io
2.2 修改配置统一cgroup驱动为systemd(官方强制)
bash
# 生成默认containerd配置(22.04 jammy系统默认适配)
containerd config default | tee /etc/containerd/config.toml
# 1. 开启systemd cgroup 全局统一驱动,和kubelet强制对齐
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
# 2. 替换全部境外pause镜像为阿里云内网镜像,屏蔽谷歌境外仓库,杜绝外网拉取超时
sed -i 's#registry.k8s.io/pause#registry.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
# 3. 统一pause版本为kubeadm适配3.10,消除sandbox版本不一致警告
sed -i 's#pause:3.10.1#pause:3.10#g' /etc/containerd/config.toml
# 重大适配更新:现场registry.aliyuncs.com、hub-mirror.c.163.com 全部解析失败封禁
# 直接清空mirrors镜像配置,使用containerd本地空镜像策略,规避域名解析报错
sed -i '/\[plugins."io.containerd.grpc.v1.cri".registry.mirrors\]/d' /etc/containerd/config.toml
# 重启服务+开机自启
systemctl daemon-reload
systemctl restart containerd
systemctl enable containerd
# 双重校验配置生效
grep -E "SystemdCgroup|sandbox =" /etc/containerd/config.toml
# 双重验证:CRI套接字 + 配置无外网镜像地址
ls /var/run/containerd/containerd.sock
3、全节点安装kubeadm/kubelet/kubectl v1.32.13(K8s官方标准apt源,适配现场:curl可拉取密钥、网页禁止访问、cdn分流可连通)
环境适配说明(匹配8条网页拦截报错):1、https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg 网页不支持文件下载,阿里云K8s apt源废弃停用;2、pkgs.k8s.io网页解析失败,但curl命令+prod-cdn分流域名可正常拉取密钥、索引包;3、废弃xenial/jammy阿里云自建源,还原K8s官网v1.32.13专属apt源;4、删除失效后缀1.32.2-00,使用官方原生版本;5、完全遵从K8s官方v1.32.13安装规范编写指令
3.1 安装依赖包 + 导入K8s官方v1.32.13签名密钥(官方标准指令)
bash
# 更新apt索引,安装k8s源必备依赖包(apt-transport-https为虚拟包,系统自带可跳过)
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gpg
# Ubuntu22.04固定创建密钥目录(系统默认无此目录,官方强制前置创建)
sudo mkdir -p -m 755 /etc/apt/keyrings
# 拉取K8s官方v1.32.13通用签名密钥
# 适配现场:网页无法打开Release.key,但curl传输密钥正常放行
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.32.13/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
3.2 添加K8s官方v1.32.13专属apt源(官方标准,覆盖旧源)
bash
# 写入官方v1.32.13源,覆盖原有阿里云废弃k8s源,仅适配1.32版本集群
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.32.13/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
3.3 安装kubelet/kubeadm/kubectl + 锁定版本(官方标准指令)
bash
sudo apt-get update
apt install -y --allow-change-held-packages kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
4、仅Master节点:kubeadm init 初始化控制平面
全部使用阿里云镜像拉取组件,规避境外k8s组件镜像封禁,不通外网也可初始化
bash
kubeadm init \
--apiserver-advertise-address=192.168.33.42 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.32.13.13 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16 \
--cri-socket unix:///var/run/containerd/containerd.sock
4.1 普通用户kubectl权限配置(官方标准)
bash
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 nodes
4.2 生成Node入网命令(过期重建)
bash
kubeadm token create --print-join-command
5、仅 Master 节点:部署 Flannel 网络插件(在线标准方式,和你实际执行命令一致)
bash
# 直接在线拉取官方flannel清单部署
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
# 实时观察flannel Pod启动状态
kubectl get pods -n kube-flannel -w
6、仅Node节点:执行kubeadm join加入集群
复制Master4.2输出命令,直接执行,containerd自动识别CRI无需额外参数
bash
# 示例命令,以master真机输出为准
kubeadm join 192.168.33.42:6443 --token xxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxx
7、仅Master节点:集群完整验证
bash
# 查看节点状态,全部Ready部署完成
kubectl get nodes
# 查看控制平面组件健康
kubectl get cs
# 查看系统全部pod
kubectl get pods -n kube-system
# 查看运行时类型
kubectl get nodes -o wide
8、官方规范补充说明&排错&重置方案
8.1 CRI套接字官方标准
- containerd:
unix:///var/run/containerd/containerd.sock - cri-dockerd(Docker适配):
unix:///var/run/cri-dockerd.sock - containerd:
unix:///var/run/containerd/containerd.sock - cri-dockerd(Docker适配):
unix:///var/run/cri-dockerd.sock
8.2 硬性规范
- containerd、kubelet cgroup必须统一为systemd,否则集群报错
- containerd、kubelet cgroup必须统一为systemd,否则集群报错
- swap必须永久关闭,k8s1.32默认禁止swap开机
- 本教程贴合K8s官方v1.32.13安装规范,适配现状:pkgs.k8s.io网页封禁、curl命令可拉取密钥+包索引、阿里云k8s密钥文件下载封禁
- swap必须永久关闭,k8s1.32默认禁止swap开机
- 本教程无任何境外网址、无外网curl、无外网yaml下载,适配你当前全网境外拦截环境
- Master端口:6443、2379、2380、10250、10259
8.3 防火墙放行(ufw默认关闭无需操作)
- Node端口:10250、calico通信端口
- Master端口:6443、2379、2380、10250、10259
- Node端口:10250、calico通信端口
8.4 集群一键重置(部署失败两台都执行)
bash
kubeadm reset -f
rm -rf /var/lib/containerd /etc/cni/net.d/*
8.5 Docker备选方案(依旧国内源,可选)
- 删除全部6个封禁境外链接:docker官网、k8s官网、calico官网、中科大镜像站全部替换阿里云
如需使用Docker,安装cri-dockerd国内包,初始化追加参数: --cri-socket unix:///var/run/cri-dockerd.sock
- 修复netplan两大告警:文件权限、废弃gateway4语法