认证 Kubernetes 应用开发者(CKAD)学习指南(一、二)

发布于 作者: Benjamin Muschko

第一章:考试详情与资源

本章解答了准备顺利通过 Certified Kubernetes Application Developer(CKAD) 考试的考生最常提出的问题。后续章节将为你总结 Kubernetes 的优势与架构,并介绍如何使用 kubectl 与 Kubernetes 集群交互。

Kubernetes 认证学习路径

CNCF 提供了四种不同的 Kubernetes 认证。图 1-1 按目标受众对它们进行了分类。

kcad-1n2-1-1

图 1-1:Kubernetes 认证学习路径

助理级认证的目标受众是云计算和 Kubernetes 初学者。助理级认证考试采用多项选择题形式,不需要在交互式环境中操作 Kubernetes 集群。

从业者级认证面向具有既有 Kubernetes 经验的开发人员和管理员。此类考试要求你在多个 Kubernetes 环境中动手解决问题。你会发现 CKAD 面向应用开发者,不要求任何其他认证作为前置条件。

下面简要介绍每种认证,帮助你判断 CKAD 是否适合你。

Kubernetes and Cloud Native Associate(KCNA)

KCNA 是一项入门级认证,适合对云原生应用开发、运行时环境和工具感兴趣的任何人。虽然考试涵盖 Kubernetes,但不要求你动手操作集群。考试由多项选择题组成,适合希望对生态系统有广泛了解的考生。

Kubernetes and Cloud Native Security Associate(KCSA)

该认证侧重于安全概念的基础知识及其在 Kubernetes 集群中的应用。其广度、深度和形式与 KCNA 相当。

Certified Kubernetes Application Developer(CKAD)

CKAD 考试侧重于验证你在 Kubernetes 上构建、配置和部署基于微服务的应用的能力。你不需要真正实现一个应用;不过,该考试适合熟悉应用架构、运行时和编程语言等主题的开发人员。

Certified Kubernetes Administrator(CKA)

CKA 考试的目标受众是 DevOps 从业者、系统管理员和站点可靠性工程师。该考试测试你作为 Kubernetes 管理员的能力,包括集群、网络、存储以及初级安全管理等任务,重点强调故障排查场景。

Certified Kubernetes Security Specialist(CKS)

CKS 考试在 CKA 所验证的主题基础上进一步扩展。通过 CKA 是报名 CKS 的前置条件。该认证要求你具备更深入的 Kubernetes 安全知识,课程涵盖诸如容器化应用构建最佳实践以及确保 Kubernetes 运行时环境安全等主题。


考试目标

本书旨在帮助你为 CKAD 考试做好准备。在深入剖析与考试相关的重要主题之前,我会简要介绍 Kubernetes 对应用开发者的重要性。

越来越多的应用开发者正参与将单体架构迁移到小型、内聚、容器化的微服务的项目。两种方式各有利弊,但 Kubernetes 已成为部署和运行应用的事实标准运行时平台,使你无需关心底层物理基础设施。

部署和监控应用不再只是管理员或发布经理的专属职责。应用开发者需要将应用从开发贯穿到运维。像 Netflix 这样的组织深度践行这种文化,因此你作为应用开发者,需要对设计决策和生产环境中的问题修复全权负责。比以往任何时候都更重要的是理解 Kubernetes 的能力、正确应用相关概念,以及如何与平台交互。

该考试专为需要在 Kubernetes 上设计、构建、配置和管理云原生应用的应用开发者而设计。

考试使用的 Kubernetes 版本

在撰写本书时,考试基于 Kubernetes 1.28。本书的所有内容都遵循该版本的特性、API 和命令行支持。未来版本可能会破坏向后兼容性。在准备认证时,请查阅 Kubernetes 发布说明,并使用考试所采用的 Kubernetes 版本进行练习,以避免意外情况。考试环境将与 Kubernetes 发布后的最新小版本保持一致,通常在发布后约 4–8 周内更新。

课程大纲

以下概览列出了考试的高层模块(领域)及其评分权重:

  • 20%:应用设计与构建
  • 20%:应用部署
  • 15%:应用可观测性与维护
  • 25%:应用环境、配置与安全
  • 20%:服务与网络

接下来的章节将详细介绍每个领域。

应用设计与构建

该领域涵盖设计与构建容器化应用并在 Kubernetes 中运行。你需要熟悉基本的容器概念,以及如何在 Pod 中定义容器。此外,还包括更高级的用例和 Kubernetes 概念:在 Pod 中使用存储、在一个 Pod 中定义多个容器,以及如何定义并执行批处理和周期性工作负载

应用部署

该领域主要聚焦 Kubernetes 的 Deployment 原语。Deployment 有助于扩展具有相同定义的 Pod(即副本),并在其控制的所有副本之间管理配置。你需要理解部署管理,包括用于以受控方式滚动发布新版本的策略。最后,你还需要熟悉 Helm——一个用于管理部署和配置应用栈所需清单文件的开源工具。

应用可观测性与维护

将应用部署到 Kubernetes 只是第一步。你需要能够监控、检查并可能调试 Kubernetes 对象。探针(Probes) 是该领域的重要概念,用于为 Pod 中运行的应用定义健康检查。此外,你需要具备识别工作负载运行时问题并加以修复的能力。

应用环境、配置与安全

Kubernetes 为 Pod 提供了可配置的安全与资源管理特性,包括本领域涵盖的安全上下文资源需求/限制。此外,你需要展示使用 ConfigMapsSecrets 将配置数据注入 Pod 以控制其运行时行为的能力。该领域还涉及 基于角色的访问控制(RBAC)CustomResourceDefinitions(CRDs) 的基础概念与功能。

服务与网络

课程最后一个领域处理如何在集群内部和外部为应用提供网络访问。为此,你需要展示对 ServicesIngresses 的理解。最后,你还需要对网络策略有一个基本认识,它们本质上是允许或拒绝 Pod 之间通信的规则。

涉及的 Kubernetes 原语

部分考试目标可通过理解相关的核心 Kubernetes 原语来覆盖。请注意,考试会在一个问题中组合多个概念。请参考 图 1-2,了解适用的 Kubernetes 资源及其关系。

kcad-1n2-1-2

图 1-2:与考试相关的 Kubernetes 原语

文档

考试期间,你可以打开一组明确限定的网页作为参考。你可以自由浏览这些页面,并将代码复制粘贴到考试终端。官方 Kubernetes 文档包括参考手册、GitHub 站点和博客。此外,你还可以浏览 Helm 文档。

随手可查的 Kubernetes 文档非常有价值,但务必知道在这些页面中到哪里查找相关信息。备考期间,至少从头到尾阅读一遍所有文档页面。不要忘记官方文档页面的搜索功能。作为参考,附录 B 将考试目标映射到本书相关章节以及对应的 Kubernetes 文档页面。

高效使用文档

使用搜索词通常比通过菜单导航更快地找到正确的文档页面。将文档中的代码片段复制并粘贴到考试环境的控制台通常效果不错。但由于格式可能丢失,你可能需要手动调整 YAML 缩进

考试环境与建议

参加考试前,你需要购买一个注册代金券,可在 CNCF 培训与认证网页上获取。CNCF 有时会提供折扣(例如美国感恩节前后)。这些折扣通常会在 Linux Foundation 的 LinkedIn 页面和 Twitter 账号 @LF_Training 上公布。

购买代金券后,你可以通过 PSI(负责线上考试的公司)预约考试时间。不提供线下考试。在考试当天,你需要通过电子邮件中提供的 URL 登录测试平台,并启用电脑的音频和视频以防作弊。监考人员将通过音视频监督你的操作,如认为你违反规则,将终止考试。

考试次数

你购买的代金券提供两次考试机会。我建议在第一次考试前做好充分准备。这将增加通过概率,并帮助你熟悉考试环境和题目复杂度。如果第一次未通过,也无需过度担心——你还有一次免费的机会。

CKAD 的时间限制为 2 小时。在此期间,你需要在一个真实、预定义的 Kubernetes 集群上解决动手题目。每道题都会指明需要使用的集群。这种评估方式优于多项选择题,因为它能将知识直接转化为实际工作中的任务

我强烈建议阅读考试的 FAQ。其中包含大多数常见问题的答案,包括系统要求、评分方式、认证续期和重考要求等。

考生技能要求

该认证假定你对 Kubernetes 有基础理解,应熟悉 Kubernetes 内部机制、核心概念以及命令行工具 kubectl。CNCF 为 Kubernetes 初学者提供了一门免费的《Kubernetes 入门》课程。

你的背景很可能偏向应用开发者,但最熟悉哪种编程语言并不重要。以下是提高通过概率所需的背景知识概览:

Kubernetes 架构与概念

考试不会要求你从零安装 Kubernetes 集群。请学习 Kubernetes 的基础知识及其架构组件。可参考第 2 章快速入门。

kubectl CLI 工具

kubectl 是考试期间与 Kubernetes 集群交互的核心工具。即便准备时间有限,也必须练习 kubectl 的使用、命令及其选项。考试期间无法访问 Web 仪表盘 UI第 3 章总结了与 Kubernetes 集群交互的最重要方式。

容器运行时引擎的工作知识

Kubernetes 使用容器运行时引擎来管理镜像。Docker Engine 是一种广泛使用的运行时。至少需要理解容器文件、容器镜像、容器以及相关 CLI 命令。第 4 章解释了考试所需的全部容器知识。

其他相关工具

Kubernetes 对象以 YAML 或 JSON 表示。本书示例使用 YAML(更常见)。考试中你需要编辑 YAML 来声明式创建新对象或修改现有对象配置。请确保你熟悉基本的 YAML 语法、数据类型以及符合规范的缩进。如何编辑 YAML?当然是在终端中。考试环境预装了 vivim,请练习常用快捷键(尤其是如何退出编辑器)。最后要提到的是 GNU Bash,你必须理解该脚本语言的基本语法和操作符;有可能需要阅读、修改甚至扩展在容器中运行的多行 Bash 命令

时间管理

考生有 2 小时完成考试,且需要 66% 的正确率才能通过。许多问题包含多个步骤。虽然 Linux Foundation 未提供详细评分规则,但可以推测部分正确会获得相应分值。

考试的时间压力很大,这是有意为之。Linux Foundation 期望 Kubernetes 从业者能在有限时间内为真实场景找到解决方案。

考试题目类型多样:有的简短易解,有的需要更多上下文、耗时更长。我个人的策略是先解决容易的题目,尽可能快速得分,避免卡在难题上。对无法立即解决的问题,我会使用考试环境内置的记事功能进行标记。第二轮再回过头来尝试解决。理想情况下,你可以在规定时间内完成所有题目。

命令行技巧与窍门

既然命令行是你与 Kubernetes 集群的唯一接口,就必须对 kubectl 及其选项非常熟悉。本节提供了一些提升效率和生产力的技巧。

设置上下文与命名空间

考试环境中已为你配置了多个 Kubernetes 集群。请先查看说明,了解这些集群的高层技术概览。每道题都需要在指定集群上完成,并且通常要求在 default 以外的命名空间中操作。开始答题前,请首先设置上下文和命名空间。以下命令可一次性完成设置:

$ kubectl config set-context <context-of-question> \--namespace=<namespace-of-question>
$ kubectl config use-context <context-of-question>

关于上下文概念及相关 kubectl 命令的更详细讨论,请参阅第 188 页的“使用 kubectl 进行认证”。

使用 kubectl 的别名

考试过程中,你可能需要执行 几十甚至上百次 kubectl 命令。即便你打字很快,也没必要反复完整拼写命令。考试环境已为 kubectl 设置了别名 k

备考时,你也可以在本地设置相同的行为:

$ alias k=kubectl
$ k version

使用 kubectl 命令自动补全

记忆 kubectl 命令及其选项需要大量练习。考试环境默认启用了自动补全。你可以在 Kubernetes 文档中找到为本地 shell 设置自动补全的说明。

熟记资源的短名称

许多 kubectl 命令较长,例如管理 PersistentVolumeClaims 的命令是 persistentvolumeclaims。完整拼写既容易出错又耗时。幸运的是,很多长命令都有简写api-resources 命令会列出所有可用资源及其短名称:

$ kubectl api-resources
NAME                    SHORTNAMES  APIGROUP  NAMESPACED  KIND
...
persistentvolumeclaims  pvc                   true        PersistentVolumeClaim
...

使用 pvc 代替 persistentvolumeclaims 可以使命令更简洁、清晰

$ kubectl describe pvc my-claim

练习与模拟考试

通过考试离不开大量动手练习。为此,你需要一个可用的 Kubernetes 集群环境。以下选项值得考虑:

  • 使用 VagrantVirtualBox 运行一个或多个虚拟机,便于创建、启动和销毁隔离的 Kubernetes 环境。
  • 在本地开发机上安装一个简单的 Kubernetes 集群。官方文档根据操作系统提供了多种安装方式。Minikube 适合试验 Ingress 或存储类等高级特性,通过插件即可启用;你也可以尝试 kind,另一种运行本地 Kubernetes 集群的工具。
  • 如果你订阅了 O’Reilly Learning Platform,可以无限制访问运行 Kubernetes 沙箱环境的场景,并通过 CKAD 实践测试(交互式实验)检验你的知识。

你也可以尝试以下商业学习与练习资源:

  • Killer Shell:为所有 Kubernetes 认证提供样例练习的模拟器。购买考试代金券后,可获得两次免费使用机会。
  • 其他在线培训提供商提供包含集成 Kubernetes 练习环境的视频课程,例如 KodeKloudA Cloud Guru。需要购买订阅以单独访问每门课程内容。

第一章总结

该考试是一项完全动手的测试,要求你在多个 Kubernetes 集群中解决问题。你需要理解、使用并配置与应用开发者相关的 Kubernetes 原语。考试大纲将重点领域进行划分并赋予不同权重,决定其对总分的贡献。尽管这些领域分组合理,但大纲并不一定遵循自然的学习路径,因此在备考时交叉引用书中章节会很有帮助。

本章讨论了考试环境以及如何导航其中。通过考试的关键在于大量练习 kubectl,以解决真实世界的场景。第一部分接下来的两章将帮助你快速入门 Kubernetes。

所有详细讨论各领域的章节都提供了动手机会,并在章末附有示例练习。

第二章:Kubernetes 概览

如果你刚接触这一领域,快速了解 Kubernetes 是什么以及它如何工作 会很有帮助。网络上有许多教程和 101 课程,但本章将总结最重要的背景信息和核心概念。在本书的学习过程中,我们会多次引用集群节点组件,因此你可以随时回到本章查阅相关内容。

什么是 Kubernetes?

要理解 Kubernetes,首先需要定义微服务容器

微服务架构要求将应用栈的各个部分作为独立服务进行开发和运行,这些服务之间需要相互通信。如果你决定在容器中运行这些服务,就必须同时管理大量容器,并考虑诸如可扩展性、安全性、持久化和负载均衡等横切关注点。

buildkitPodman 这样的工具可以将软件制品打包为容器镜像Docker Enginecontainerd 等容器运行时引擎使用这些镜像来运行容器。这种方式非常适合在开发者机器上进行测试,或用于临时执行场景,例如作为持续集成流水线的一部分。关于容器的更多信息,请参阅第 4 章

Kubernetes 是一种容器编排工具,可帮助在物理机、虚拟机或云环境中运行和管理成百上千个容器。Kubernetes 也能满足前文提到的那些横切关注点。容器运行时引擎与 Kubernetes 集成:当触发容器创建时,Kubernetes 会将生命周期管理委派给容器运行时引擎。

Kubernetes 中最基本的原语是 Pod。Pod 可以运行一个或多个容器,并同时引入诸如安全要求资源消耗预期等横切关注点。相关内容可参见第 5 章

特性

前一节提及了 Kubernetes 提供的一些特性,这里将更详细地进行说明:

声明式模型

你不需要使用编程语言编写命令式代码来告诉 Kubernetes 如何运行应用。作为终端用户,你只需声明期望状态。该期望状态可通过符合 API 模式的 YAML 或 JSON 清单来定义。Kubernetes 会维护该状态,并在发生故障时进行恢复。

自动扩缩容

当应用负载增加时需要扩展资源,而当流量减少时需要缩减资源。在 Kubernetes 中,这可以通过手动或自动扩缩容来实现。最实用、最优化的方式是让 Kubernetes 自动扩展容器化应用所需的资源。

应用管理

应用的变更(例如新功能或缺陷修复)通常会被构建进带有新标签的容器镜像中。借助 Kubernetes 便捷的副本机制,你可以轻松将这些变更滚动发布到所有正在运行的容器。如有需要,当发现阻断性缺陷安全漏洞时,Kubernetes 也允许回滚到先前的应用版本。

持久化存储

容器只提供临时文件系统。容器重启后,写入文件系统的数据会丢失。根据应用的性质,你可能需要更长时间地保存数据,例如当应用与数据库交互时。Kubernetes 提供了为应用工作负载挂载存储的能力。

网络

为支持微服务架构,容器编排器需要允许容器之间以及集群外终端用户到容器的通信。Kubernetes 采用内部和外部负载均衡来路由网络流量。

高层架构

从架构上看,一个 Kubernetes 集群由控制平面节点工作节点组成,如 图 2-1 所示。每个节点运行在物理机、虚拟机或云上预配的基础设施之上。集群中节点的数量及其拓扑结构取决于应用的资源需求

kcad-1n2-2-1

图 2-1:Kubernetes 集群节点与组件

控制平面节点和工作节点各自承担不同的职责:

控制平面节点

该节点通过 API Server 暴露 Kubernetes API,并管理组成集群的各个节点。它还会响应集群事件,例如当终端用户请求增加 Pod 数量以分担应用负载时。生产级集群通常采用高可用(HA)架构,通常包含三个或更多控制平面节点。

工作节点

工作节点负责执行由 Pod 管理的、以容器形式运行的工作负载。每个工作节点的宿主机上都需要安装容器运行时引擎,以便管理容器。

接下来的两个小节将介绍这些节点中用于完成其职责的核心组件。诸如集群 DNS 之类的插件不会在此明确讨论,更多细节请参阅 Kubernetes 官方文档。

控制平面节点组件

控制平面节点需要一组特定组件来履行职责,以下列表给出了概览:

API Server

API Server 暴露客户端用于与 Kubernetes 集群通信的 API 端点。例如,当你执行命令行 Kubernetes 客户端 kubectl 时,其实现过程中会向 API Server 暴露的端点发起 RESTful API 调用。API Server 内部的处理流程会确保认证、授权和准入控制等方面。更多信息请参见第 17 章

Scheduler

Scheduler 是一个后台进程,负责监视尚未分配节点的新 Pod,并将其分配到某个工作节点上执行。

Controller Manager

Controller Manager 监视集群状态,并在需要时实施变更。例如,当你修改现有对象的配置时,Controller Manager 会尝试将该对象拉回到期望状态

Etcd

集群状态数据需要长期持久化,以便在节点甚至整个集群重启后能够恢复。这正是 etcd 的职责,它是 Kubernetes 集成的一个开源软件。从本质上看,etcd 是一个键值存储,用于持久化与 Kubernetes 集群相关的所有数据。

通用节点组件

Kubernetes 使用一些在所有节点上通用的组件,与节点的专门职责无关:

Kubelet

kubelet 运行在集群中的每个节点上,但在工作节点上最有意义。原因在于控制平面节点通常不执行工作负载,而工作节点的主要职责是运行工作负载。kubelet 是一个代理,确保 Pod 中所需的容器正在运行。可以说,kubelet 是 Kubernetes 与容器运行时引擎之间的粘合剂,确保容器运行且保持健康。我们将在第 14 章接触到 kubelet。

Kube Proxy

kube proxy 是运行在集群每个节点上的网络代理,用于维护网络规则并启用网络通信。在一定程度上,该组件负责实现第 21 章中介绍的 Service 概念。

容器运行时

如前所述,容器运行时是负责管理容器的软件。Kubernetes 可以配置为从多种不同的容器运行时引擎中进行选择。虽然可以在控制平面节点上安装容器运行时,但通常没有必要,因为控制平面节点一般不处理工作负载。我们将在第 4 章使用容器运行时来创建容器镜像并运行容器。

优势

本章指出了 Kubernetes 的若干优势,概括如下:

可移植性

容器运行时引擎可以独立于运行环境管理容器。容器镜像打包了运行所需的一切,包括应用的二进制文件或代码、依赖项以及配置。Kubernetes 可以在本地环境和云环境中运行容器化应用。作为管理员,你可以选择最适合自身需求的平台,而无需重写应用。许多云厂商提供产品特定的可选特性。虽然这些特性有助于运维,但需要注意,它们会降低你在平台之间自由切换的能力。

弹性

Kubernetes 被设计为一个声明式状态机。控制器是调和循环,它们监视集群状态,并在需要时进行或请求变更。目标是使当前集群状态不断逼近期望状态

可扩展性(Scalability)

企业级应用通常需要在大规模下运行。试想像 Amazon、Walmart 或 Target 这样的零售商,为支撑其业务需要运行多少软件组件。Kubernetes 可以根据需求扩展 Pod 数量,或根据资源消耗历史趋势自动扩展。

基于 API

Kubernetes 通过 API 暴露其功能。我们已经了解到,所有客户端都需要通过 API Server 与集群交互以管理对象。因此,实现一个新的客户端并向暴露的端点发起 RESTful API 调用非常容易。

可扩展性 (Extensibility)

API 的优势不止于此。有时 Kubernetes 的核心功能无法满足你的定制需求,但你可以为 Kubernetes 实现自己的扩展。借助特定的扩展点,社区可以根据需求构建定制功能,例如监控或日志解决方案。

第二章总结

Kubernetes 是一款用于大规模管理容器化应用的软件。每个 Kubernetes 集群至少包含一个控制平面节点一个工作节点。控制平面节点负责调度工作负载,并作为管理集群功能的单一入口点。工作节点负责处理由控制平面节点分配给它们的工作负载。

Kubernetes 是一个生产就绪的运行时环境,适用于希望运行微服务架构的企业,同时支持可扩展性、安全性、负载均衡和可扩展性等非功能性需求。

下一章将介绍如何使用命令行工具 kubectl 与 Kubernetes 集群交互。你将学习如何使用它来管理对象,这是顺利通过考试的一项关键技能。