一、CKA 考试到底是什么,值不值得考
CKA(Certified Kubernetes Administrator)是云原生领域认可度最高的 Kubernetes 管理员认证之一,由云原生计算基金会(CNCF)联合 Linux 基金会推出。考试全程在线实操,不考选择题,所有题目都要求在真实集群环境中用 kubectl 或 kubeadm 完成任务,比如部署应用、配置网络策略、排查故障、备份恢复 etcd 等。简单说,它就是检验你是否真的会“用” Kubernetes,而不是会不会背概念。
很多人问这个证含金量到底如何。我的看法是:CKA 不是“考完就能涨薪”的万能钥匙,但它是一块很硬的敲门砖。尤其对于运维工程师、SRE、平台工程师、以及刚转云原生的开发者来说,CKA 的备考过程本身就能帮你把 Kubernetes 的核心原理和日常操作彻底捋一遍。就算你已经在生产环境摸爬滚打过,考试中的很多场景(比如固定时间内的故障排查、集群初始化)依然能逼你补齐知识盲区。
这篇指南我尽量按“备考规划 + 知识点拆解 + 实战技巧 + 踩坑记录”来写,目标是让准备考 CKA 的人少走弯路,同时也让不打算考证的人把它当一份 Kubernetes 实操手册来用。文中命令和 YAML 都基于我实际练习过的场景,版本以当前主流环境为准。如果你正打算报考,或者已经在备考路上,这篇内容应该能帮你节省不少时间。
二、CKA 考试的核心信息与备考策略
2.1 考试形式与报名前必须知道的事
CKA 考试时长 2 小时,全程线上进行,需要摄像头监考。考试环境是一套独立的终端界面,左侧是题目列表,右侧是操作终端,终端里预装了 kubectl、kubeadm、kubelet 等工具,但集群需要你自己搭、自己修。考试过程中可以访问官方文档(kubernetes.io/docs),这一点非常关键,等于是开卷考,但开卷不代表简单,因为时间压力非常大。
报名之后,你会获得两次考试机会(一次正式 + 一次重考),有效期内可以预约时间。重考政策偶尔会有调整,建议报名前到官网确认最新条款。另外,考试对网络要求比较高,需要稳定的国际网络连接,这一点在报名前就要评估好,别考试中途掉线导致前功尽弃。正式考试前一定要做一次“模拟考试”,不是指刷题,而是指完整走一遍考场环境:测试摄像头、麦克风、网络、终端操作流畅度。
2.2 官方考纲五大板块与权重拆解
CKA 考纲(以当前最新版为准)分为五大域,每块权重不同,直接决定你的备考时间分配。
| 域 | 权重 | 核心考察点 |
|---|---|---|
| 集群架构、安装与配置 | 25% | kubeadm 初始化集群、kubeconfig 配置、证书管理、etcd 备份与恢复 |
| 工作负载 | 15% | Deployment、StatefulSet、DaemonSet、Job/CronJob、Pod 调度 |
| 服务与网络 | 20% | Service、Ingress、NetworkPolicy、DNS、ServiceAccount |
| 存储 | 10% | PV/PVC、StorageClass、持久化卷配置 |
| 故障排查 | 30% | 节点异常、Pod 异常、网络故障、etcd 故障、控制平面故障 |
权重只是参考,但很有指导意义。故障排查占比最大,这符合真实运维场景——出问题了你能不能快速定位。很多考生在集群安装和故障排查上耗时最多,因为这两块最容易出意外状况,比如网络插件装不上、节点 NotReady、etcd 备份失败等。所以备考初期就应该把重心放在这两块,不要只盯着 Deployment 怎么写。
2.3 备考时间规划:3 个月 vs 2 周冲刺
如果你有 3 个月,建议这样安排:前两个月系统学习,每天保证 1 到 1.5 小时,周末可以加码到 3 到 4 小时。学习顺序从基础概念开始,然后手动搭建一次集群,再逐个吃透工作负载、网络、存储、排障。第三个月进入冲刺阶段,每天至少刷 1 到 2 套模拟题,考前一周只做一件事:反复练习高频场景,把“看题 → 敲命令 → 验证结果”的流程练到肌肉记忆。
如果你只有 2 周,也不是完全没可能,但需要每天 3 到 4 小时高强度投入。此时不能再按部就班学概念了,建议直接刷高频场景,遇到不会的知识点再回头查文档、看示例。这个策略比较激进,适合已经有 Kubernetes 使用经验的人,纯新手不建议这么干。
我的个人建议是:无论时间多少,都要至少完整走一遍 kubeadm 搭建集群的过程。哪怕你平时都在用托管的 Kubernetes 服务,这一步能帮你理解控制平面、etcd、kubelet 之间的关系,对考试和实际工作都有不可替代的价值。
三、核心知识点逐项拆解(附实操命令)
3.1 集群安装与配置:kubeadm 是绝对主角
CKA 考试中,kubeadm 是你初始化集群的主要工具。考试环境会预装 kubeadm、kubelet、kubectl,但不会帮你把集群搭好,你需要自己在主节点上初始化,并把工作节点加入进来。
最经典的主节点初始化命令:
kubeadm init \ --pod-network-cidr=10.244.0.0/16 \ --apiserver-advertise-address=<主节点IP>初始化完成后,按提示执行以下命令,配置 kubeconfig:
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config然后安装 Pod 网络插件。以 Flannel 为例:
kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml工作节点加入命令可以在初始化结果末尾找到,也可以手动生成:
kubeadm token create --print-join-command这里面最容易出坑的是 Pod 网段 CIDR。Flannel 默认使用10.244.0.0/16,Calico 默认使用192.168.0.0/16,如果 CIDR 配置不一致,节点之间网络不通,kubectl get nodes会一直看到 NotReady。所以初始化之前,先确定要装哪个网络插件,再决定 CIDR。
还有一个常见问题是:初始化失败后,想重新初始化,必须先执行kubeadm reset,否则会报“port already in use”之类的错误。重置完之后,再清空旧的 CNI 配置(一般在/etc/cni/net.d目录),否则就算重新初始化成功,网络插件也可能不生效。
3.2 证书与 kubeconfig:上下文切换是基本功
考试中每一道题都会说明“你必须在某个 context 下操作”,比如kubectl config use-context k8s-cluster1。如果不切换上下文,你在第二个集群上做的操作会被记到第一个集群,那就等于白做。
常用命令:
# 查看当前上下文 kubectl config current-context # 查看所有上下文 kubectl config get-contexts # 切换上下文 kubectl config use-context <上下文名>除了切换,考试还可能让你为某个用户创建新的 context。这时候需要用到证书文件和 kubeconfig 的结构:
kubectl config set-cluster <集群名> --server=<API Server地址> --certificate-authority=<CA文件> kubectl config set-credentials <用户名> --client-certificate=<证书> --client-key=<私钥> kubectl config set-context <上下文名> --cluster=<集群名> --user=<用户名> kubectl config use-context <上下文名>注意,set-credentials和set-cluster只是修改 kubeconfig 文件里的条目,不会验证证书是否有效,所以生成后最好用kubectl --kubeconfig=<文件> auth whoami来验证身份是否可用。这一步在考试里虽然不常考,但真实排障时非常有用。
3.3 工作负载:Deployment、StatefulSet、DaemonSet、Job
工作负载这块占 15%,看似不多,但几乎每场考试都会考。最核心的是 Deployment,它的滚动更新、回滚、扩缩容、暂停/恢复必须非常熟练。
常用命令:
# 扩缩容 kubectl scale deployment <名称> --replicas=5 # 滚动更新镜像 kubectl set image deployment/<名称> <容器名>=<新镜像名>:<标签> # 查看滚动更新状态 kubectl rollout status deployment/<名称> # 回滚到上一个版本 kubectl rollout undo deployment/<名称> # 暂停/恢复滚动更新 kubectl rollout pause deployment/<名称> kubectl rollout resume deployment/<名称>StatefulSet 主要考稳定的网络标识和持久化存储。创建时要注意serviceName必须指向一个无头 Service(clusterIP: None),volumeClaimTemplates定义了每个 Pod 独占的 PVC。如果你发现 StatefulSet 的 Pod 一直不动,先检查无头 Service 是不是建了,再检查 PVC 是否绑定成功。
DaemonSet 的考点通常结合节点选择器(nodeSelector)和污点容忍(tolerations)。例如,要求只在带有node-type=worker标签的节点上运行,或者让 DaemonSet 忽略某个节点的污点。这类题需要你同时掌握kubectl label和 DaemonSet 的 YAML 字段。
Job 和 CronJob 相对简单,但常考一个细节:restartPolicy必须设置为OnFailure或Never,不能是Always,否则 Job 创建时会报错。CronJob 的调度语法就是 cron 表达式,比如*/5 * * * *表示每 5 分钟一次,注意和系统 cron 的区别——Kubernetes 的 CronJob 用的是标准 5 段式,但分钟在前,这个别搞混了。
3.4 服务与网络:Service、Ingress、NetworkPolicy
Service 是服务与网络域的绝对核心,考得最多的是三类:ClusterIP、NodePort、LoadBalancer。你必须清楚port、targetPort、nodePort的区别:port是 Service 的端口,targetPort是后端 Pod 的端口,nodePort是节点上暴露的端口(范围 30000-32767)。如果 selector 写错,Service 的 Endpoints 就会为空,访问自然不通。
检查 Service 后端是否就绪的命令:
kubectl get endpoints <service名>如果 Endpoints 下面没有 IP,说明 selector 没匹配到任何 Pod,这是最常踩的坑。
Ingress 考察的是 7 层路由规则。当前版本一般用networking.k8s.io/v1这个 API 版本。创建 Ingress 时,需要指定ingressClassName(如果是 ingress-nginx 等控制器),或者使用旧版的kubernetes.io/ingress.class注解。考试中常见的路径匹配有两种:Prefix和Exact。Prefix可以匹配子路径,Exact必须完全一致,这块很容易写错。
NetworkPolicy 是丢分高发区。记住一个原则:NetworkPolicy 默认拒绝未匹配到的流量,所以你在写规则时,先想清楚要放行哪些流量,再逆向补全规则。一个典型场景是“只允许来自特定标签 Pod 的流量访问数据库”,你需要写一个 ingress 规则,from 里放podSelector或namespaceSelector。写完规则后,用kubectl describe networkpolicy <名称>检查一下,确认 selectors 是否正确。另外要注意,NetworkPolicy 只在支持 CNI 网络策略的插件下生效,比如 Calico、Cilium,Flannel 默认不支持。
3.5 存储:PV、PVC、StorageClass 的绑定逻辑
存储只占 10%,但题目很直接,不绕弯子。难点在于理解 PV、PVC、StorageClass 三者之间的绑定关系。
- PV 是集群层面的存储资源,由管理员创建。
- PVC 是用户申请的存储请求。
- StorageClass 是动态供给的模板,PVC 可以通过
storageClassName指定 StorageClass,系统会自动创建 PV。
手工创建的 PV 要和 PVC 绑定,必须满足三个条件:storageClassName匹配(或者都为空并启用默认 StorageClass)、accessModes匹配(比如ReadWriteOnce和ReadOnlyMany不能混绑)、容量满足要求(PV 的容量要大于等于 PVC 请求的容量)。
考试中如果要你创建一个 PVC,然后让 Pod 使用它,注意 Pod 的 volumes 部分要写persistentVolumeClaim的claimName,而不是直接写 PV 名。很多人在这里踩坑,把 PV 名直接写在 Pod 里,导致创建失败。
3.6 故障排查:重头戏中的重头戏
故障排查占 30%,是决定你能否通过考试的关键。虽然题目场景千奇百怪,但底层思路是有套路的。
节点 NotReady 的排查顺序:
kubectl get nodes确认哪个节点异常。kubectl describe node <节点名>看 Conditions 和 Events。- 登录到异常节点,检查 kubelet 状态:
sudo systemctl status kubelet,如果没启动,看日志找原因。 - 检查容器运行时,比如 containerd 是否正常:
sudo systemctl status containerd。 - 检查网络插件是否就绪,比如看 CNI 配置目录是否存在、Pod 是否拉起来。
Pod 一直 Pending 的排查重点在kubectl describe pod <Pod名>的 Events 部分。常见原因:节点资源不足(CPU/内存不满足 requests)、节点有污点且 Pod 没有 toleration、节点亲和性/反亲和性不匹配、PVC 未绑定。如果你的 Pod 一直 Pending 且下面没有事件,大概率是调度条件不满足,这时候别慌,逐一排除。
Pod 一直 CrashLoopBackOff 的排查顺序:
kubectl logs <Pod名>看应用日志。- 检查退出码。退出码 137 一般是内存被杀掉(OOM),退出码 1 或 2 一般是启动命令错误。
- 检查启动探针(livenessProbe)和就绪探针(readinessProbe)配置是否合理,有时候应用启动慢但探针给的时间很短,就会反复重启。
Service 无法访问的排查顺序:
kubectl get svc <名称>确认 Service 存在。kubectl get endpoints <名称>确认后端 Pod 有 IP。kubectl describe svc <名称>看 selector 是否匹配到 Pod。- 从 Pod 内部访问 Service 的 ClusterIP 看是否通,第一步确认 kube-proxy 有没有问题。
etcd 备份与恢复也是高频考点。备份命令如下:
ETCDCTL_API=3 etcdctl \ --endpoints=<etcd端点> \ --cacert=/etc/kubernetes/pki/etcd/ca.crt \ --cert=/etc/kubernetes/pki/etcd/server.crt \ --key=/etc/kubernetes/pki/etcd/server.key \ snapshot save /tmp/etcd-backup.db恢复时先停止 API Server(通常通过移动静态 Pod 清单文件的方式),再执行:
ETCDCTL_API=3 etcdctl snapshot restore /tmp/etcd-backup.db \ --data-dir=/var/lib/etcd-restore然后把 etcd 的>kubectl run nginx --image=nginx --dry-run=client -o yaml > nginx-pod.yaml
这样生成出来的 YAML 是 API 官方结构的,比手写快得多,也少了缩进错误。
用
kubectl create deployment加--dry-run生成 Deployment 模板,再配合kubectl set image或kubectl scale调整。不要从零手写 Deployment,太浪费时间。用
kubectl explain检查字段含义。比如你不确定 Deployment 里strategy下有哪些字段,直接:
kubectl explain deployment.spec.strategy编辑文件时,
cat > 文件名.yaml << 'EOF'这种方式最不容易出错。不要用 vi,考试环境里没有 vim 插件,键盘操作不熟悉容易把人逼疯。nano 相对友好一点,但最简单的还是 EOF 方式,一次性把内容写进去。熟练使用
kubectl get的-o wide参数,可以看到 Pod 所在的节点、IP 等信息,这对排查网络问题很有用。学会快速验证:做完一道题后,用一条命令确认结果,比如
kubectl get pods -l <标签>或kubectl get svc。不要糊弄自己,考试里每道题的验证时间只有几秒钟,要练到条件反射。
4.3 官方文档的高效查法
考试允许访问 kubernetes.io/docs,但页面很多,如果不会查,很容易陷入“查文档 5 分钟,做题 30 秒”的困境。
我的经验是:优先用搜索框,输入英文关键词,比如 “ingress pathType”,第一个结果通常就是你要的。另外,收藏几个高频页面会有奇效:
- 任务(Tasks)下的 “Run applications” 部分,比如 “Scale the StatefulSet”、“Update API objects in place”。
- 概念(Concepts)下的 “Network Policies”、“Services”。
- 参考(Reference)下的 “kubectl cheat sheet”,这个页面讲了很多常用命令的速查,强烈建议考前过一眼。
不要试图背下所有 YAML 字段,那是低效的。知道“哪个操作查哪个页面”才是考试过关的关键。比如 NetworkPolicy 的写法你不需要记全,知道去搜 “networkpolicy” 然后照着示例改就行。
五、考场实战中的关键技巧和踩坑经验
5.1 时间分配与做题节奏
CKA 一共 2 小时,通常有 15 到 20 道题。平均每题只有 6 到 8 分钟,时间非常紧张。我的策略是:先快速浏览所有题目,遇到不会的或者看一眼没思路的直接跳过,先把会做的、分值高且把握大的做完。考试界面是按题计分的,所以先把稳拿的分拿满,最后再回头啃硬骨头。
有一个容易忽略的点:每道题里可能包含多个小任务。比如“创建一个 Deployment,并把它暴露为一个 NodePort Service”,如果你只完成了 Deployment,没建 Service,那这道题只能拿一半分。所以做题时要仔细读题干,按步骤拆解,做完一个 check 一个(用 kubectl get 验证),确保每个子任务都完成。
5.2 上下文切换是第一优先级
所有题目都会在题干里写明“你必须使用 k8s-cluster1 这个 context”。这句话不是废话,是操作前提。如果你懒得多敲一条kubectl config use-context命令,那么你后续的 kubectl 命令都作用在错误的集群上,结果自然是 0 分。
我自己的习惯是:每道题开始前,先看一眼题目的 context 要求,然后在终端执行一次 use-context。做完题之后,如果这道题涉及多个集群,再做下一题之前再切换一次。这看起来是重复劳动,但能避免最冤枉的失分。另外,有些题目要求你用kubectl config view --minify查看当前上下文信息,或者创建一个新的 kubeconfig 文件,这类题切不可偷懒直接修改默认 kubeconfig,因为后面的题目可能依赖默认配置。
5.3 不要忽略集群节点的具体情况
考试中你可能会遇到某个节点处于 NotReady 状态,但题目只要求你“修复集群”,并不告诉你具体原因。这时候你要学会“主动探查”:先kubectl get nodes,再kubectl describe node,然后登录对应节点,检查 kubelet、容器运行时、网络插件。
我踩过的坑是:一开始遇到节点 NotReady,我以为只要重启 kubelet 就行,结果发现是网络插件没装。重启之后节点依然 NotReady,直到我安装了 flannel 或 calico,才恢复正常。所以看到 NotReady,第一个念头不是“重启”,而是“看看 kubelet 和网络插件有没有就绪”。
5.4 验证结果的常用命令速查
做题不是写完 YAML 就结束了,一定要验证。下面这几条命令几乎每场考试都能用上:
# 查看 Pod 状态 kubectl get pods -o wide # 查看 Pod 详细信息 kubectl describe pod <名称> # 查看 Pod 日志 kubectl logs <名称> # 查看 Service Endpoints kubectl get endpoints <Service名> # 查看节点状态 kubectl get nodes # 查看集群事件 kubectl get events --sort-by=.lastTimestamp小技巧:kubectl get events用来排查“为什么这个 Pod 没创建出来”非常有效,因为 Events 会列出调度失败、拉镜像失败、探针失败等具体原因。如果你在 describe 里看不到想找的信息,就去 events 里翻。
5.5 避免在 YAML 的缩进和引号上浪费时间
YAML 对缩进极其敏感,一个空格错位就可能导致整个文件解析失败。考试时最容易因为缩进问题浪费 3 到 5 分钟,所以推荐用kubectl run/create ... --dry-run=client -o yaml生成初始模板,然后只改关键字段,不要大幅手写。
如果你的 YAML 写好了但 apply 失败,先别慌,用kubectl apply --dry-run=client -f file.yaml做一次本地校验。它会告诉你语法错误还是字段错误,避免你把错误配置提交到集群里再改。
还有一个小套路:如果你不确定某个字段的写法,用kubectl explain看定义,不要靠猜。举例来说,某个资源中strategy的 type 是 RollingUpdate 还是 Recreate,看一眼 explain 就知道了,完全没必要背。
六、常见问题与避坑清单
6.1 高频问题救急
| 问题 | 排查思路 | 答案 / 规避方式 |
|---|---|---|
| 节点 NotReady,kubelet 起不来 | 看 kubelet 日志,检查容器运行时 | 确认 containerd 或 docker 正常,再启动 kubelet |
| Pod 一直 Pending | 看 describe 的 Events | 检查节点污点、资源、PV/PVC |
| Pod 反复重启 | 看日志和退出码 | 调整探针超时时间,或检查启动命令 |
| Service 不通 | 按顺序查 Service → Endpoints → Pod | 先确认 selector 匹配,再查 kube-proxy |
| etcd 备份失败 | 看证书、端点、环境变量 | 确认 ETCDCTL_API=3 以及证书路径正确 |
| kubeadm init 报端口占用 | kubeadm reset后重试 | 或者检查 6443、10250 端口是否被占用 |
6.2 我自己的血泪教训
第一个教训:练习时不要跳过kubeadm reset这一步。很多人以为初始化失败之后直接重新 init 就行,实际上不 reset 的话,之前的配置会残留,导致各种莫名其妙的错误。每次练习完一轮,就主动把环境清干净,再重新搭。
第二个教训:不要忽略namespace。考试中很多资源默认创建在 default 命名空间,但有的题目要求创建在特定 namespace 下,比如 kube-system、ingress-nginx。如果你忘了带-n <namespace>参数,创建出来的资源就在 default 里,结果自然是 0 分。所以提笔写命令前,先确认这道题涉及的命名空间是什么。
第三个教训:做 NetworkPolicy 题的时候,我一开始习惯性把所有流量都拒掉,结果应用访问完全瘫痪。后来我总结了一个套路:先画一个简单的逻辑图,标注“谁访问谁、从哪个端口进”,再照着逻辑写规则,这样基本不会漏放行或过度放行。
6.3 关于考试心态的最后一点
CKA 是一门实操型考试,它考察的既是知识,也是临场状态。我在模拟考的时候遇到过节点网络崩溃、etcd 数据丢失等极端场景,几乎心态崩了,但冷静下来按部就班去排查,最后还是能恢复。考试里遇到不会做的题,先跳过,把会做的做对,比在一道难题上死磕更划算。
如果你按照这个指南把基础概念、kubeadm 集群搭建、工作负载、网络、存储、排障这六块都练熟了,考试通过率会非常高。最后再分享一个小经验:考前一周,我每天都会花 20 分钟默写常用命令和常见 YAML 片段,不是为了背,而是为了让手筋先热起来。真正进入考场后,你会发现大部分操作都是在靠肌肉记忆完成,而不是现想。祝你顺利拿下 CKA。