系统运维:在国内快速部署 Kubernetes 集群,避坑指南与实践
本文提供了一套在国内环境下快速部署 Kubernetes 集群的完整方案,包括了 containerd 的安装、kubeadm 的使用、镜像仓库的配置、网络插件的部署等关键步骤。然而,在我国部署 k8s 集群时,由于网络环境的特殊性,经常会遇到镜像拉取缓慢或失败的问题。本文将分享一套完整的 k8s 集群部署方案,从安装 containerd 容器运行时到使用 kubeadm 初始化集群,再到部署
引言
Kubernetes (k8s) 已成为容器编排的事实标准。然而,在我国部署 k8s 集群时,由于网络环境的特殊性,经常会遇到镜像拉取缓慢或失败的问题。本文将分享一套完整的 k8s 集群部署方案,从安装 containerd 容器运行时到使用 kubeadm 初始化集群,再到部署 Cilium 网络插件,详细讲解每个步骤,并提供针对国内网络环境的优化建议。
前提条件
- 至少一台 Linux 服务器(推荐 Ubuntu 22.04),作为控制平面节点(master)。
- (可选)若干台 Linux 服务器作为工作节点(worker)。
- 所有节点能够相互通信。
- 所有节点都已经安装好 Docker 或者 containerd, 这里我们使用 containerd.
- 所有节点都关闭了 强制访问控制 (MAC) 系统(AppArmor|SELinux) 和 防火墙(ufw:Uncomplicated Firewall|firewalld),或者配置了相应的规则。 这一步根据实际安全要求可以放宽。
步骤 1:准备工作(所有节点)
-
关闭 Swap: Kubernetes 1.8+ 要求关闭 swap 分区。
sudo swapoff -a # 永久禁用,编辑 /etc/fstab 文件,注释掉包含 "swap" 的行。如果不关闭swap,后续kubelet可能会启动失败,也可以在kubelet的配置文件中添加
--fail-swap-on=false参数来忽略swap开启的影响。 -
配置内核参数: 启用 IPv4 转发。
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.ipv4.ip_forward = 1 EOF sudo sysctl --system # 验证: sysctl net.ipv4.ip_forward # 输出应为 net.ipv4.ip_forward = 1 -
配置主机名解析(可选): 如果我们的节点没有 DNS 服务器,可以在
/etc/hosts文件中添加节点间的 IP 地址和主机名映射。
步骤 2:安装 containerd(所有节点)
containerd 是一个工业级的容器运行时,比 Docker 更轻量、更安全,也更适合 Kubernetes。
-
下载 containerd: 从 GitHub 下载 containerd 的二进制包(根据你的系统架构选择合适的版本,这里以 2.0.2 版本为例,但建议选择一个较新的稳定版本,比如 1.6 或 1.7 系列):
wget https://github.com/containerd/containerd/releases/download/v2.0.2/containerd-2.0.2-linux-amd64.tar.gz #请根据需求更改版本- 国内镜像加速 (可选): 如果 GitHub 下载速度慢,可以使用国内镜像:
使用github proxy wget https://ghproxy.com/https://github.com/containerd/containerd/releases/download/v2.0.2/containerd-2.0.2-linux-amd64.tar.gz
- 国内镜像加速 (可选): 如果 GitHub 下载速度慢,可以使用国内镜像:
-
解压 containerd:
sudo tar Cxzvf /usr/local containerd-2.0.2-linux-amd64.tar.gz -
创建 containerd systemd 服务文件:
cat <<EOF | sudo tee /etc/systemd/system/containerd.service [Unit] Description=containerd container runtime Documentation=https://containerd.io After=network.target local-fs.target [Service] ExecStartPre=-/sbin/modprobe overlay ExecStart=/usr/local/bin/containerd Type=notify Delegate=yes KillMode=process Restart=always RestartSec=5 # Having non-zero Limit*s causes performance problems due to accounting overhead # in the kernel. We recommend using cgroups to do container-local accounting. LimitNPROC=infinity LimitCORE=infinity LimitNOFILE=infinity # Comment TasksMax if your systemd version does not supports it. # Only systemd 226 and above support this version. TasksMax=infinity OOMScoreAdjust=-999 [Install] WantedBy=multi-user.target EOF -
启动并启用 containerd:
sudo systemctl daemon-reload sudo systemctl enable --now containerd sudo systemctl status containerd # 检查状态 -
配置 containerd (可选,但推荐):
生成默认配置文件:
sudo mkdir -p /etc/containerd containerd config default | sudo tee /etc/containerd/config.toml修改配置文件
/etc/containerd/config.toml:-
修改
sandbox_image: 将sandbox_image改为国内镜像源(例如阿里云):[plugins."io.containerd.grpc.v1.cri"] sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9" # 注意版本号- 注意: 不同镜像仓库的 pause 镜像版本号可能不同,你需要根据实际情况调整。
-
(可选, 强烈建议)配置镜像加速:
```toml [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://<your-mirror-address>"] # 替换为你的镜像加速地址 ``` 例如,使用阿里云的镜像加速: ```toml [plugins."io.containerd.grpc.v1.cri".registry.mirrors] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"] endpoint = ["https://xxxxxx.mirror.aliyuncs.com"] [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"] endpoint = ["https://registry.aliyuncs.com/google_containers"] ``` * 你需要将 `https://xxxxxx.mirror.aliyuncs.com` 替换为你自己的阿里云镜像加速地址。 * 设置 `k8s.gcr.io` 的 mirror 可以避免后续的一些镜像问题.- (可选) 更改cgroup driver:containerd 默认使用
systemd作为 cgroup 驱动。如果kubelet也配置为systemd cgroup driver,则无需更改. 如果kubelet配置为cgroupfs, 则需要修改此项, 否则kubelet可能无法启动.[plugins."io.containerd.grpc.v1.cri"] ... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc] ... [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options] SystemdCgroup = true #或者 false
重启 containerd:
sudo systemctl restart containerd -
步骤 3:安装 kubeadm, kubelet, kubectl (所有节点)
-
添加 Kubernetes 软件源 (以阿里云为例):
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el8-\$basearch/ enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF- 注意: 如果你是 Debian/Ubuntu 系统,需要使用
apt并配置相应的 Kubernetes apt 源。
sudo apt-get update && sudo apt-get install -y apt-transport-https curl curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add - sudo tee /etc/apt/sources.list.d/kubernetes.list <<EOF deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF - 注意: 如果你是 Debian/Ubuntu 系统,需要使用
-
安装 kubeadm, kubelet, kubectl:
# CentOS/RHEL sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes # Ubuntu/Debian sudo apt-get update sudo apt-get install -y kubelet kubeadm kubectl --allow-unauthenticated -
启用 kubelet:
sudo systemctl enable --now kubelet
步骤 4:初始化 Master 节点 (仅在 Master 节点执行)
-
预拉取镜像 (可选,但强烈推荐): 使用国内镜像源预先拉取 k8s 组件镜像,避免
kubeadm init过程中因网络问题失败。kubeadm config images pull --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.32.1--image-repository: 指定国内镜像仓库。--kubernetes-version: 指定 k8s 版本,与你要部署的版本一致。
-
初始化集群:
sudo kubeadm init --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.32.1 --pod-network-cidr=10.244.0.0/16--image-repository: 指定国内镜像仓库。--kubernetes-version: 指定 Kubernetes 版本。--pod-network-cidr: 指定 Pod 网络 CIDR,需要与你选择的网络插件匹配(例如,Flannel 默认使用10.244.0.0/16,Calico 默认使用192.168.0.0/16)。 如果使用 Cilium,可以不指定这个参数,Cilium 会自动配置。
-
配置kubectl:
按照
kubeadm init命令的输出提示,配置 kubectl:mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config或者,如果你是 root 用户:
export KUBECONFIG=/etc/kubernetes/admin.conf
步骤 5:部署网络插件 (仅在 Master 节点执行)
Kubernetes 需要一个网络插件来实现 Pod 之间的通信。这里以 Cilium 为例,Cilium 是一个高性能、功能强大的网络插件,基于 eBPF 技术。
- 安装Cilium CLI:
CILIUM_CLI_VERSION=$(curl -s https://raw.githubusercontent.com/cilium/cilium-cli/main/stable.txt)
CLI_ARCH=amd64
if [ "$(uname -m)" = "aarch64" ]; then CLI_ARCH=arm64; fi
curl -L --fail --remote-name-all https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
sha256sum --check cilium-linux-${CLI_ARCH}.tar.gz.sha256sum
sudo tar xzvfC cilium-linux-${CLI_ARCH}.tar.gz /usr/local/bin
rm cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
如果下载失败,可以使用ghproxy代理:
curl -L --fail --remote-name-all https://ghproxy.com/https://github.com/cilium/cilium-cli/releases/download/${CILIUM_CLI_VERSION}/cilium-linux-${CLI_ARCH}.tar.gz{,.sha256sum}
- 安装 Cilium:
cilium install --version 1.17.0 --wait # 建议安装一个较新的版本,与你的 Kubernetes 版本兼容。
- 如果提示缺少 helm, 可以先手动安装 helm.
- 检查 Cilium 状态:
cilium status --wait
步骤 6:加入 Worker 节点 (在每个 Worker 节点执行)
在 Master 节点上执行 kubeadm init 后,会输出 kubeadm join 命令。在每个 Worker 节点上执行该命令,将其加入集群。
sudo kubeadm join <master-ip>:6443 --token <token> --discovery-token-ca-cert-hash sha256:<hash>
<master-ip>: Master 节点的 IP 地址。<token>: 加入集群的令牌。<hash>: CA 证书的哈希值。
步骤 7:(可选)去除 Master 节点污点
默认情况下,master节点有污点,不会被调度pod。如果希望在master节点也运行pod(例如单节点集群),可以去除污点:
kubectl taint nodes --all node-role.kubernetes.io/control-plane-
常见问题排查
- kubelet 启动失败: 查看 kubelet 日志 (
journalctl -xeu kubelet),常见原因包括:- Swap 未关闭。
- 内核参数未配置。
- containerd 未启动或配置错误。
- kubelet 配置文件错误(例如,
/var/lib/kubelet/kubeadm-flags.env或/etc/systemd/system/kubelet.service.d/10-kubeadm.conf)。
- Pod 无法启动: 查看 Pod 描述 (
kubectl describe pod <pod-name> -n <namespace>),常见原因包括:- 镜像拉取失败(检查镜像地址、镜像仓库认证)。
- 网络插件未正确配置。
- 资源不足(CPU、内存)。
- 网络不通:
- 检查CNI是否正常运行:
kubectl get pods -n kube-system - 防火墙: 检查节点间防火墙是否打开了需要的端口.
- 检查CNI配置是否正确.
- 检查CNI是否正常运行:
ctr cri login失败 (如果你的 containerd 版本较旧): 确保你使用了正确的ctr image pull命令和认证参数。
总结
本文提供了一套在国内环境下快速部署 Kubernetes 集群的完整方案,包括了 containerd 的安装、kubeadm 的使用、镜像仓库的配置、网络插件的部署等关键步骤。通过采用国内镜像源、预拉取镜像等优化措施,可以有效解决网络问题,提高部署效率。同时,本文也介绍了常见问题的排查方法,帮助大家快速定位和解决问题。希望这篇文章能帮助大家在国内顺利部署和使用 Kubernetes!
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)