一、先明确实验环境和搭建目标¶
本文示例使用 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
验证时重点关注 overlayfs 和 cri 是否为 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
如果你能看到 calico、coredns、metrics-server、kube-apiserver、kube-controller-manager、kube-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 和防火墙要先处理好
containerd的SystemdCgroup要和 kubelet 运行方式一致- 内核模块和
sysctl参数必须提前准备 kubeadm init完成后要及时配置kubectl- 节点从
NotReady到Ready往往取决于网络插件和系统 Addons 是否正确安装
走通这一遍之后,你就已经跨过了 Kubernetes 学习中最关键的一道门槛:从“知道概念”进入“能把集群真正拉起来”。