找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

161

积分

0

好友

19

主题
发表于 昨天 01:00 | 查看: 4| 回复: 0

在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 状态变为ReadyRunning

# 查看节点状态 (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 集群已成功部署并运行!

您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区(YunPan.Plus) ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-1 13:29 , Processed in 0.055429 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 CloudStack.

快速回复 返回顶部 返回列表