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 作为容器运行时。以下是安装与配置步骤:

  1. 安装 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
  1. 配置 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 会自动生成证书、配置控制平面组件并启动集群。

  1. 拉取所需镜像:
sudo kubeadm config images pull --image-repository registry.k8s.io
  1. 执行初始化:
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 一致。
  1. 初始化成功输出示例:
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 交互。

单节点 Kubernetes 集群架构(kubeadm) 单节点 Kubernetes 集群架构(kubeadm) 单节点(All-in-One) 控制平面组件 kube-apiserver 端口 6443 kube-controller -manager kube-scheduler etcd 键值存储 工作负载区域 kubelet 节点代理 kube-proxy 网络代理 containerd 容器运行时 kubectl(客户端) API 请求

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)阻止调度。