这几年有个词很火:云原生,而 Kubernetes 就是开启云原生之路最核心的组件服务。Kubernetes 是一个分布式容器化资源调度服务,是 Google 内部服务 Borg 的开源版本。技术方面还是不得不服人家 Google,总能开源出强大好用的组件。
我从2018年初开始接触 Kubernetes,到目前为止陆陆续续了解过 Kubernetes 一些相关的知识,但对 Kubernetes 也只懂皮毛。我并没有系统性地学习过 Kubernetes,基本都是因工作所需才去了解 Kubernetes 各方面的一点知识。要想对一个方向有深入了解,还是应该去系统性地学习一下。所以,我想整理一下系统性学习 Kubernetes 的路线,也分享给大家。
事先说明下,以下内容基本从网上摘抄,主要是参考infoq的文章,原文更加详细,想要系统了解下的同学可以参考原文,本文只是从原文中摘抄一些关键点,便于后续学习,原文链接:https://www.infoq.cn/article/9dtx*1i1z8hsxkdrpmhk
原文对 Kubernetes 学习路径规划了 8-9 个月的时间,分成了七大阶段。我根据个人理解与后续学习指引,总结成了三个阶段:
初步了解,在这个阶段需要对 Kubernetes 有个大体了解,知道一些 Kubernetes 中的一些基本概念和基本的使用方法。
整体学习,在这个阶段需要对 Kubernetes 有整体全面的了解,知道 Kubernetes 所有核心组件的工作原理。
加深学习,在这个阶段需要对 Kubernetes 的拓展生态进行了解,包括与 Kubernetes 相关的一些开源组件、持续关注 Kubernetes 社区与 CNCF 社区等。
我目前处于的阶段是初步了解阶段,只懂 Kubernetes 中的一些基本概念与基本用法。之后我还是要持续系统地学习下 Kubernetes,也会给大家带来多篇关于 Kubernetes 学习经验的文章。Kubernetes 这个生态真的很强大,如果你还没了解过 Kubernetes,至少应该了解一下。
第一阶段:初步了解
第一阶段的主要目标是:
了解 Kubernetes 基本概念和使用方法
知道然后安装部署 Kubernetes 环境
了解 Kubernetes 的基本架构以及容器调度的基本流程
对于 Kubernetes 基本概念与使用方法,到官网学习就好,参考内容如下:
官方 Tutorial:Learn Kubernetes Basics(https://kubernetes.io/docs/tutorials/kubernetes-basics/)
官方 Guestbook 样例:Guestbook Example(https://kubernetes.io/docs/tutorials/stateless-application/guestbook/)
对于安装部署 Kubernetes 环境,参考如下:
个人电脑上的简单使用,可以用 minikube 或 kind 部署一个本地环境。
集群模式的部署,可以用 kubeadm,参考部署教程:https://github.com/caicloud/kube-ladder/blob/master/tutorials/lab1-installation.md
(强烈建议大家手动部署一遍各个组件,参考:https://github.com/caicloud/kube-ladder/blob/master/tutorials/lab3-manual-installtion.md。虽然工具很强大,但对于学习来说,手动部署各个组件,可以加深我们对 Kubernetes 各组件的了解。因为工作所需,我曾经在无网环境下编译了 Kubernetes,这让我对 Kubernetes 的了解更深了。)
对于 Kubernetes 的基本架构,需要了解的内容如下:
(1)Kubernetes 整体架构图,Kubernetes 是 Master & Node 架构,参考下图:
(图片来源:https://jimmysong.io/kubernetes-handbook/concepts/)
(2)Master 需要了解的相关组件
API Server。Kubernetes 如何接收请求,又是如何将结果返回至客户端。
Etcd。了解 Etcd 主要功能机制。
Controller Manager。Kubernetes 控制器是其架构中最为核心的一环,我们需要了解控制器的原理,List-Watch 的基本原理,知道 Kubernetes 默认情况下大致包含哪些类型的控制器。
Scheduler。熟悉 Kubernetes 的调度流程是怎样的,调度器在整个调度流程中的角色。
(3)Node 需要了解的相关组件
Kubelet。知道 Kubelet 是如何接受调度请求并启动容器的。
Kube-proxy。了解 Kube-proxy 的作用,提供的能力是什么。
Container Runtime。了解都有哪些 Container Runtime,主要了解 Docker 一些基本操作与实现原理。虽然 Kubernetes 已经要抛弃 Docker 了,但目前来看还处于初步阶段,所以对 Docker 也需要有一定的了解。
(4)核心 Addons & Plugins
DNS。DNS 为集群的服务发现提供的支持,Kubernetes 1.13 开始默认使用 CoreDNS。
Network Plugin。Kubernetes 多节点环境需要部署网络插件才可以使用,默认情况下使用 flannel 即可。
以下是一些参考的学习资料:
官方文档:Kubernetes Components(https://kubernetes.io/docs/concepts/overview/components/)
feisky 的博客:Kubernetes 指南之核心原理(https://kubernetes.feisky.xyz/he-xin-yuan-li/index)
kubectl run 的背后流程(难):What happens when I type kubectl run?(https://github.com/jamiehannaford/what-happens-when-k8s)
kubectl run 的背后流程中文版:kubectl 创建 Pod 背后到底发生了什么?(https://mp.weixin.qq.com/s/ctdvbasKE-vpLRxDJjwVMw)
第二阶段:整体学习
第二阶段的主要目标是:
Kubernetes API 结构
深入学习 Kubernetes 架构与各个子系统
加深 Kubernetes 各个资源的理解
学习更多 Kubernetes 集群层面的功能
之所以单独把 Kubernetes API 作为一个主要学习目标,是因为 Kubernetes API 的设计很赞,学习后,对以后我们系统设计上有一定的参考意义。学习内容如下:
Kubernetes 的 API 是如何控制版本的
Kubernetes 的 API 是如何分组的
Kubernetes 对象的表示方法与设计理念(https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/)
Kubernetes API 的访问控制(https://kubernetes.io/docs/reference/access-authn-authz/controlling-access/)
Kubernetes 除了核心架构外,还有多个子系统可以学习,参考如下:
架构 Architecture
应用 Apps
存储 Storage
网络 Network
权限 Auth
节点 Node
调度 Scheduling
命令行 CLI
多集群 MultiCluster
云平台 CloudProvider
扩展性 Scalability
弹性伸缩 Autoscaling
监控日志 Instrumentation
对 Kubernetes 各种资源的学习,分为计算、网络、存储、安全、调度这几个方面:
(1)计算,学习内容如下:
Pod Lifecycle & Healthcheck & RestartPolicy
Pod Init-Container
Horizontal Pod Autoscaler (HPA)
更多控制器:Job、CronJob、Daemonset、StatefulSet、ReplicaSet
(2)网络,学习内容如下:
Service 实现,主要了解 iptables 的实现(可选:ipvs 模式)
Ingress 原理和常用的 nginx ingress 操作
DNS 服务的原理,以及 CoreDNS 方案
(3)存储,学习内容如下:
Volume 以及底层存储类型
PV/PVC、StorageClass
(4)安全,学习内容如下:
AuthN, AuthZ & Admission Control
NetworkPolicy
ServiceAccount
Pod/Container SecurityContext
Pod Security Policy (PSP)
(5)调度,学习内容如下:
Pod/Node Affinity & Anti-affinity
Taint & Toleration
Priority & Preemption
Pod Disruption Budget
Kubernetes 集群层面更多的功能,学习内容参考如下:
(1)Master 层面
a)Dynamic Admission Control
动态准入控制
对应 API Server --admission-control-config-file 参数
b)Advanced Auditing
提供可动态配置的审计功能
对应 API Server 带有 --audit- 前缀的参数
c)Etcd Configuration
提供各种与 Etcd 相关的配置,例如 Kubernetes event TTL
对应 API Server 带有 --etcd- 前缀的参数
d)All Admission Controllers
列举所有 Kubernetes 所支持的 Admission Controllers,每个 Admission 都与 Kubernetes 特定的功能相关联
对应 API Server --enable-admission-plugins 参数,该参数注释列举了所有的默认
e)Admission Controllers Garbage Collection
启用后,Kubernetes 会自动根据 OwnerReferences 来回收 API 资源
对应 Controller-Manager --enable-garbage-collector 参数
f)Concurrent Sync Limiting
避免过多的资源同步导致集群资源的消耗
对应 Controller-Manager 带有 --concurrent 前缀的参数
g)All Controllers
列举所有 Kubernetes 所支持的 Controllers,每个 Controller 都与 Kubernetes 特定的功能相关联
对应 Controller-Manager --controllers,该参数注释列举了所有的默认 Controllers
(2)Node 层面
a)Kubelet Eviction
当节点资源不足时,Kubernetes 通过驱逐 Pods 的方式确保节点的稳定性
对应 Kubelet 带有 --eviction- 前缀的参数,例如 --eviction-hard
b)Image GC
清理容器镜像占用的磁盘空间
对应 Kubelet 带有 --image-gc- 前缀的参数,以及 --minimum-image-ttl-duration 等参数
c)Resource Reserve
为系统资源预留一定的资源,确保节点的稳定性
对应 Kubelet --kube-reserved、--kube-reserved-cgroup 等参数
d)CPU Manager
提供更多的 CPU 管理能力,例如静态 CPU 亲和性
对应 Kubelet --cpu-manager-* 前缀的参数
e)Storage Limit
避免节点过度挂载数据卷
对应 FeatureGate AttachVolumeLimit
第三阶段:加深学习
第三阶段的主要目标是:
掌握 Kubernetes 的扩展机制并可以编写 Kubernetes 控制器
了解 Kubernetes 生态项目、社区发展以及 CNCF 社区发展
对于 Kubernetes 扩展机制,包括 API 、调度器、网络、存储、运行时、特殊硬件或资源、监控、云供应商、命令行插件。内容很多,我就不一一列举了,大家参考:https://www.infoq.cn/article/9dtx*1i1z8hsxkdrpmhk
对于 Kubernetes 需要了解与学习的生态组件,包括:
Helm:为 Kubernetes 提供了包管理能力,方便用户快速部署安装各种服务。
Harbor:作为云原生环境下最常用的镜像仓库解决方案,了解 Harbor 十分重要。
Prometheus:Prometheus 是云原生环境下最重要的监控组件。
Istio:Istio 是服务网格的关键项目,但较为复杂,可以尝试简单了解。
对于 Kubernetes 社区以及 CNCF 社区可以关注的内容如下:
Kubernetes Enhancement:关注新特性的讨论
Kubernetes Community:关注社区组织情况
CNCF TOC:关注 CNCF 进展,各种新项目讨论等
Awesome Kubernetes:Kubernetes 项目之学不动系列
最后来个总结,今天花了一个小时来整理 Kubernetes 的学习路线,内容基本源自于 InfoQ 的参考文章,希望对大家也有帮助。通过上面列举的内容,我们可以看到想要学好 Kubernetes 确实不太容易,内容涉及很广。由此可见,Kubernetes 是多么强大,确实也值得我们去学习。后续我也会分享多篇在学习 Kubernetes 过程中的一些总结内容。一起加油吧,各位。
上一篇文章:富不过三代吗?