一、先明确实验环境和搭建目标

本文示例使用 1 个控制平面节点和 2 个工作节点,目的是完成一个可正常调度 Pod、可查看系统组件状态、可通过可视化界面访问的基础 Kubernetes 集群。

1.1 节点规划

主机名 IP 地址 说明
k8s-master01 10.0.0.20/24 控制平面节点
k8s-node01 10.0.0.21/24 工作节点
k8s-node02 10.0.0.22/24 工作节点

1.2 版本说明

从原始命令可以看出,本文示例以 Kubernetes v1.32.2 为准,容器运行时使用 containerd。如果你要复现实验,建议三台机器使用同一发行版和一致的软件版本。

二、系统初始化是搭建前最重要的一步

在安装 Kubernetes 之前,先把每台主机的主机名、主机解析、SELinux、swap 和基础软件环境处理干净,可以减少后续大量莫名其妙的问题。

2.1 配置主机名和 hosts

每台主机分别设置自己的主机名:

hostnamectl set-hostname k8s-master01
hostnamectl set-hostname k8s-node01
hostnamectl set-hostname k8s-node02

然后统一维护主机解析:

vim /etc/hosts

10.0.0.20 k8s-master01
10.0.0.21 k8s-node01
10.0.0.22 k8s-node02

2.2 关闭防火墙、SELinux 和 swap

防火墙、SELinux 与 swap 往往会直接影响容器网络、调度和 kubelet 启动,因此入门环境里通常会先关闭它们。

systemctl disable --now firewalld

setenforce 0
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

swapoff -a && sysctl -w vm.swappiness=0
sed -ri '/^[^#]*swap/s@^@#@' /etc/fstab

2.3 配置基础软件源并安装常用工具

示例中通过阿里云镜像站配置基础源,并安装一些排障和系统管理常用工具:

sed -e 's|^mirrorlist=|#mirrorlist=|g' \
    -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \
    -i.bak \
    /etc/yum.repos.d/rocky-*.repo

dnf makecache

yum install wget jq psmisc vim net-tools telnet yum-utils device-mapper-persistent-data lvm2 git -y

三、安装 containerd 运行时

Kubernetes 不直接运行容器,它依赖容器运行时来完成镜像拉取、容器创建和底层资源管理。这里的运行时选用 containerd

3.1 配置源并安装 containerd

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install containerd.io -y

3.2 配置内核模块和 sysctl 参数

这些参数主要为容器网络转发和 kube-proxy 规则处理做准备:

cat <<EOF | sudo tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/sysctl.d/99-kubernetes-cri.conf
net.bridge.bridge-nf-call-iptables  = 1
net.ipv4.ip_forward                 = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF

sudo sysctl --system

3.3 生成并修改 containerd 配置

这里有两个关键点:

  • SystemdCgroup 改为 true
  • 把 pause 镜像地址改成国内镜像源
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml

sed -i 's#SystemdCgroup = false#SystemdCgroup = true#g' /etc/containerd/config.toml

sed -i 's#k8s.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
sed -i 's#registry.gcr.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml
sed -i 's#registry.k8s.io/pause#registry.cn-hangzhou.aliyuncs.com/google_containers/pause#g' /etc/containerd/config.toml

3.4 启动并验证 containerd

systemctl daemon-reload
systemctl enable --now containerd

验证时重点关注 overlayfscri 是否为 ok

ctr plugin ls

如果这两个核心插件状态正常,说明运行时层面已经具备继续安装 Kubernetes 的条件。

四、安装 kubeadm、kubelet 和 kubectl

4.1 配置 Kubernetes 软件源

cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
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

4.2 安装组件并启动 kubelet

yum install kubeadm-1.32.* kubelet-1.32.* kubectl-1.32.* -y
systemctl enable --now kubelet

可以用下面的命令确认版本:

kubeadm version

按原始环境示例,返回版本为 v1.32.2

五、初始化控制平面并把工作节点加入集群

5.1 预拉取镜像

kubeadm config images pull \
  --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  --kubernetes-version 1.32.2

5.2 在 master 节点执行初始化

kubeadm init \
  --apiserver-advertise-address 10.0.0.20 \
  --image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
  --cri-socket "unix:///var/run/containerd/containerd.sock" \
  --kubernetes-version 1.32.2

初始化完成后,按回显提示在 master 节点配置当前用户的 kubectl

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

5.3 在工作节点执行 join

kubeadm init 成功后会给出 kubeadm join 命令。实际使用时请以当前环境回显结果为准:

kubeadm join 10.0.0.20:6443 \
  --token <your-token> \
  --discovery-token-ca-cert-hash sha256:<your-ca-hash>

两台工作节点执行完成后,可以在控制平面节点检查节点状态:

kubectl get node

初始阶段如果显示 NotReady,通常是因为网络插件和相关 Addons 还没有部署完成。

六、安装 Addons 并验证集群可用性

原始笔记里使用的是 k8s-ha-install 仓库中的单节点安装清单:

git clone https://gitee.com/dukuan/k8s-ha-install.git
cd k8s-ha-install/
git checkout manual-installation-v1.32.x
cd single/
kubectl apply -f .

执行完成后,再次检查节点和系统 Pod:

kubectl get node
kubectl get po -A

如果你能看到 calicocorednsmetrics-serverkube-apiserverkube-controller-managerkube-scheduler 等核心组件正常运行,节点也从 NotReady 转为 Ready,说明基础集群已经成功搭建完成。

七、给集群补上可视化入口

完成基础搭建后,可以通过 Dashboard 或多集群管理平台进一步观察集群状态。

7.1 访问官方 Dashboard

先检查 Dashboard 暴露端口:

kubectl get svc -n kubernetes-dashboard

原始示例里 kubernetes-dashboard 通过 NodePort 暴露,端口为 32054。然后生成登录 Token:

kubectl create token admin-user -n kube-system --duration 365h

浏览器访问:

https://10.0.0.20:32054

进入登录页后选择 Token,粘贴上一步生成的 token 即可。

7.2 访问多集群管理平台

示例里还部署了一个 KRM 前端:

kubectl get svc -n krm

原始环境中暴露端口为 32443,可通过下面地址访问:

http://10.0.0.20:32443

示例账号密码均为 admin

八、这套快速部署流程的关键点是什么

如果把整个流程浓缩成几个最重要的检查项,可以重点记住下面几点:

  • 主机名、hosts、swap、SELinux 和防火墙要先处理好
  • containerdSystemdCgroup 要和 kubelet 运行方式一致
  • 内核模块和 sysctl 参数必须提前准备
  • kubeadm init 完成后要及时配置 kubectl
  • 节点从 NotReadyReady 往往取决于网络插件和系统 Addons 是否正确安装

走通这一遍之后,你就已经跨过了 Kubernetes 学习中最关键的一道门槛:从“知道概念”进入“能把集群真正拉起来”。