CKA 类考场环境部署教程¶
目标¶
这篇教程的目标不是搭一个生产集群,而是搭一个足够接近 CKA 训练环境的实验集群,让你可以稳定练下面这些内容:
kubectl基础操作- Deployment / Service / PVC / RBAC / NetworkPolicy
- 节点维护
kubeadm初始化、加入、升级思路- 典型故障排查
这套环境的设计原则是:
- 尽量接近 CKA 常见操作路径
- 尽量使用原生命令
- 尽量方便反复重建
推荐方案¶
如果你是为了练 CKA,我推荐你用下面这套最小方案:
1台 control plane2台 worker- 系统使用
Ubuntu 24.04 LTS - 容器运行时使用
containerd - 集群安装方式使用
kubeadm - CNI 使用
Calico
这套方案的优点是:
- 足够覆盖大多数 CKA 题型
- 安装路径标准
- 后续练
drain、调度、RBAC、网络、排障都方便
环境拓扑¶
建议至少准备 3 台虚拟机:
| 角色 | 主机名 | 建议配置 |
|---|---|---|
| control plane | cp1 | 2 vCPU / 4 GB RAM / 40 GB Disk |
| worker | worker1 | 2 vCPU / 4 GB RAM / 40 GB Disk |
| worker | worker2 | 2 vCPU / 4 GB RAM / 40 GB Disk |
建议分配固定 IP:
| 主机名 | IP |
|---|---|
cp1 | 192.168.56.10 |
worker1 | 192.168.56.11 |
worker2 | 192.168.56.12 |
宿主机怎么选¶
你可以任选一种方式:
- VMware Fusion / Workstation
- VirtualBox
- UTM
- Multipass
- 云主机
如果只是本地训练,优先推荐:
- macOS:
UTM或VMware Fusion - Windows:
VMware Workstation或VirtualBox - Linux:
KVM/libvirt
所有节点通用初始化¶
下面这些步骤,cp1、worker1、worker2 都要执行。
1. 设置主机名¶
分别在对应节点执行:
sudo hostnamectl set-hostname cp1
sudo hostnamectl set-hostname worker1
sudo hostnamectl set-hostname worker2
2. 配置 hosts¶
三台机器都写:
cat <<'EOF' | sudo tee -a /etc/hosts
192.168.56.10 cp1
192.168.56.11 worker1
192.168.56.12 worker2
EOF
3. 关闭 swap¶
4. 加载内核模块¶
cat <<'EOF' | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
sudo modprobe overlay
sudo modprobe br_netfilter
5. 配置内核参数¶
cat <<'EOF' | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sudo sysctl --system
6. 安装基础工具¶
sudo apt-get update
sudo apt-get install -y curl wget vim git bash-completion apt-transport-https ca-certificates gpg
中国大陆网络环境下的镜像准备¶
如果你在中国大陆网络环境里直接安装这套 CKA 集群,最容易卡死的地方通常不是 kubeadm 命令本身,而是镜像拉取。
默认情况下,你后面会依赖这些镜像源:
registry.k8s.iodocker.ioquay.ioghcr.io
这些源在中国大陆经常会遇到:
- 解析慢
- TLS 建连慢
- 下载中断
- 某些镜像完全拉不下来
所以正确思路不是“先安装,装失败再看”,而是:
先准备可控镜像源,再开始装集群。
推荐思路¶
我建议你采用下面这套方式:
这样做的原因很直接:
- GitHub Actions 跑在海外网络环境里,拉取
registry.k8s.io和docker.io更容易 - 腾讯云 TCR 在国内,后续你的家庭实验室节点拉镜像更稳
- 以后集群重建时,不需要再次依赖海外镜像源
你至少要提前准备哪些镜像¶
建议先同步下面这些:
Kubernetes 基础镜像¶
registry.k8s.io/kube-apiserver:v1.34.0registry.k8s.io/kube-controller-manager:v1.34.0registry.k8s.io/kube-scheduler:v1.34.0registry.k8s.io/kube-proxy:v1.34.0registry.k8s.io/pause:3.10registry.k8s.io/etcd:*registry.k8s.io/coredns/coredns:*
网络插件镜像¶
如果你使用 Calico:
docker.io/calico/cni:*docker.io/calico/node:*docker.io/calico/kube-controllers:*
可观测性镜像¶
registry.k8s.io/metrics-server/metrics-server:*
CKA 常用练习镜像¶
docker.io/library/nginx:*docker.io/library/busybox:*docker.io/library/redis:*
腾讯云 TCR 仓库建议¶
建议提前在腾讯云 TCR 里规划目录,不要所有镜像都堆到一个地方。
例如:
ccr.ccs.tencentyun.com/your-team/k8s/*
ccr.ccs.tencentyun.com/your-team/calico/*
ccr.ccs.tencentyun.com/your-team/base/*
GitHub Actions 自动同步方案¶
这是我最推荐你采用的方式。
准备 GitHub Secrets¶
在 GitHub 仓库里准备:
TCR_REGISTRYTCR_USERNAMETCR_PASSWORD
例如:
工作流文件¶
在仓库中创建:
内容如下:
name: Sync Images To TCR
on:
workflow_dispatch:
schedule:
- cron: "0 2 * * *"
jobs:
sync:
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
image:
- source: registry.k8s.io/pause:3.10
target: ccr.ccs.tencentyun.com/your-team/k8s/pause:3.10
- source: registry.k8s.io/coredns/coredns:v1.12.0
target: ccr.ccs.tencentyun.com/your-team/k8s/coredns:v1.12.0
- source: docker.io/library/nginx:1.27
target: ccr.ccs.tencentyun.com/your-team/base/nginx:1.27
- source: docker.io/library/busybox:1.36
target: ccr.ccs.tencentyun.com/your-team/base/busybox:1.36
steps:
- name: Install skopeo
run: |
sudo apt-get update
sudo apt-get install -y skopeo
- name: Copy image to TCR
env:
SRC_IMAGE: ${{ matrix.image.source }}
DEST_IMAGE: ${{ matrix.image.target }}
TCR_USERNAME: ${{ secrets.TCR_USERNAME }}
TCR_PASSWORD: ${{ secrets.TCR_PASSWORD }}
run: |
skopeo copy \
--src-tls-verify=true \
--dest-tls-verify=true \
--dest-creds "${TCR_USERNAME}:${TCR_PASSWORD}" \
docker://${SRC_IMAGE} \
docker://${DEST_IMAGE}
关键说明¶
注意 1:固定版本,不要用 latest¶
例如:
v1.34.01.36v3.30.3
这样你后面集群重建时结果才可重复。
注意 2:优先用 skopeo copy¶
这比 docker pull + docker tag + docker push 更适合做 registry 到 registry 的同步。
注意 3:GitHub Actions 更像“海外同步节点”¶
它的核心价值不是替代仓库,而是:
- 帮你从海外拉镜像
- 帮你把镜像放到腾讯云 TCR
真正给你家庭集群稳定供镜像的,仍然是 TCR。
如果你暂时不做 GitHub Actions¶
那也至少要先准备一个思路:
- 手工从海外网络拉镜像
- 重命名后推到 TCR
但从长期维护看,GitHub Actions 更省心。
让 containerd 优先走你的 TCR¶
镜像同步好之后,建议让家庭实验室节点优先从 TCR 拉。
docker.io 示例¶
创建:
内容示例:
server = "https://registry-1.docker.io"
[host."https://ccr.ccs.tencentyun.com"]
capabilities = ["pull", "resolve"]
registry.k8s.io 示例¶
创建:
内容示例:
server = "https://registry.k8s.io"
[host."https://ccr.ccs.tencentyun.com"]
capabilities = ["pull", "resolve"]
改完后重启 containerd¶
验证镜像拉取¶
sudo ctr -n k8s.io images pull ccr.ccs.tencentyun.com/your-team/base/nginx:1.27
sudo ctr -n k8s.io images pull ccr.ccs.tencentyun.com/your-team/k8s/pause:3.10
让 kubeadm 使用你的镜像仓库¶
如果你直接安装集群,建议把 kubeadm 也改成优先使用你自己的镜像仓库。
先看默认镜像¶
用配置文件初始化¶
创建:
apiVersion: kubeadm.k8s.io/v1beta4
kind: ClusterConfiguration
kubernetesVersion: v1.34.0
imageRepository: ccr.ccs.tencentyun.com/your-team/k8s
networking:
podSubnet: 192.168.0.0/16
然后:
关键说明¶
注意 4:imageRepository 只解决 kubeadm 核心镜像¶
它不会自动解决你后面业务镜像、Calico、Nginx、Busybox 的问题。
所以你仍然需要:
- TCR 同步业务镜像
- containerd 侧镜像拉取策略
推荐安装顺序¶
如果你在中国大陆环境里装 CKA 集群,我建议按下面顺序做:
- 先准备腾讯云 TCR 仓库
- 再准备 GitHub Actions 自动同步海外镜像
- 再配置家庭节点 containerd 拉取策略
- 再执行
kubeadm init - 再安装 Calico、Metrics Server
- 最后再开始做 Deployment / Service / RBAC / PVC 的训练
常见问题¶
1. kubeadm init 卡在拉镜像¶
先查:
- 你的 TCR 是否有对应镜像
imageRepository是否写对- containerd 是否已重启
2. nginx / busybox 这类练习镜像拉不下来¶
说明:
- 你只处理了
kubeadm镜像 - 还没有处理业务镜像源
3. GitHub Actions 能同步,但家里节点拉取失败¶
先查:
- TCR 地址是否写对
- 节点是否能访问 TCR
- containerd
hosts.toml是否生效
4. 镜像同步后版本对不上¶
通常是因为用了:
latest- 浮动 tag
不要这么做,训练环境一定要固定版本。
安装 containerd¶
三台节点都执行。
1. 安装 containerd¶
2. 生成默认配置¶
sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null
3. 打开 systemd cgroup¶
4. 重启 containerd¶
sudo systemctl restart containerd
sudo systemctl enable containerd
sudo systemctl status containerd --no-pager
安装 kubeadm / kubelet / kubectl¶
三台节点都执行。
1. 添加 Kubernetes 软件源¶
sudo mkdir -p /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/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.34/deb/ /' | \
sudo tee /etc/apt/sources.list.d/kubernetes.list
2. 安装组件¶
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl
3. 验证版本¶
初始化 control plane¶
下面这些步骤只在 cp1 上执行。
1. 初始化集群¶
2. 配置 kubectl¶
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown "$(id -u)":"$(id -g)" $HOME/.kube/config
3. 检查节点状态¶
如果这里看到 NotReady,是正常的,因为 CNI 还没安装。
安装 CNI¶
建议你用 Calico,因为:
- 文档多
- 稳定
- 后续方便练 NetworkPolicy
在 cp1 执行:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/calico.yaml
然后检查:
加入 worker 节点¶
1. 在 control plane 获取 join 命令¶
在 cp1 执行:
会输出类似:
2. 在 worker1 和 worker2 执行 join¶
把刚才输出的命令原样贴过去执行。
3. 回到 control plane 检查¶
正常结果应该是:
cp1Readyworker1Readyworker2Ready
安装 Metrics Server¶
这一步不是集群初始化必须,但非常建议装,因为后续经常会练:
kubectl top nodeskubectl top pods
在 cp1 执行:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
如果你的实验环境里 kubelet 证书校验有问题,可以这样处理:
给容器参数补:
然后验证:
把环境做得更像考场¶
严格来说,你的练习环境不会和真实考试环境完全一样,但你可以主动把使用习惯拉近。
建议做的 6 件事¶
1. 只用终端¶
训练时尽量不要依赖图形化工具。
2. 优先用原生命令¶
少依赖 IDE 自动补全,多练:
3. 把 alias 固定下来¶
4. 多准备几个 context¶
你可以复制 kubeconfig,模拟多集群切换:
5. 至少保留 2 个 worker¶
因为很多题目必须多节点才有训练价值,例如:
draincordon- 调度与反亲和
- DaemonSet
6. 主动造故障¶
不要只练创建资源,还要练修复资源。
例如可以主动制造:
- selector 错误的 Service
- Pending 的 PVC
- 错误镜像的 Deployment
- 错误探针的 Pod
- taint 未容忍的调度失败
部署后立刻做的 10 个验证¶
1. 看节点¶
2. 看系统 Pod¶
3. 跑一个 Deployment¶
4. 暴露一个 Service¶
5. 用临时 Pod 测试 DNS¶
6. 测试 Service 连通性¶
7. 测试 PVC¶
确认你的存储方案或默认存储类可用。
8. 测试 kubectl top¶
9. 测试 drain¶
10. 测试 RBAC¶
创建一个 ServiceAccount,再用 kubectl auth can-i 验证权限。
建议保留的快照点¶
如果你用的是本地虚拟机,建议打 3 个快照:
基础系统初始化完成kubeadm 集群安装完成Metrics Server + Calico 正常
这样你练坏了之后,不需要每次从零重装。
常见问题¶
kubeadm init 失败¶
优先检查:
- swap 是否关闭
- containerd 是否正常
- 内核参数是否生效
- 端口是否被占用
节点一直 NotReady¶
优先检查:
- CNI 是否装好
- kubelet 是否正常
- 节点网络是否互通
kubectl top 没数据¶
大概率是:
- Metrics Server 没装
- Metrics Server 没 Ready
- kubelet 证书校验导致采集失败
Pod 能起但 Service 不通¶
先看:
- Service selector
- Endpoints
- Pod 是否 Ready
- 端口是否对上
这套环境适合练什么¶
后续建议¶
如果你愿意继续往下做,我建议下一步补这两类内容:
- 在这套环境里如何批量造题
- 如何把这套环境做成可反复重置的练习场
这样你后面就不只是“有环境”,而是真正拥有一个可持续训练的 CKA 实验场。