跳转至

CKA 类考场环境部署教程

目标

这篇教程的目标不是搭一个生产集群,而是搭一个足够接近 CKA 训练环境的实验集群,让你可以稳定练下面这些内容:

  • kubectl 基础操作
  • Deployment / Service / PVC / RBAC / NetworkPolicy
  • 节点维护
  • kubeadm 初始化、加入、升级思路
  • 典型故障排查

这套环境的设计原则是:

  • 尽量接近 CKA 常见操作路径
  • 尽量使用原生命令
  • 尽量方便反复重建

推荐方案

如果你是为了练 CKA,我推荐你用下面这套最小方案:

  • 1 台 control plane
  • 2 台 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:UTMVMware Fusion
  • Windows:VMware WorkstationVirtualBox
  • Linux:KVM/libvirt

所有节点通用初始化

下面这些步骤,cp1worker1worker2 都要执行。

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

sudo swapoff -a
sudo sed -i.bak '/ swap / s/^/#/' /etc/fstab

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.io
  • docker.io
  • quay.io
  • ghcr.io

这些源在中国大陆经常会遇到:

  • 解析慢
  • TLS 建连慢
  • 下载中断
  • 某些镜像完全拉不下来

所以正确思路不是“先安装,装失败再看”,而是:

先准备可控镜像源,再开始装集群。

推荐思路

我建议你采用下面这套方式:

GitHub Actions
  -> 拉海外镜像
  -> 推送到腾讯云 TCR
  -> 家里 K8s 节点统一从 TCR 拉取

这样做的原因很直接:

  • GitHub Actions 跑在海外网络环境里,拉取 registry.k8s.iodocker.io 更容易
  • 腾讯云 TCR 在国内,后续你的家庭实验室节点拉镜像更稳
  • 以后集群重建时,不需要再次依赖海外镜像源

你至少要提前准备哪些镜像

建议先同步下面这些:

Kubernetes 基础镜像

  • registry.k8s.io/kube-apiserver:v1.34.0
  • registry.k8s.io/kube-controller-manager:v1.34.0
  • registry.k8s.io/kube-scheduler:v1.34.0
  • registry.k8s.io/kube-proxy:v1.34.0
  • registry.k8s.io/pause:3.10
  • registry.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_REGISTRY
  • TCR_USERNAME
  • TCR_PASSWORD

例如:

TCR_REGISTRY=ccr.ccs.tencentyun.com
TCR_USERNAME=1000xxxxxx
TCR_PASSWORD=your-tcr-password

工作流文件

在仓库中创建:

.github/workflows/sync-images.yml

内容如下:

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.0
  • 1.36
  • v3.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 示例

创建:

/etc/containerd/certs.d/docker.io/hosts.toml

内容示例:

server = "https://registry-1.docker.io"

[host."https://ccr.ccs.tencentyun.com"]
  capabilities = ["pull", "resolve"]

registry.k8s.io 示例

创建:

/etc/containerd/certs.d/registry.k8s.io/hosts.toml

内容示例:

server = "https://registry.k8s.io"

[host."https://ccr.ccs.tencentyun.com"]
  capabilities = ["pull", "resolve"]

改完后重启 containerd

sudo systemctl restart 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 也改成优先使用你自己的镜像仓库。

先看默认镜像

kubeadm config images list --kubernetes-version v1.34.0

用配置文件初始化

创建:

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

然后:

sudo kubeadm init --config kubeadm-config.yaml

关键说明

注意 4:imageRepository 只解决 kubeadm 核心镜像

它不会自动解决你后面业务镜像、Calico、Nginx、Busybox 的问题。

所以你仍然需要:

  • TCR 同步业务镜像
  • containerd 侧镜像拉取策略

推荐安装顺序

如果你在中国大陆环境里装 CKA 集群,我建议按下面顺序做:

  1. 先准备腾讯云 TCR 仓库
  2. 再准备 GitHub Actions 自动同步海外镜像
  3. 再配置家庭节点 containerd 拉取策略
  4. 再执行 kubeadm init
  5. 再安装 Calico、Metrics Server
  6. 最后再开始做 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

sudo apt-get update
sudo apt-get install -y containerd

2. 生成默认配置

sudo mkdir -p /etc/containerd
containerd config default | sudo tee /etc/containerd/config.toml >/dev/null

3. 打开 systemd cgroup

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

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. 验证版本

kubeadm version
kubelet --version
kubectl version --client

初始化 control plane

下面这些步骤只在 cp1 上执行。

1. 初始化集群

sudo kubeadm init \
  --apiserver-advertise-address=192.168.56.10 \
  --pod-network-cidr=192.168.0.0/16

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. 检查节点状态

kubectl get nodes

如果这里看到 NotReady,是正常的,因为 CNI 还没安装。

安装 CNI

建议你用 Calico,因为:

  • 文档多
  • 稳定
  • 后续方便练 NetworkPolicy

cp1 执行:

kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.30.3/manifests/calico.yaml

然后检查:

kubectl get pods -A
kubectl get nodes

加入 worker 节点

1. 在 control plane 获取 join 命令

cp1 执行:

kubeadm token create --print-join-command

会输出类似:

sudo kubeadm join 192.168.56.10:6443 --token <token> \
  --discovery-token-ca-cert-hash sha256:<hash>

2. 在 worker1worker2 执行 join

把刚才输出的命令原样贴过去执行。

3. 回到 control plane 检查

kubectl get nodes

正常结果应该是:

  • cp1 Ready
  • worker1 Ready
  • worker2 Ready

安装 Metrics Server

这一步不是集群初始化必须,但非常建议装,因为后续经常会练:

  • kubectl top nodes
  • kubectl top pods

cp1 执行:

kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

如果你的实验环境里 kubelet 证书校验有问题,可以这样处理:

kubectl -n kube-system edit deployment metrics-server

给容器参数补:

- --kubelet-insecure-tls

然后验证:

kubectl top nodes
kubectl top pods -A

把环境做得更像考场

严格来说,你的练习环境不会和真实考试环境完全一样,但你可以主动把使用习惯拉近。

建议做的 6 件事

1. 只用终端

训练时尽量不要依赖图形化工具。

2. 优先用原生命令

少依赖 IDE 自动补全,多练:

kubectl create ... --dry-run=client -o yaml

3. 把 alias 固定下来

echo "alias k=kubectl" >> ~/.bashrc
echo "complete -o default -F __start_kubectl k" >> ~/.bashrc

4. 多准备几个 context

你可以复制 kubeconfig,模拟多集群切换:

kubectl config get-contexts
kubectl config use-context <context-name>

5. 至少保留 2 个 worker

因为很多题目必须多节点才有训练价值,例如:

  • drain
  • cordon
  • 调度与反亲和
  • DaemonSet

6. 主动造故障

不要只练创建资源,还要练修复资源。

例如可以主动制造:

  • selector 错误的 Service
  • Pending 的 PVC
  • 错误镜像的 Deployment
  • 错误探针的 Pod
  • taint 未容忍的调度失败

部署后立刻做的 10 个验证

1. 看节点

kubectl get nodes -o wide

2. 看系统 Pod

kubectl get pods -A

3. 跑一个 Deployment

kubectl create deployment nginx --image=nginx
kubectl get pods

4. 暴露一个 Service

kubectl expose deployment nginx --port=80 --target-port=80
kubectl get svc,endpoints

5. 用临时 Pod 测试 DNS

kubectl run tmp --image=busybox:1.36 -it --rm --restart=Never -- sh
nslookup kubernetes.default

6. 测试 Service 连通性

wget -qO- http://nginx

7. 测试 PVC

确认你的存储方案或默认存储类可用。

8. 测试 kubectl top

kubectl top nodes
kubectl top pods -A

9. 测试 drain

kubectl drain worker1 --ignore-daemonsets --delete-emptydir-data --force
kubectl uncordon worker1

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
  • 端口是否对上

这套环境适合练什么

后续建议

如果你愿意继续往下做,我建议下一步补这两类内容:

  1. 在这套环境里如何批量造题
  2. 如何把这套环境做成可反复重置的练习场

这样你后面就不只是“有环境”,而是真正拥有一个可持续训练的 CKA 实验场。