在Kubernetes部署过程中,核心组件镜像拉取失败是常见挑战,尤其是在国内网络环境下。本文基于Rocky Linux 10.1和Kubernetes v1.34.2,提供一套完整的部署指南,涵盖从系统配置到集群初始化的每一步,并重点解决镜像拉取问题。
部署环境与准备工作
节点规划
| 节点名称 |
IP 地址 |
角色 |
操作系统 |
| k8s-1 |
192.168.37.130 |
Master/Control Plane |
Rocky Linux 10.1 |
| k8s-2 |
192.168.37.131 |
Worker Node |
Rocky Linux 10.1 |
提示:请将命令中的 IP 地址、网关和连接名称替换为您实际环境中的参数。
配置静态 IP 地址 (所有节点)
首先,确定您的网络接口名称(例如:ens160)。
# 查看所有网络接口及其状态,确认接口名称
nmcli device status
# 查看所有连接配置集 (Connection Profile)
nmcli connection show
# --- 配置 k8s-1 节点 ---
nmcli connection modify ens160 ipv4.method manual \
ipv4.addresses 192.168.37.130/24 \
ipv4.gateway 192.168.37.2 \
ipv4.dns "192.168.37.2, 114.114.114.114"
# --- 配置 k8s-2 节点 ---
nmcli connection modify ens160 ipv4.method manual \
ipv4.addresses 192.168.37.131/24 \
ipv4.gateway 192.168.37.2 \
ipv4.dns "192.168.37.2, 114.114.114.114"
# 应用配置,使之生效
nmcli connection up ens160
配置主机名 (所有节点)
# k8s-1 节点执行
hostnamectl set-hostname k8s-1
# k8s-2 节点执行
hostnamectl set-hostname k8s-2
配置主机名解析 (所有节点)
将所有节点的 IP 和主机名映射添加到/etc/hosts文件中。
cat >> /etc/hosts <<EOF
192.168.37.130 k8s-1
192.168.37.131 k8s-2
EOF
初始化系统配置 (所有节点)
这一步是部署Kubernetes集群的标准配置,确保系统满足运行要求。
# 1. 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
# 2. 设置 SELinux 为宽容模式 (Permissive)
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
# 3. 关闭 Swap 分区 (K8s 强制要求)
swapoff -a
# 永久禁用 Swap
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 4. 加载必要的内核模块
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
# 5. 设置 sysctl 参数 (启用 IP 转发和 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
安装容器运行时 Containerd
Kubernetes 从 v1.24 开始默认使用 Containerd 作为容器运行时。
配置 Docker/Containerd Yum 源 (所有节点)
dnf install -y dnf-utils
dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# 安装 containerd.io
dnf install -y containerd.io
解决致命问题:配置 Containerd 代理(国内网络必做)
问题复现:在部署中,由于默认的registry.k8s.io镜像源无法访问,导致pause镜像拉取失败,所有 K8s 核心组件无法启动。
解决方案:为容器运行时配置系统级代理,确保它能访问外部资源。
注意:这里的http://192.168.37.1:7897必须替换为您自己可以正常工作的代理地址。
# 1. 创建 systemd 配置文件目录
sudo mkdir -p /etc/systemd/system/containerd.service.d/
# 2. 创建或编辑代理配置文件 /etc/systemd/system/containerd.service.d/http-proxy.conf
cat <<EOF | sudo tee /etc/systemd/system/containerd.service.d/http-proxy.conf
[Service]
# 请替换为您自己的代理地址
Environment="HTTP_PROXY=http://192.168.37.1:7897"
Environment="HTTPS_PROXY=http://192.168.37.1:7897"
# 排除不需要走代理的内部地址
Environment="NO_PROXY=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local"
EOF
# 3. 重新加载并重启 Containerd
sudo systemctl daemon-reload
sudo systemctl restart containerd
# 4. 设置开机自启
sudo systemctl enable containerd
安装 Kubernetes 组件
添加 Kubernetes v1.34 Yum 源 (所有节点)
我们使用最新的pkgs.k8s.io官方仓库。
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/
enabled=1
gpgcheck=1
# GPG 密钥
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.34/rpm/repodata/repomd.xml.key
EOF
# 安装 kubelet, kubeadm, kubectl
dnf install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 设置开机自启 (但此时不要启动,由 kubeadm init 接管)
systemctl enable kubelet
启动集群
核心步骤:初始化集群 (仅在 Master 节点 k8s-1 执行)
为避免再次遇到镜像拉取失败问题,我们使用阿里云的镜像仓库 (registry.aliyuncs.com/google_containers) 替代官方仓库。
kubeadm init \
--apiserver-advertise-address=192.168.37.130 \
--image-repository registry.aliyuncs.com/google_containers \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=v1.34.2
参数说明:
--apiserver-advertise-address: Master 节点的 IP 地址。
--image-repository: 使用国内阿里云的容器镜像仓库。
--pod-network-cidr: Pod 网络地址段,Calico 默认使用 10.244.0.0/16。
--kubernetes-version: 指定版本为 v1.34.2。
配置 Master 节点 (仅在 Master 节点 k8s-1 执行)
初始化成功后,请根据输出提示,执行以下命令,让当前用户可以使用kubectl管理集群:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
工作节点加入集群 (仅在 Worker 节点 k8s-2 执行)
复制kubeadm init成功后输出的kubeadm join命令,并在 k8s-2 节点执行。
示例命令:(您的 Token 和 Hash 会不同,请使用您自己的输出)
# 替换为您 Master 节点输出的完整命令
kubeadm join 192.168.37.130:6443 --token xxxxx.xxxxxxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
安装网络插件与验证
安装 Calico 网络插件 (仅在 Master 节点 k8s-1 执行)
我们使用 Calico v3.27.0 作为集群网络插件,它与我们设置的10.244.0.0/16CIDR 兼容。
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
验证集群状态 (仅在 Master 节点 k8s-1 执行)
稍等片刻(约 1-2 分钟),直到所有节点和核心 Pod 状态变为Ready和Running。
# 查看节点状态 (ROLE 出现 control-plane 和 <none> 且 STATUS 为 Ready 即成功)
kubectl get node -owide
# 查看核心 Pod 状态 (所有 Pod 的 STATUS 为 Running 即成功)
kubectl get pod -A
期望的成功输出示例:
NAME STATUS ROLES AGE VERSION INTERNAL-IP ...
k8s-1 Ready control-plane ... v1.34.2 192.168.37.130 ...
k8s-2 Ready <none> ... v1.34.2 192.168.37.131 ...
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system calico-kube-controllers-xxxx 1/1 Running 0 ...
kube-system calico-node-xxxx 1/1 Running 0 ...
# ... 所有 Pod 均 Running
恭喜!您的 Rocky Linux 10.1 上的 Kubernetes v1.34.2 集群已成功部署并运行!