3. 安装 Kubernetes 集群:使用 kubeadm 搭建单节点集群、配置 kubectl、验证集群状态
在部署 Gatekeeper 之前,必须拥有一个功能完整的 Kubernetes 集群。本章将指导你使用 kubeadm 在单台 Linux 服务器上搭建一个单节点集群(All-in-One),并完成 kubectl 的配置与集群状态验证。该环境适用于 Gatekeeper 的冷启动性能测试与功能验证。
3.1 环境准备与前置检查
在开始安装前,请确保目标节点满足以下最低要求。单节点集群将控制平面与工作负载运行在同一台机器上。
| 检查项 | 最低要求 | 推荐配置(性能测试) |
|---|---|---|
| 操作系统 | Ubuntu 22.04 LTS / CentOS 7.9+ | Ubuntu 22.04 LTS |
| CPU | 2 核 | 4 核 |
| 内存 | 4 GB | 8 GB |
| 磁盘 | 40 GB | 100 GB (SSD) |
| 容器运行时 | containerd 1.6+ | containerd 1.7+ |
| 网络 | 节点间互通,可访问 gcr.io | 稳定的外网或镜像仓库 |
⚠️ 重要提示: 请确保已关闭 swap 分区(
sudo swapoff -a 并注释 /etc/fstab 中的 swap 条目),并加载必要的内核模块(overlay、br_netfilter)。这是 kubeadm 初始化成功的先决条件。
3.2 安装容器运行时(containerd)
Kubernetes 从 1.24 版本开始移除了对 Docker Engine 的直接支持,推荐使用 containerd 作为容器运行时。以下是安装与配置步骤:
- 安装 containerd:
# 安装依赖
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg
# 添加 Docker 官方 GPG 密钥和仓库
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y containerd.io
- 配置 containerd 使用 systemd cgroup 驱动:
# 生成默认配置
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml
# 修改配置:启用 SystemdCgroup
sudo sed -i 's/SystemdCgroup = false/SystemdCgroup = true/' /etc/containerd/config.toml
# 重启 containerd
sudo systemctl restart containerd
sudo systemctl enable containerd
3.3 安装 kubeadm、kubelet 与 kubectl
使用官方 Kubernetes 仓库安装这三个核心组件。版本需保持一致,本指南以 v1.28.0 为例。
# 添加 Kubernetes 仓库
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /' | sudo tee /etc/apt/sources.list.d/kubernetes.list
# 安装指定版本
sudo apt-get update
sudo apt-get install -y kubelet=1.28.0-1.1 kubeadm=1.28.0-1.1 kubectl=1.28.0-1.1
# 锁定版本,防止意外升级
sudo apt-mark hold kubelet kubeadm kubectl
3.4 使用 kubeadm 初始化单节点集群
初始化是搭建集群的核心步骤。kubeadm 会自动生成证书、配置控制平面组件并启动集群。
- 拉取所需镜像:
sudo kubeadm config images pull --image-repository registry.k8s.io
- 执行初始化:
sudo kubeadm init \
--pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.1.100 \
--kubernetes-version=v1.28.0
📌 参数说明:
--pod-network-cidr:Pod 网络 CIDR,必须与后续安装的 CNI 插件(如 Flannel)一致。--apiserver-advertise-address:本机 IP 地址,用于 API Server 监听。--kubernetes-version:指定版本,确保与安装的 kubeadm 一致。
- 初始化成功输出示例:
Your Kubernetes control-plane has been initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You can now join any number of worker nodes by running the following on each node:
kubeadm join 192.168.1.100:6443 -- <> --discovery--ca-cert-hash sha256:<hash>
3.5 配置 kubectl
kubectl 是管理集群的命令行工具。需要将管理员配置文件复制到用户目录下:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 验证配置
kubectl version --client
kubectl cluster-info
3.6 安装 Pod 网络插件(CNI)
单节点集群初始化后,所有节点处于 NotReady 状态,因为缺少 Pod 网络。本指南使用 Flannel 作为 CNI 插件。
# 应用 Flannel 网络插件
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 等待节点就绪(约 30-60 秒)
kubectl wait --for=condition=Ready node/$(hostname) --timeout=120s
3.7 验证集群状态
集群搭建完成后,必须执行以下验证步骤,确保所有组件正常运行,为后续 Gatekeeper 部署提供可靠基础。
| 验证命令 | 预期输出 | 验证目标 |
|---|---|---|
kubectl get nodes |
节点状态为 Ready |
节点健康 |
kubectl get pods -n kube-system |
所有 Pod 状态为 Running |
系统组件正常 |
kubectl get cs |
组件状态为 Healthy |
控制平面组件 |
kubectl run nginx --image=nginx |
Pod 创建成功并运行 | 工作负载调度 |
💡 性能测试前置检查: 在开始 Gatekeeper 冷启动测试前,建议执行
kubectl top nodes 记录基线资源使用情况,并确保集群 DNS(CoreDNS)Pod 处于 Running 状态。
3.8 单节点集群架构示意
下图展示了使用 kubeadm 搭建的单节点集群内部组件关系,以及 kubectl 如何与 API Server 交互。
3.9 常见问题与排错
- kubeadm init 失败: 检查
kubelet日志journalctl -u kubelet -f,确认 cgroup 驱动与 containerd 一致。 - 节点 NotReady: 确认 CNI 插件已安装,检查
kubectl describe node查看条件。 - kubectl 无法连接: 检查
$HOME/.kube/config文件权限和内容,确认 API Server 地址正确。 - Pod 一直 Pending: 检查节点资源是否充足,或是否有污点(Taints)阻止调度。