软件开发70年历史,软件工程发展了近50年,互联网从出现到现在的蓬勃发展二十多年。软件开发的模型从最早的瀑布模型,到敏捷开发,再到现在的DevOps理念。软件的形态从物理扎线,到打孔编程,再到大机,到微机,到网络时代的C/S、B/S、再到移动互联网时代App。架构的演变经过几十年的进化,在硬件、网络、信息的认知、用户数等都达到条件后,再才发展出了微服务,然后进而才出现了Kubernetes的框架。
Kubernetes的出现是大型互联网公司(Google)在非常庞大的微服务体系下,为了降低维护成本,为了提高维护效率,提高交付效率,更重要是为了服务自治不断思考和实践才开发出来的。IT行业的技术革新,总是会有先驱者为我们艰辛的躺平道路,然后我们再站在巨人的肩膀上借得更高的视野。
Kubernetes是什么?它不是简单的master/worker,controller/apiserver/etcd/scheduler等等一些二进制及配置文件。也不仅仅是pod/deployment/service/daemonset等等一些部署单元,也更不是一个简单的PAAS平台。它是一个体系,包含了软件工程管理、软件开发模型和理念、项目管理、架构设计、运维管理、交付管理等等,除此之外才是一个类PAAS平台。
如果要真正能了解Kubernetes,除了学习基础的Linux,你还需要了解什么才算入门? - 微服务架构,及微服务能解决的问题
- 对应微服务的语言生态,如JAVA、GO、Python等
- 基础的软件配置管理,如代码管理、CI/CD、版本管理
- 基础的生产维护管理,如变更管理、流程管理、监控、成本管理等
- 其它运维知识,如基础网络、中间件、运维工具等
而上面这些是需要实际工作经验,而且需要多方了解才能积累的。了解上面这些知识后,你再回过头来看Kubernetes。你才能明白它为什么这么设计;也才能明白每个资源对象在什么场景使用;也才能明白Kubernetes中配置管理、变更管理怎么做,与传统虚拟机部署方式有什么不同;也才能明白信息收集及故障排错怎么做。
首先,你要知道你自己需要不需要学习 Kubernetes?Kubernetes 是一个专业性极强的工具,如果你的业务没有到一定的量级,根本无需使用 Kuberentes ,就可以完成工作。
先说下学习kubernetes的大概思路,学习一个产品或技术,要达到能使用的目的,一般需要掌握以下内容: - 了解这个产品、工具能做什么
- 解决了什么问题
- 产品架构是什么样的
- 主要组件和该组件提供的功能
- 产品的主要功能有哪些
- 基本的产品部署、配置方法
- 简单的故障排查能力
把Kubernetes的主要概念、组件和功能特性画一个脑图,可以从整体上对涉及的知识体系有一个大概的了解。类似下面这张脑图就提供了一个知识地图,可以按照这个框架来进行学习。从图里面能看出来,因为主要在IaaS这一层,除了主要组件外,kubernetes主要涉及的有计算、存储、网络、安全几个领域。这些领域内的很多知识都是通用的,如果已经有IaaS基础,那只需要学习Kubernetes独有的一些概念就可以了。把核心概念了解清楚是最重要的。对于初学者,学习这些基础概念有一个很好的资源,就是CNCF官方的 http://Kubernetes.io这个网站。对于每个概念、组件都有介绍和实例,而且有很多文档已经有中文版本。想要入门的话,基本上把这个网站上的内容弄明白就够了。
除了理论学习,实践也很重要。对着每个概念都自己实际操作一遍,可以检测是否真正了解并掌握了这个概念,还可以加强学习效果。在kubernetes刚出推出的时候,搭建一个环境还是很麻烦的,现在有了kubeadm、minikube等工具,搭建环境也变得简单很多了。最省时间精力的办法还是使用 http://Kubernetes.io这个网站tutorial部分提供的现成学习环境,完全不需要用户自己搭建环境就可以进行大部分kubernetes的基本操作,是非常好的实践资源。利益相关:网易轻舟提供全栈微服务能力,帮助用户快速实现易接入、易运维的微服务解决方案。覆盖开发、测试、构建、发布到上线运行、治理、运维以及故障排查,源于网易内部的互联网业务实践,经过金融、制造、电商、物流等行业客户的生产验证。
一、学习 Kubernetes 的预备知识在开始学习 kubernetes 之前,你需要深入了解一些底层技术和概念。 - 分布式系统:了解分布式系统基础知识以及它在现代 IT 基础架构中的用例。
- 身份验证和授权:这是 在IT 中非常基本的一个概念。然而,资历尚浅的工程师往往也没能很好掌握这块知识,所以这块要好好理解学习。
- 键值存储:这是一种 NoSQL 数据库。你需要了解它的基础知识和用例。
- API: Kubernetes 是一个 API 驱动的系统。因此,你需要了解 RESTFUL API。另外,还要尝试了解 gRPC API。
- YAML:它是一种数据序列化语言,可用于数据存储和配置文件。它非常容易学习,从 Kubernetes 的角度来看,我们将把它用于配置文件。所以理解 YAML 语法非常重要。
- 容器:容器是 kubernetes 的基本构建块。Kubernetes 的主要工作是编排容器。你需要学习所有容器基础知识,并具有使用 Docker 或 Podman 等容器工具的实践经验。我还建议阅读有关Open container initiative和 Container Runtime Interface (CRI) 的文章
- 服务发现:这在 Kubernetes 中是很重要的一块。你需要具备客户端和服务器端服务发现的基本知识。简而言之就是,在客户端服务发现中,请求进入服务注册中心以获取可用于后端服务的端点。在服务器端服务发现中,请求转到负载均衡器,负载均衡器使用服务注册表来获取后端服务的结束。
- 网络基础
- L4 和 L7 层(OSI 层)
- SSL/TLS:单向和双向 TLS
- 代理人
- 域名系统
- IP表
- IPVS
- 软件定义网络 (SDN)
- 虚拟接口
- 覆盖网络
二、学习 Kubernetes 架构要弄清 Kubernetes 的架构并非易事。Kubernetes 有许多活动部件,只有了解了这些部件才能深入了解发生在系统表面下的事。而在学习架构时,还会遇到我们在第一节中谈到的那些预备知识。 Kubernetes 是一整个复杂的系统,学习它的核心架构可能会让人有点不知从何下手。不过,随着实践经验的逐渐累积,你将会更好地理解它的核心架构。 下面是我的建议。了解 Kubernetes 中所涉及的高级架构和关键组件,如果无法掌握这些知识,你可以花时间对特定主题进行更多的学习,或者在动手实践的同时学习这个概念。 可以查看Kubernetes 架构指南,详细了解所有的 Kubernetes 组件。 总的来说,你需要学习以下内容: - 控制平面组件:了解每个组件的作用,如 API 服务器、etcd、调度程序和控制器管理器。
- 工作节点组件:了解 Kube Proxy、Kubelet、Container Runtime
- 插件组件: CoreDNS、网络插件(Calico、weave 等)、Metric Server
- 集群高可用性:大多数组织使用托管 Kubernetes 服务(GKE、EKS、AKS 等)。因此,云提供商负责集群控制平面的高可用性。但是,了解在多区域和区域中扩展集群的高可用性概念非常重要。
- 网络设计:虽然在开放网络中不受限制地设置集群很容易,但在公司网络中却不是那么容易。作为 DevOps 工程师,你应该了解 Kubernetes 网络设计和要求,以便更好地与网络团队协作。例如,当我在谷歌云上使用 kubernetes 设置时,我们使用了一个在公司网络中不可路由的 CIDR pod 范围。作为解决方法,我们必须为 pod 网络部署 IP 伪装。
|