{"id":13526361,"url":"https://github.com/caicloud/kube-ladder","last_synced_at":"2025-05-15T06:03:06.316Z","repository":{"id":41371406,"uuid":"196912679","full_name":"caicloud/kube-ladder","owner":"caicloud","description":"Learning Kubernetes, The Chinese Taoist Way","archived":false,"fork":false,"pushed_at":"2022-11-28T06:39:21.000Z","size":1235,"stargazers_count":2541,"open_issues_count":6,"forks_count":522,"subscribers_count":105,"default_branch":"master","last_synced_at":"2025-05-15T06:02:42.760Z","etag":null,"topics":["handbook","kubernetes","tutorial"],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/caicloud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-15T02:51:11.000Z","updated_at":"2025-05-14T08:52:03.000Z","dependencies_parsed_at":"2022-07-19T01:02:27.648Z","dependency_job_id":null,"html_url":"https://github.com/caicloud/kube-ladder","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caicloud%2Fkube-ladder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caicloud%2Fkube-ladder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caicloud%2Fkube-ladder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/caicloud%2Fkube-ladder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/caicloud","download_url":"https://codeload.github.com/caicloud/kube-ladder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254283336,"owners_count":22045140,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["handbook","kubernetes","tutorial"],"created_at":"2024-08-01T06:01:28.524Z","updated_at":"2025-05-15T06:03:06.294Z","avatar_url":"https://github.com/caicloud.png","language":null,"funding_links":[],"categories":["Blog","文档","Others","Roadmap","Featured On","Tutorials \u0026 Learning"],"sub_categories":["Conference","[Tutorials](#tutorials)"],"readme":"\u003c!-- START doctoc generated TOC please keep comment here to allow auto update --\u003e\n\u003c!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE --\u003e\n**Table of Contents**  *generated with [DocToc](https://github.com/thlorenz/doctoc)*\n\n- [Kubernetes 学习路径](#kubernetes-%E5%AD%A6%E4%B9%A0%E8%B7%AF%E5%BE%84)\n  - [背景](#%E8%83%8C%E6%99%AF)\n  - [学习路径](#%E5%AD%A6%E4%B9%A0%E8%B7%AF%E5%BE%84)\n    - [第一阶段 炼气期（2-4 周，每周 3-5 小时）](#%E7%AC%AC%E4%B8%80%E9%98%B6%E6%AE%B5-%E7%82%BC%E6%B0%94%E6%9C%9F2-4-%E5%91%A8%E6%AF%8F%E5%91%A8-3-5-%E5%B0%8F%E6%97%B6)\n      - [目标](#%E7%9B%AE%E6%A0%87)\n      - [路径](#%E8%B7%AF%E5%BE%84)\n      - [心法](#%E5%BF%83%E6%B3%95)\n    - [第二阶段 筑基期（4-6 周，每周 8-10 小时）](#%E7%AC%AC%E4%BA%8C%E9%98%B6%E6%AE%B5-%E7%AD%91%E5%9F%BA%E6%9C%9F4-6-%E5%91%A8%E6%AF%8F%E5%91%A8-8-10-%E5%B0%8F%E6%97%B6)\n      - [目标](#%E7%9B%AE%E6%A0%87-1)\n      - [路径](#%E8%B7%AF%E5%BE%84-1)\n      - [心法](#%E5%BF%83%E6%B3%95-1)\n    - [第三阶段 金丹期（2-4 周，每周 3-5 小时）](#%E7%AC%AC%E4%B8%89%E9%98%B6%E6%AE%B5-%E9%87%91%E4%B8%B9%E6%9C%9F2-4-%E5%91%A8%E6%AF%8F%E5%91%A8-3-5-%E5%B0%8F%E6%97%B6)\n      - [目标](#%E7%9B%AE%E6%A0%87-2)\n      - [路径](#%E8%B7%AF%E5%BE%84-2)\n      - [心法](#%E5%BF%83%E6%B3%95-2)\n    - [第四阶段 元婴期（4-6 周，每周 8-10 小时）](#%E7%AC%AC%E5%9B%9B%E9%98%B6%E6%AE%B5-%E5%85%83%E5%A9%B4%E6%9C%9F4-6-%E5%91%A8%E6%AF%8F%E5%91%A8-8-10-%E5%B0%8F%E6%97%B6)\n      - [目标](#%E7%9B%AE%E6%A0%87-3)\n      - [路径](#%E8%B7%AF%E5%BE%84-3)\n      - [心法](#%E5%BF%83%E6%B3%95-3)\n    - [第五阶段 化神期（3-5 周，每周 6-8 小时）](#%E7%AC%AC%E4%BA%94%E9%98%B6%E6%AE%B5-%E5%8C%96%E7%A5%9E%E6%9C%9F3-5-%E5%91%A8%E6%AF%8F%E5%91%A8-6-8-%E5%B0%8F%E6%97%B6)\n      - [目标](#%E7%9B%AE%E6%A0%87-4)\n      - [路径](#%E8%B7%AF%E5%BE%84-4)\n      - [心法](#%E5%BF%83%E6%B3%95-4)\n    - [第六阶段 练虚期（4-6 周，每周 8-10 小时）](#%E7%AC%AC%E5%85%AD%E9%98%B6%E6%AE%B5-%E7%BB%83%E8%99%9A%E6%9C%9F4-6-%E5%91%A8%E6%AF%8F%E5%91%A8-8-10-%E5%B0%8F%E6%97%B6)\n      - [目标](#%E7%9B%AE%E6%A0%87-5)\n      - [路径](#%E8%B7%AF%E5%BE%84-5)\n      - [心法](#%E5%BF%83%E6%B3%95-5)\n    - [第七阶段 大乘期（终身学习）](#%E7%AC%AC%E4%B8%83%E9%98%B6%E6%AE%B5-%E5%A4%A7%E4%B9%98%E6%9C%9F%E7%BB%88%E8%BA%AB%E5%AD%A6%E4%B9%A0)\n      - [目标](#%E7%9B%AE%E6%A0%87-6)\n      - [路径](#%E8%B7%AF%E5%BE%84-6)\n      - [心法](#%E5%BF%83%E6%B3%95-6)\n  - [许可协议](#%E8%AE%B8%E5%8F%AF%E5%8D%8F%E8%AE%AE)\n\n\u003c!-- END doctoc generated TOC please keep comment here to allow auto update --\u003e\n\n# Kubernetes 学习路径\n\n## 背景\n\n**本文由 [才云科技（Caicloud）](https://caicloud.io/)  于 2019 年内部推出，现以开源的形式进行维护**\n\n目前云计算行业对于 [Kubernetes](https://kubernetes.io/) 学习的需求日益增加，但市面上关于 Kubernetes 的资源良莠不齐，存在几个问题：\n\n- 官方文档缺少明确的\"梯度\"，信息错综复杂\n- 资料较为分散，查找信息费时费力\n- Kubernetes 发展很快，书籍或者网上教程容易过时\n\n本文档旨在为广大从业者提供一个 Kubernetes 学习路径，为大家提供一定的指引。我们最终的目标是让所有人剥茧抽丝般地了解 Kubernetes，不仅仅知道怎么用 Kubernetes，还知道 Kubernetes 各个功能是如何设计的。在学习路径后期，我们还可以很\"自然\"的联想到正确的设计思路。\n\n## 学习路径\n\n**注意**：\n\n- 术语来自才云科技工程师 [gaocegege](https://github.com/gaocegege) 所著《[适合系统工程师的\"机器学习\"学习路径](https://github.com/caicloud/mlsys-ladder)》\n- 注意这是学习路径，不是一个教程！\n- 大多数概念都会给出官方链接，如果需要深入了解请自行查找！\n\n### 第一阶段 炼气期（2-4 周，每周 3-5 小时）\n\n#### 目标\n\n- Kubernetes 的背景\n- 安装 Kubernetes 环境\n- Kubernetes 基本概念和使用方法\n\n#### 路径\n\n学习任何系统的之前，了解其出现的背景和意义都是必不可少的，为什么会出现 Kubernetes？它解决了什么问题？有没有其他类似的系统？这里推荐阅读才云科技 CEO 张鑫在 2017 年文章《[从风口浪尖到十字路口，写在 Kubernetes 两周年之际](https://mp.weixin.qq.com/s/hrgXzt7YKVf6ZCFzJ-WTFA)》。\n\n接下来，在了解 Kubernetes 系统本质之前，我们需要对 Kubernetes 有一个较为\"感性\"的认识，打消对 Kubernetes 的畏难情绪。这里，我们推荐使用 [minikube](https://github.com/kubernetes/minikube) 或 [kind](https://github.com/kubernetes-sigs/kind) 部署一个本地环境，然后开始部署一个\"真实\"的应用（minikube 安装需要使用科学上网，或使用[“国内版” minikube](https://yq.aliyun.com/articles/221687)）。如果想一开始就挑战更高难度的安装方式（不推荐），可以使用 [kubeadm](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/) 或者手动部署所有组件。关于安装，可以参考文档 [lab1-installation](https://github.com/caicloud/kube-ladder/blob/master/tutorials/lab1-installation.md)。\n\n在安装好环境之后，可以开始动手实践最基本的 Kubernetes 概念。在第一阶段，我们推荐熟练使用以下常用资源和概念：Pod、Node、Label、Event、Service、Configmap \u0026 Secret、Deployment、Namespace。相关学习可以参考文档 [lab2-application-and-service](https://github.com/caicloud/kube-ladder/blob/master/tutorials/lab2-application-and-service.md)。\n\n（可选）仅完成上述内容可能还不足以让我们非常熟悉 Kubernetes 的基本概念，下面列出其他可以参考的资料，大家也可以按照自己的方式去搜索相关的资料：\n- 官方 Tutorial：[Learn Kubernetes Basics](https://kubernetes.io/docs/tutorials/kubernetes-basics/)\n- 官方 Guestbook 样例：[Guestbook Example](https://kubernetes.io/docs/tutorials/stateless-application/guestbook/)\n- [Kubernetes Tutorial for Beginners](https://spacelift.io/blog/kubernetes-tutorial)\n\n#### 心法\n\n\u003cp align=\"center\" style=\"font-size: 50px\"\u003e🤨\u003c/p\u003e\n\n- 请反复加深对上面资源的操作熟练度。如果你是第一次接触 Kubernetes，或者仅了解过一点 Kubernetes 的知识，那么基（ken）本（ding）是不明白 Kubernetes 底层到底发生了什么。请不要心急，姑且把它当成一个黑盒工具即可 🛠。\n- 你可能会在网上看到更多的概念，如 PVC、Ingress、Priority 等。炼气阶段，请不要尝试学习过多的资源类型。Kubernetes 有非常多的概念和类似的资源，我们这里熟悉最核心的概念即可，否则易走火入魔 👻，切记。当我们打通任督二脉之时，所有的新概念都不过尔尔。\n\n### 第二阶段 筑基期（4-6 周，每周 8-10 小时）\n\n#### 目标\n\n- Kubernetes 的基本架构\n- Kubernetes 容器调度的基本流程\n\n#### 路径\n\n短暂接触 Kubernetes 概念之后，我们需要知其然并且知其所以然，因此在第二阶段我们开始学习 Kubernetes 基本架构。学习 Kubernetes 基本架构至少需要了解以下内容：\n\n- Master \u0026 Node\n  - 知道什么是 Kubernetes Master，什么是 [Node](https://kubernetes.io/docs/concepts/architecture/nodes/)\n  - 知道两者的关系，知道它们是如何通信的\n- Master 组件\n  - API Server。Kubernetes 如何接收请求，又是如何将结果返回至客户端。\n  - [Etcd](https://etcd.io/docs)。了解 Etcd 主要功能机制。\n  - Controller Manager。Kubernetes 控制器是其架构中最为核心的一环，我们需要了解控制器的原理，List-Watch 的基本原理，知道 Kubernetes 默认情况下大致包含哪些类型的控制器。\n  - [Scheduler](https://kubernetes.io/docs/concepts/scheduling/kube-scheduler/)。熟悉 Kubernetes 的调度流程是怎样的，调度器在整个调度流程中的角色。\n- Node 组件\n  - Kubelet。知道 Kubelet 是如何接受调度请求并启动容器的。\n  - Kube-proxy。了解 Kube-proxy 的作用，提供的能力是什么。\n  - Container Runtime。了解都有哪些 Container Runtime，主要了解 [Docker](https://docs.docker.com/) 一些基本操作与实现原理。\n- 核心 Addons \u0026 Plugins\n  - DNS。DNS 为集群的服务发现提供的支持，Kubernetes 1.13 开始默认使用 [CoreDNS](https://coredns.io/)。\n  - Network Plugin。Kubernetes 多节点环境需要部署网络插件才可以使用，默认情况下使用 [flannel](https://github.com/coreos/flannel) 即可。\n\n首先可以阅读书籍或网上博客，推荐阅读：\n\n- 官方文档：[Kubernetes Components](https://kubernetes.io/docs/concepts/overview/components/)\n- feisky 的博客：[Kubernetes 指南之核心原理](https://kubernetes.feisky.xyz/concepts/index)\n- kubectl run 的背后流程（难）：[What happens when I type kubectl run?](https://github.com/jamiehannaford/what-happens-when-k8s)\n- kubectl run 的背后流程中文版：[kubectl 创建 Pod 背后到底发生了什么？](https://mp.weixin.qq.com/s/ctdvbasKE-vpLRxDJjwVMw)\n\n接下来，推荐从 0 开始部署一个 Kubernetes 集群（不使用任何工具），来加深对各个组件的理解：解决部署中出现的各种问题，查看组件启动日志等等。如果时间有限，也可以尝试使用 kubeadm 等工具来部署集群。目前 Kubernetes 集群部署自动化已经做得比较完善，但出于学习目的，再次墙裂推荐手动安装。关于手动安装集群，可以参考文档 [lab3-manual-installtion](https://github.com/caicloud/kube-ladder/blob/master/tutorials/lab3-manual-installtion.md)。\n\n在本阶段修炼结束后，我们至少应该对以下问题了如指掌：Kubernetes 组件是如何交互，来启动容器，并对外提供服务的？\n\n#### 心法\n\n\u003cp align=\"center\" style=\"font-size: 50px\"\u003e💪\u003c/p\u003e\n\n- 请不要死记硬背 Kubernetes 架构，要开动大脑 🧠去理解其背后设计的原因。\n- 筑基期是比较困难的一个阶段，如果感觉一头雾水，请不要气馁，你不是一个人。当你感觉进入了瓶颈时，可以尝试寻找身边的战友，总结一些你的问题并寻求答案 🍻。\n\n### 第三阶段 金丹期（2-4 周，每周 3-5 小时）\n\n#### 目标\n\n- Kubernetes API 结构\n- 熟悉 Kubernetes 各个子系统\n- 熟悉 Kubernetes 排错相关内容\n\n#### 路径\n\n当我们可以熟练使用 Kubernetes 的基本资源，并且对 Kubernetes 的基本架构有了充足了认识，接下来需要对 Kubernetes 的 API 结构和子系统要有一个比较全面的认识，同时也要开始更加系统的了解排查问题相关的内容。\n\n要知道 [Kubernetes API](https://kubernetes.io/docs/concepts/overview/kubernetes-api/) 是其最引以为傲的设计，掌握 API 的关键是需要了解：\n\n- Kubernetes 的 API 是如何控制版本的\n- Kubernetes 的 API 是如何分组的\n- [Kubernetes 对象](https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/)的表示方法与设计理念\n- [Kubernetes API 的访问控制](https://kubernetes.io/docs/reference/access-authn-authz/controlling-access/)\n\n我们可以通过浏览 [Kubernetes API](https://github.com/kubernetes/api) 代码仓库来了解 Kubernetes API 组（Group）的信息。所有的资源定义代码都遵循 `\u003cgroup\u003e/\u003cversion\u003e/types.go` 的规范，例如上述 Deployment 资源是定义在 [apps group](https://github.com/kubernetes/api/tree/master/apps) 中。我们可以在 [apps/v1/types.go](https://github.com/kubernetes/api/blob/master/apps/v1/types.go) 中查找到关于 Deployment 的定义。\n\n接下来，我们可以通过浏览 [Kubernetes/Community](https://github.com/kubernetes/community) 代码仓库来了解各个兴趣小组（SIG），\"SIG\" 是 Special Interest Group 的简称。Kubernetes 的演进都是通过 SIG 来推动的，因此了解 SIG 的分工对我们理解 Kubernetes 非常重要。一般来讲，一个 SIG 对应着一个 Kubernetes 子系统，例如，[sig-apps](https://github.com/kubernetes/community/tree/master/sig-apps) 负责决定是否引入新的 API，或者现有 API 是否需要升级等等。我们通过查看 Community 中带有 \"sig-\" 前缀的目录来了解 SIG 的工作内容、会议纪要等等。这里简单列举 Kubernetes 重要的子系统：\n\n- 架构 Architecture\n- 应用 Apps\n- 存储 Storage\n- 网络 Network\n- 权限 Auth\n- 节点 Node\n- 调度 Scheduling\n- 命令行 CLI\n- 多集群 MultiCluster\n- 云平台 CloudProvider\n- 扩展性 Scalability\n- 弹性伸缩 Autoscaling\n- 监控日志 Instrumentation\n\n（可选）细心的你可能会发现以 \"wg-\" 开头的目录，例如 \"wg-resource-management\"。\"wg\" 是 working group 的简称，是针对需要涉及多个 SIG 之间合作而展开的一种工作组，独立于任何 SIG 。例如 resource management 会涉及到 Node、Storage、Scheduling 等 SIGs。\n\n作为一个承上启下的阶段，我们需要总结一些 Kubernetes 排错的能力，推荐阅读：\n\n- 官方文档：[Kubernetes Troubleshooting](https://kubernetes.io/docs/tasks/debug-application-cluster/troubleshooting/)\n- feisky 的博客：[Kubernetes 集群排错指南](https://feisky.gitbooks.io/kubernetes/troubleshooting/)\n\n#### 心法\n\n\u003cp align=\"center\" style=\"font-size: 50px\"\u003e🌱\u003c/p\u003e\n\n- 本阶段的重点是\"耳听六路 :see_no_evil: 眼观八方 :hear_no_evil:\"。前两个阶段接触到了很多 Kubernetes 的细节，本阶段需要对 Kubernetes 的全貌有个更加清晰的认识。很多内容可能看不太懂，但请在你的心中埋下一颗种子。\n\n### 第四阶段 元婴期（4-6 周，每周 8-10 小时）\n\n#### 目标\n\n- 加深对各个资源的理解\n- 学习更多 Kubernetes 概念和知识\n\n#### 路径\n\n不出意外，你现在对 Kubernetes 基本的资源已经很熟练了，对 Kubernetes 内部组件和它们的交互比较清晰，还对 Kubernetes 的 API 全貌和组织结构也有一定的了解。如果出了意外 🤔，请重新回顾你的学习过程。\n\n本阶段，我们围绕几个关键方向来学习 Kubernetes，加深对其各个技术点的认识（这里只列出本阶段需要学习的核心能力，其他功能请量力而学）：\n\n- 计算\n  - [Pod Lifecycle \u0026 Healthcheck \u0026 RestartPolicy](https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/)\n  - [Pod Init-Container](https://kubernetes.io/docs/concepts/workloads/pods/init-containers/)\n  - [Horizontal Pod Autoscaler (HPA)](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/)\n  - 更多控制器：[Job](https://kubernetes.io/docs/concepts/workloads/controllers/jobs-run-to-completion/)、[CronJob](https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/)、[Daemonset](https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/)、[StatefulSet](https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/)、[ReplicaSet](https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/)\n\n- 网络\n  - [Service](https://kubernetes.io/docs/concepts/services-networking/service/) 实现，主要了解 [iptables](https://linux.die.net/man/8/iptables) 的实现（可选：[ipvs](https://kubernetes.io/blog/2018/07/09/ipvs-based-in-cluster-load-balancing-deep-dive/) 模式）\n  - [Ingress](https://kubernetes.io/docs/concepts/services-networking/ingress/) 原理和常用的 [nginx ingress](https://github.com/kubernetes/ingress-nginx) 操作\n  - [DNS](https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/) 服务的原理，以及 [CoreDNS](https://coredns.io/) 方案\n\n- 存储\n  - [Volume](https://kubernetes.io/docs/concepts/storage/volumes/) 以及底层存储类型\n  - [PV/PVC](https://kubernetes.io/docs/concepts/storage/persistent-volumes/)、[StorageClass](https://kubernetes.io/docs/concepts/storage/storage-classes/)\n\n- 安全\n  - [AuthN](https://kubernetes.io/docs/reference/access-authn-authz/authentication/), [AuthZ](https://kubernetes.io/docs/reference/access-authn-authz/authorization/) \u0026 [Admission Control](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/)\n  - [NetworkPolicy](https://kubernetes.io/docs/concepts/services-networking/network-policies/)\n  - [ServiceAccount](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/)\n  - [Pod/Container SecurityContext](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/)\n  - [Pod Security Policy (PSP)](https://kubernetes.io/docs/concepts/policy/pod-security-policy/)\n\n- 调度\n  - [Pod/Node Affinity \u0026 Anti-affinity](https://kubernetes.io/docs/concepts/configuration/assign-pod-node/#affinity-and-anti-affinity)\n  - [Taint \u0026 Toleration](https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/)\n  - [Priority \u0026 Preemption](https://kubernetes.io/docs/concepts/configuration/pod-priority-preemption/)\n  - [Pod Disruption Budget](https://kubernetes.io/docs/concepts/workloads/pods/disruptions/)\n\n总结一下，1）本阶段我们接触到更多的资源，包括：HPA、Job、CronJob、DaemonSet、StatefulSet、Ingress、Volume、PV/PVC、StorageClass、NetworkPolicy、PSP。2）更加深入了解已学资源的使用，例如 Init-Container、SecurityContext、Affinity 等。这些能力最终都会体现在各个资源的 API 上，例如 Affinity 是 Pod API 结构的一个字段，Scheduler 通过解析这个字段来进行合理的调度。未来如果有更多的能力，我们都可以通过解读不同资源的 API 字段来一探究竟。\n\n本阶段相关学习可以参考文档 [lab4](https://github.com/caicloud/kube-ladder/blob/master/tutorials/lab4-concepts.md)。\n\n#### 心法\n\n\u003cp align=\"center\" style=\"font-size: 50px\"\u003e🧘‍♂️🧘‍♀️\u003c/p\u003e\n\n- 本阶段难度指数高，请合理调整你的心境。渡劫 :volcano: 成功后，你对 Kubernetes 的掌握将会进入一个新的台（tian）阶（keng）。\n- 学习相关功能时，可以回顾其所在 SIG，看看能不能发现有用的资源。\n\n### 第五阶段 化神期（3-5 周，每周 6-8 小时）\n\n#### 目标\n\n- 学习更多 Kubernetes 集群层面的功能\n- 更加深入学习 Kubernetes 架构和组件能力\n\n#### 路径\n\n当我们了解了 Kubernetes API 的设计理念，学习到了足够多的 API 资源及其使用方法之后，让我们再回顾一下 Kubernetes Master \u0026 Node 架构，以及它们运行的组件。事实上，Kubernetes 的每个组件都有很强的可配置性和能力，我们可以围绕 Kubernetes 的每个组件，来学习 Kubernetes 较为“隐晦”的功能。\n\n推荐通过 Kubernetes Command Line Reference 来了解这些组件的配置：\n- [kube-api-server](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-apiserver/)\n- [kube-scheduler](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-scheduler/)\n- [kube-controller-manager](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/)\n- [kube-proxy](https://kubernetes.io/docs/reference/command-line-tools-reference/kube-proxy/)\n- [kubelet](https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet/)\n- [kubectl](https://kubernetes.io/docs/reference/kubectl/kubectl/)\n\n同时，Kubernetes 提供了 [FeatureGate](https://kubernetes.io/docs/reference/command-line-tools-reference/feature-gates/) 来控制不同的特性开关，我们可以通过 FeatureGate 来了解 Kubernetes 的新特性。此外，为了方便开发者和配置管理，Kubernetes 把所有配置都挪到了相对应的 GitHub 代码仓库中，即：\n- https://github.com/kubernetes/kube-scheduler\n- https://github.com/kubernetes/kube-controller-manager\n- https://github.com/kubernetes/kube-proxy\n- https://github.com/kubernetes/kubelet\n- https://github.com/kubernetes/kubectl\n\n当然，直接裸看配置有点硬核。为方便入手，下面我们简单总结部分功能（笼统的分为 Master 和 Node）：\n\n*Master*\n\n- [Dynamic Admission Control](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/)\n  - 动态准入控制（在练虚期阶段需要更加深入的了解）\n  - 对应 API Server `--admission-control-config-file` 参数\n- [Advanced Auditing](https://kubernetes.io/docs/tasks/debug-application-cluster/audit)\n  - 提供可动态配置的审计功能\n  - 对应 API Server 带有 `--audit-` 前缀的参数\n- [Etcd Configuration](https://github.com/etcd-io/etcd/blob/master/Documentation/op-guide/configuration.md)\n  - 提供各种与 Etcd 相关的配置，例如 Kubernetes event TTL\n  - 对应 API Server 带有 `--etcd-` 前缀的参数\n- [All Admission Controllers](https://kubernetes.io/docs/reference/access-authn-authz/admission-controllers/)\n  - 列举所有 Kubernetes 所支持的 Admission Controllers，每个 Admission 都与 Kubernetes 特定的功能相关联\n  - 对应 API Server `--enable-admission-plugins` 参数，该参数注释列举了所有的默认 Admission Controllers\n- [Garbage Collection](https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/)\n  - 启用后，Kubernetes 会自动根据 `OwnerReferences` 来回收 API 资源\n  - 对应 Controller-Manager `--enable-garbage-collector` 参数\n- Concurrent Sync Limiting\n  - 避免过多的资源同步导致集群资源的消耗\n  - 对应 Controller-Manager 带有 `--concurrent` 前缀的参数\n- All Controllers\n  - 列举所有 Kubernetes 所支持的 Controllers，每个 Controller 都与 Kubernetes 特定的功能相关联\n  - 对应 Controller-Manager `--controllers`，该参数注释列举了所有的默认 Controllers\n\n其它值得注意的参数包括：\n- API-Server `--max-requests-inflight`, `--min-request-timeout`\n- API-Server `--watch-cache`, `--watch-cache-sizes`\n- Controller-Manager `--node-eviction-rate`\n- Controller-Manager `--pod-eviction-timeout`\n- Controller-Manager `--terminated-pod-gc-threshold`\n- Controller-Manager `--pv-recycler-minimum-timeout-*`\n\n*Node*\n\n- [Kubelet Eviction](https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/)\n  - 当节点资源不足时，Kubernetes 通过驱逐 Pods 的方式确保节点的稳定性\n  - 对应 Kubelet 带有 `--eviction-` 前缀的参数，例如 `--eviction-hard`\n- [Image GC](https://kubernetes.io/docs/concepts/cluster-administration/kubelet-garbage-collection/)\n  - 清理容器镜像占用的磁盘空间\n  - 对应 Kubelet 带有 `--image-gc-` 前缀的参数，以及 `--minimum-image-ttl-duration` 等参数\n- [Resource Reserve](https://kubernetes.io/docs/tasks/administer-cluster/reserve-compute-resources/)\n  - 为系统资源预留一定的资源，确保节点的稳定性\n  - 对应 Kubelet `--kube-reserved`、`--kube-reserved-cgroup` 等参数\n- [CPU Manager](https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/)\n  - 提供更多的 CPU 管理能力，例如静态 CPU 亲和性\n  - 对应 Kubelet `--cpu-manager-*` 前缀的参数\n- [Storage Limit](https://kubernetes.io/docs/concepts/storage/storage-limits)\n  - 避免节点过度挂载数据卷\n  - 对应 FeatureGate `AttachVolumeLimit`\n\n其它值得注意的参数包括：\n- Kubelet \u0026 Kubeproxy `--hostname-override`\n- Kubelet `--cgroups-per-qos`\n- Kubelet `--fail-swap-on`\n- Kubelet `--host-*`\n- Kubelet `--max-pods`, `--pods-per-core`\n- Kubelet `--resolv-conf`\n- Kubeproxy `--nodeport-addresses`\n\n#### 心法\n\n\u003cp align=\"center\" style=\"font-size: 50px\"\u003e😇\u003c/p\u003e\n\n- 通过组件配置学习 Kubernetes 功能是我们需要具备的一个常规能力，或许比较枯燥，但对我们的修炼大有裨益。\n- 如果你对 Kubernetes “无穷无尽”的功能感到有点迷茫，这是一个很正常的现象。除非是深度参与 Kubernetes 的开发，否则一定会有很多遗漏的地方。我们只要保持两个基本点不动摇：1. 懂 Kubernetes 架构和最核心的能力；2. 懂得怎么快速定位我们需要的能力。关于第二点，我们将在大乘期介绍，stay tuned！\n\n### 第六阶段 练虚期（4-6 周，每周 8-10 小时）\n\n#### 目标\n\n- 对 Kubernetes 的扩展机制了如指掌\n- 可以编写 Kubernetes 控制器，能够基于扩展机制灵活地二次开发\n\n#### 路径\n\n本阶段我们可以开始了解 Kubernetes [各种扩展机制](https://kubernetes.io/docs/concepts/extend-kubernetes/extend-cluster/)。如果说 Kubernetes 的 API 和架构设计是其重要的基石，那么扩展机制使得 Kubernetes 在各个生态领域开花结果。下面我们尝试列举出所有的扩展方式，每一种扩展都有其优势和局限性，请自行思考。注意这里提到的扩展机制指的是架构上的扩展，而非功能层面的扩展，例如 Pod 支持各种 Probe 来进行健康检查，包括自定义，这里我们不归为扩展机制的能力。\n\n*API 资源扩展能力*\n\n- [Annotation](https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/)：保存少量非结构化第三方数据\n- [Finalizer](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/#finalizers)：资源删除时，用户调用外部系统的钩子\n- [CustomResourceDefinition](https://kubernetes.io/docs/tasks/access-kubernetes-api/custom-resources/custom-resource-definitions/)：自定义 Kubernetes API\n- [API Aggregation](https://kubernetes.io/docs/concepts/extend-kubernetes/api-extension/apiserver-aggregation/)：多个 API Server 聚合，适用于较大量的 API 定制\n\n学习 API 资源扩展的一个重要方式是创建一个扩展资源，或者编写一个自己的控制器。强烈推荐自行编写一个控制器，这里列出几个常见的工具：\n\n- [kubebuilder](https://book.kubebuilder.io/)：来自 Kubernetes 官方的 API 扩展项目\n- [sample-controller](https://github.com/kubernetes/sample-controller)：来自 Kubernetes 官方的一个样例\n- [operator-sdk](https://github.com/operator-framework/operator-sdk)：来自红帽的一个 operator 库\n- [shell-operator](https://github.com/flant/shell-operator)：适合运维开发使用的 shell operator 库\n- [meta-controller](https://metacontroller.app/)：来自 Google 的一个更加\"傻瓜\"式编写控制器的库\n\n*API 访问扩展能力*\n\n- [认证 Webhook](https://kubernetes.io/docs/reference/access-authn-authz/authentication/#webhook-token-authentication)：用户认证时，调用外部服务，仅支持静态配置\n- [鉴权 Webhook](https://kubernetes.io/docs/reference/access-authn-authz/webhook/)：用户鉴权时，调用外部服务，仅支持静态配置\n- [动态访问控制 Webhook](https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/)：请求访问控制时，调用外部服务，支持动态增加外部服务\n\nKubernetes API 访问扩展主要是通过 Webhook 来实现。注意只有访问控制支持动态增加外部服务，认证鉴权的外部服务在启动 API Server 的时候就注册完毕，无法在后续增加，主要原因是动态增加外部认证鉴权服务，带来的安全风险过大。\n\n*调度器扩展能力*\n\n- [扩展接口（Scheduler Extender）](https://github.com/kubernetes/community/blob/master/contributors/design-proposals/scheduling/scheduler_extender.md)：类似 Webhook，调用外部服务进行调度决策\n- [多调度器](https://kubernetes.io/docs/tasks/administer-cluster/configure-multiple-schedulers/)：支持在 Kubernetes 运行多个调度器调度不同作业\n- [调度器框架](https://kubernetes.io/docs/concepts/configuration/scheduling-framework/)：定义一套 Go API，使用户无需 fork Kubernetes Scheduler 代码即可完成“代码级”的定制\n\n针对简单场景，我们可以直接使用 Scheduler Extender 即可，例如按 GPU 型号调度。复杂调度场景可以使用多调度器或调度器框架，例如基于流图的调度器 [poseidon](https://kubernetes.io/docs/concepts/extend-kubernetes/poseidon-firmament-alternate-scheduler/)，批处理调取器 [kube-batch](https://github.com/kubernetes-sigs/kube-batch) 等。一般而言，使用 Extender 即可满足大多数场景。\n\n*网络扩展能力*\n\n- [网络插件 CNI](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/)：使用 CNI 插件，可以选择任何我们需要的[网络方案](https://kubernetes.io/docs/concepts/cluster-administration/networking/)\n- [自定义 Ingress 控制器](https://kubernetes.io/docs/concepts/services-networking/ingress-controllers/)：Ingress 定义了一套 API 接口，我们可以选择任意实现\n- [自定义 NetworkPolicy 控制器](https://kubernetes.io/docs/concepts/services-networking/network-policies/)：同上，可选实现包括 [Calico](https://kubernetes.io/docs/tasks/administer-cluster/network-policy-provider/calico-network-policy/)、[Cilium](https://kubernetes.io/docs/tasks/administer-cluster/network-policy-provider/cilium-network-policy/) 等\n- [自定义 DNS 控制器](https://github.com/kubernetes/dns/blob/master/docs/specification.md)：Kubernetes 定义了一套 DNS 规范，我们可以选择任意实现\n\n网络插件 CNI 是容器网络标准，Kubernetes 提供了良好的支持，常用插件包括 flannel、Calico 等等。对于 Ingress、NetworkPolicy、DNS，相信到目前为止大家应该可以理解，其本质上是 Kubernetes 定义的一套 API，底层实现可插拔，用户可以有自己的选择。\n\n*存储扩展能力*\n\n- [FlexVolume](https://kubernetes.io/docs/concepts/storage/volumes/#flexVolume)：Kubernetes 提供的一种动态对接存储方案，支持用户自定义存储后端\n- [存储插件 CSI](https://kubernetes-csi.github.io)：使用 CSI 插件，可以选择任何我们需要的存储方案\n\nFlexVolume 是 Kubernetes 自带的对接外部存储的方案，用户编写少量的代码即可加入自定义存储后端，适用于简单场景。存储插件 CSI 是容器网络标准，Kubernetes 提供了良好的支持，同时为方便第三方实现，还提供了一整套 SDK 解决方案。所有底层存储相关的能力都与 CSI 密切相关。\n\n*运行时扩展能力*\n\n- [运行时接口 CRI](https://kubernetes.io/docs/setup/production-environment/container-runtimes/)：使用 CRI 插件，可以选择任何我们需要的运行时方案\n\n运行时接口 CRI 是 Kubernetes 提出，为解决支持多种运行时而提供的方案。任何运行时，只需实现 CRI 相关的接口，即可接入 Kubernetes 中，包括 Docker、Containerd、gVisor、Kata 等。\n\n*特殊硬件或资源扩展能力*\n\n- [扩展资源 Extended Resource](https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/#extended-resources)：通过 Kubernetes 原生 API 方式支持添加自定义资源\n- [设备插件 Device Plugin](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/)：使用 Device Plugin 插件，可以对接任何我们需要的硬件\n\n对于简单场景，例如静态汇报资源数量，可以直接使用 Extended Resource 扩展 Kubernetes 所支持的硬件。Device Plugin 的核心是自动接入各种特殊硬件如 Nvidia、Infiniband、FPGA 等。在资源汇报层面 Device Plugin 目前也使用了 Extended Resource 的能力，但由于 Extended Resource 的局限性，Device Plugin 未来也可以与其他 API 对接。目前使用最多的 Device Plugin 主要是 Nvidia 的 [GPU device plugin](https://github.com/NVIDIA/k8s-device-plugin)。\n\n*监控扩展能力*\n\n- [自定义监控](https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/#support-for-metrics-apis)：支持使用自定义监控组件如 Prometheus 提供监控指标\n\n自定义监控包括 Custom Metrics 和 External Metrics，例如 [Prometheus adaptor](https://github.com/DirectXMan12/k8s-prometheus-adapter)。\n\n*云供应商扩展能力*\n\n- [云控制器 Cloud Controller Manager](https://kubernetes.io/docs/concepts/architecture/cloud-controller/)：支持可插拔云服务提供商\n\n云扩展能力的目标是使各个云供应商可以在不改变 Kubernetes 源码的情况下，接入其服务。每个云供应商都有[独立的项目](https://github.com/kubernetes?utf8=%E2%9C%93\u0026q=cloud-provider\u0026type=\u0026language=)。\n\n*命令行插件*\n\n- [Kubectl Plugin](https://kubernetes.io/docs/tasks/extend-kubectl/kubectl-plugins/)：kubectl plugin 支持扩展 kubectl 子命令，与 API 扩展能力结合可以提供近乎原生的使用方法。\n\n#### 心法\n\n\u003cp align=\"center\" style=\"font-size: 50px\"\u003e:godmode:\u003c/p\u003e\n\n- 推荐实现一个端到端的 Kubernetes 控制器，可以对整个 Kubernetes 的二次开发有更加深入的了解。此外，针对所有的扩展能力，建议先建立一个全面的认识，再根据需要深入某一项能力。\n- 我们除了通过用户手册来学习上面的技术，也可多参考 Kubernetes 的花式设计文档，主要是 [Design Proposals](https://github.com/kubernetes/community/tree/master/contributors/design-proposals)、[KEPs](https://github.com/kubernetes/enhancements/tree/master/keps)。\n\n### 第七阶段 大乘期（终身学习）\n\n#### 目标\n\n- 了解 Kubernetes 生态项目\n- 跟踪 Kubernetes 社区发展\n- 跟踪 CNCF 社区发展\n\n#### 路径\n\n目前为止，我们学习了很多 Kubernetes 的概念，但也只是其最重要的部分。在本阶段，我们需要专注以下几个问题：\n\n- 如何跟进 Kubernetes 的新功能，以及现有功能的更多细节？\n- 如何了解 Kubernetes 整个生态环境的发展？\n\n首先，让我们一起来学习几个重要的项目。围绕 Kubernetes 的生态环境建设是其成为容器标准的关键。\n\n- [Helm](https://github.com/helm/helm)：作为 Kubernetes 生态里的 brew、dnf、dpkg，Helm 为 Kubernetes 提供了包管理能力，方便用户快速部署安装各种服务。\n- [Harbor](https://github.com/goharbor/harbor)：Harbor 与 Kubernetes 无直接关系，但作为云原生环境下最常用的镜像仓库解决方案，了解 Harbor 十分重要。\n- [Prometheus](https://prometheus.io/)：Prometheus 是云原生环境下最重要的监控组件。\n- [Istio](https://istio.io/)：Istio 是服务网格的关键项目，但较为复杂，可以尝试简单了解。\n\n以上，我们仅列出了极少量的重要项目，Kubernetes 周边的项目十分之多，令人咂舌 😱。因此大乘期的你，需要开始持续跟踪 Kubernetes 及其生态的发展，甚至可以推动其发展，接下来我们列举一些靠谱资源：\n\n*GitHub 仓库*\n\n- [Kubernetes Enhancement](https://github.com/kubernetes/enhancements/)：关注新特性的讨论\n- [Kubernetes Community](https://github.com/kubernetes/community)：关注社区组织情况\n- [CNCF TOC](https://github.com/cncf/toc/)：关注 CNCF 进展，各种新项目讨论等\n- [Awesome Kubernetes](https://github.com/ramitsurana/awesome-kubernetes)：Kubernetes 项目之学不动系列\n\n关注 GitHub 仓库可以让你了解最一手的进展，但是信息量一般较大，讨论很多难度也比较大。不过对于大乘期的你来讲，应该不是问题 😉。另外，这里还包含很多 Kubernetes 系统内部的设计，例如调度器的优化方案、资源垃圾回收方案等，值得了解和学习。\n\n*Twitter 账号*\n\n下面推荐几个 Kubernetes 项目的核心人员。大牛都喜欢用 Twitter 交（si）流（bi），可以关注一波。感兴趣的话题可以去交流，大牛都十分耐撕（nice。\n\n- [Tim Hockin](https://twitter.com/thockin)\n- [Clayton Coleman](https://twitter.com/smarterclayton)\n- [Daniel Smith](https://twitter.com/originalavalamp)\n- [Brian Grant](https://twitter.com/bgrant0607)\n- [Vishnu Kannan](https://twitter.com/vishnukanan)\n- [Saad Ali](https://twitter.com/the_saad_ali)\n- [Kelsey Hightower](https://twitter.com/kelseyhightower)\n- [Joe Beda](https://twitter.com/jbeda)\n- [Brendan Burns](https://twitter.com/brendandburns)\n- [Michelle Noorali](https://twitter.com/michellenoorali)\n\n除此之外，Twitter 上还有不少项目和其他 Weekly 性质的 Twitter，推荐几个账号关注：\n\n- [Kube Weekly](https://twitter.com/kubeweekly)\n- [Kube List](https://twitter.com/readkubelist)\n\nTwitter 会根据你的喜好推荐其他相关内容，接下来就自由发挥。\n\n*Blog 账号*\n\n- [Kubernetes Blog](https://kubernetes.io/blog/)\n- [CNCF Blog](https://www.cncf.io/category/blog/)\n- [Caicloud Blog](https://caicloud.io/blog)\n\n可以关注的优秀 Blog 很多，这里就不一一列举。\n\n#### 心法\n\n\u003cp align=\"center\" style=\"font-size: 50px\"\u003e🐲\u003c/p\u003e\n\u003cp align=\"center\" style=\"font-size: 18px\"\u003e请坚持学习！送上一句黑鸡汤：\u003c/p\u003e\n\u003cp align=\"center\" style=\"font-size: 30px\"\u003e\"The last thing you want is to look back on your life and wonder... if only.\"\n\u003c/p\u003e\n\n## 许可协议\n\n- 本文遵守[创作共享 CC BY-NC-SA 3.0 协议](https://creativecommons.org/licenses/by-nc-sa/3.0/cn/)\n- 商业目的转载，请联系 \u003cmarketing@caicloud.io\u003e\n- 如有任何版权问题，请联系 \u003cdeyuan@caicloud.io\u003e 和 \u003cbaomengjiang@caicloud.io\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaicloud%2Fkube-ladder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcaicloud%2Fkube-ladder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcaicloud%2Fkube-ladder/lists"}