learn-tech/专栏/Kubernetes入门实战课/00开篇词迎难而上,做云原生时代的弄潮儿.md
2024-10-16 06:37:41 +08:00

191 lines
15 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

因收到Google相关通知网站将会择期关闭。相关通知内容
00 开篇词 迎难而上,做云原生时代的弄潮儿
你好我是罗剑锋不过更愿意你称呼我“Chrono”。
先来简单介绍一下我自己吧。作为一个有着近二十年工作经验的“技术老兵”我一直奋斗在开发第一线从Windows到Linux、从硬件到软件从单机到集群、云开发了各种形式的应用也经历了许多大小不一的公司现在是在API管理和微服务平台公司Kong基于Nginx/OpenResty研发Kong Gateway、Kong ingress Controller等产品。
其实我应该算是极客时间的老朋友了在2019年开了《透视HTTP协议》的课程在2020年开了《C++实战笔记》的课程,然后因为工作上的事情比较多,“消失”了近两年的时间。
不过这段日子里我倒没有“两耳不闻窗外事”而是一直在关注业界的新技术新动向所以今天我再次回到了极客时间的这个大讲堂想和你聊聊如今风头正劲的Kubernetes。
现在的Kubernetes
你一定听说过Kubernetes吧也许更熟悉一点的是许多人总挂在嘴边的缩写——“K8s”。
自从2013年Docker诞生以来容器一跃成为了IT界最热门的话题。而Kubernetes则趁着容器的“东风”借助Google和CNCF的强力“背书”击败了Docker Swarm和Apache Mesos成为了“容器编排”领域的王者至尊。
换一个更通俗易懂的说法那就是现在Kubernetes已经没有了实际意义上的竞争对手它的地位就如同Linux一样成为了事实上的云原生操作系统是构建现代应用的基石。
毕竟现代应用是什么是微服务是服务网格这些统统要围绕着容器来开发、部署和运行而使用容器就必然要用到容器编排技术在现在只有唯一的选项那就是Kubernetes。
不管你是研发、测试、还是运维不管你是前台、后台、还是中台不管你用的是C++、Java还是Python不管你是搞数据库、区块链、还是人工智能不管你是从事网站、电商、还是音视频在这个“云原生”时代Kubernetes都是一个绕不过去的产品是我们工作中迟早要面对的“坎儿”。
你也许会有疑惑我现在的工作和“云”毫不沾边而且Kubernetes都“火”了这么久现在才开始学会不会有点晚了值不值呢
这里我就要引用一句老话了:“艺多不压身”,还有另一句:“机遇总是偏爱有准备的人”。
“云原生”已经是现在IT界的普遍共识是未来的大势所趋。也许这个“浪潮”暂时还没有打到你这里来但一旦它真正来临只有你提前做好了知识储备才能够迎难而进站上浪头成为“弄潮儿”否则就可能会被“拍在沙滩上”。
我和你说一下我自己的亲身经历吧。
早在Docker和Kubernetes发布之初我就对它们有过关注。不过因为我的主要工作语言是C/C++而Docker和Kubernetes用的都是Go当时Go的性能还比较差比如垃圾回收机制导致的著名Stop the World所以我只是简单了解了没有去特别研究。
过了几年一个偶然的机会我们要在客户的环境里部署自研应用但依赖库差异太大很难搞定。这个时候我又想起了Docker经过一个多星期的折腾艰难地啃下了一大堆资料之后总算是把系统正常上线了。
虽然任务完成了但也让我意识到自己从前对Docker的轻视是非常错误的于是就痛下决心开始从头、系统地学习整理容器知识之后也就很自然地搭上了Kubernetes这条“大船”。
再后来我想换新工作面试的时候Boss出了道“偏门”题讲Kubernetes的容器和环境安全。虽然我不熟悉这个方向但凭借着之前的积累只用了一个晚上就赶出了20多页的PPT第二天面对几位评委侃侃而谈最终顺利拿下了Offer。
你看如果我当时一味固执己见只呆在自己的“舒适区”里不主动去学习容器技术和Kubernetes当机遇不期而至的时候很可能就会因为手足无措而错失了升职加薪的良机。
所以也希望你不要犯我当初的错误我们应当看清楚时代的走向尽可能超前于时代越早掌握Kubernetes将来自己成功的几率就越大。
学习Kubernetes有哪些难点
那么我们应该怎么来学习Kubernetes呢
其实今天学习Kubernetes的难度比起前几年来说已经是极大地下降了网上资料非常多有博客、专题、视频等各种形式而且Kubernetes为了推广自身在官网上还放出了非常详细的教程和参考手册只要你肯花时间完全可以“自学成才”。
不过“理想很丰满现实很骨感”。理论上讲学习Kubernetes只要看资料就足够了但实际情况却是学习起来仍然困难重重我们会遇到很多意想不到的问题。
这是因为Kubernetes是一个分布式、集群化、云时代的系统有许多新概念和新思维方式和我们以往经验、认知的差异很大。
我觉得Kubernetes技术栈的特点可以用四个字来概括那就是“新、广、杂、深”。
“新”是指Kubernetes用到的基本上都是比较前沿、陌生的技术而且版本升级很快经常变来变去。
“广”是指Kubernetes涉及的应用领域很多、覆盖面非常广不太好找到合适的切入点或者突破口。
“杂”是指Kubernetes的各种实现比较杂乱谁都可以上来“掺和”一下让人看的眼晕。
“深”是指Kubernetes面对的每个具体问题和方向都需要有很深的技术背景和底蕴想要吃透很不容易。
这四个特点就导致Kubernetes的“门槛”相当高学习曲线非常陡峭学习成本非常昂贵有可能花费了大量的时间和精力却南辕北辙、收效甚微这点我确实是深有体会。
比如在初学的过程中我就遇到过这些疑问,不知道你有没有同感:
Docker、Containerd、K8s、K3s、MicroK8s、Minikube……这么多项目该如何选择
容器的概念太抽象了,怎么才能够快速准确地理解?
镜像的命名稀奇古怪里面的“bionic”“buster”等都是什么意思
不知道怎么搭建出Kubernetes环境空有理论知识无法联系实际。
YAML文件又长又乱到哪里能找到说明能否遵循什么简单规律写出来
Pod、Deployment、StatefulSet……这么多的对象有没有什么内在的脉络和联系
遗憾的是这些问题很难在现有的Kubernetes资料里找到答案。
我个人感觉它们往往“站得太高”没有为“零基础”的初学者考虑总会预设一些前提比如熟悉Linux系统、知道编程语言、了解网络技术等等有时候还会因为版本过时而失效或者是忽略一些关键的细节。
这就让我们初学者经常“卡”在一些看似无关紧要却又非常现实的难点上这样的点越积越多最后就让人逐渐丧失了学习Kubernetes的信心和勇气。
所以我就想以自己的学习经历为基础融合个人感悟、经验教训和心得技巧整理出一个初学者面对Kubernetes这门新技术的入门路线和系统思路让你在学习时有捷径可走不再有迷茫和困惑能快速高效地迈入Kubernetes的宏伟殿堂。
在这个专栏里你会怎么学习Kubernetes
讲到这里你一定很想知道这个专栏有什么特点和别的课程有哪些不一样结合刚才讲的Kubernetes技术栈四个特点“技术新、领域广、实现杂、方向深”我来仔细说一说我的想法和考量。
第一没有太多前提不会Go你也可以学。
在这门课里我不会要求你学习Go语言也不会去讲Kubernetes的源码。
虽然是研发出身但我并没有特别深入地了解Go语言但是我认为这反而是一个优势。因为面对Kubernetes的时候我和你是“平等”的不会“下意识”地去从源码层次来讲解它的运行原理更能够设身处地为你着想。
讲源码虽然会很透彻但它的前置条件实在是太高了不是所有的人都具备这个基础的。为了学习Kubernetes要先了解Go语言有点“本末倒置”如同钱钟书老先生所说“如果你吃了个鸡蛋觉得味道不错何必去认识那个下蛋的母鸡呢?”我觉得这方面也可以对比一下Linux操作系统它是用C语言写的但几乎没有人要求我们在学习Linux之前需要事先掌握C语言。
不过如果你真想做Kubernetes开发等学会了Kubernetes的基本概念和用法再回头去学Go语言也完全来得及。
第二,这个专栏我会定位在“入门”,也就是说,不会去讲那些高深的大道理和复杂的工作流程,语言也尽量朴素平实,少用专业术语和缩略词。
毕竟Kubernetes系统涉及的领域太过庞大对于初次接触的人来说直接“抠”内部细节不太合适那样很容易会“跑偏”“钻牛角尖”。
我觉得学习Kubernetes最好的方式是尽快建立一个全局观和大局观等到你对这个陌生领域的全貌有了粗略但完整的认识之后再挑选一个自己感兴趣的方向去研究才是性价比最高的做法。
而且前面也说过Kubernetes版本更新很快有的功能点或许一段时间之后就成了废弃的特性比如ComponentStatus在1.19被废弃、PodSecurityPolicy在1.21被废弃),如果讲得太细,万一今后它过时无用,就实在是太尴尬了。
第三,课程会以实战为导向,强调眼手脑结合,鼓励你多动手、多实际操作,我认为这是这个课程最大的特点。
Kubernetes一般每年都会发布一个大版本大版本又会有很多的小版本每个版本都会持续改进功能特性但一味求新不符合当前的实际情况毕竟生产环境里稳定是最重要的。
所以我就选择了今年2022年初发布的Kubernetes 1.23.3它是最后一个支持Docker的大版本承上启下具有很多的新特性同时也保留了足够的历史兼容性非常适合用来学习Kubernetes。
在课程里我会先从Docker开始陆续用minikube、kubeadm搭建单机和多机的Kubernetes集群环境在讲解概念的同时还会给出大量的docker、kubectl操作命令让你能够看完课程后立即上手演练用实际操作来强化学习效果。
第四,具体到每一节课上,我不会“贪大求全”,而是会“短小精悍”,做减法而不是加法,力争每节课只聚焦在一个知识点。
这是因为Kubernetes涉及的领域太广了它的知识结构是网状的之间的联系很密切在学习时稍不注意就会跳跃到其他的地方很容易“发散”“跑题”导致思维不集中。
所以我在讲解的时候会尽量克制把每节课收束在一个相对独立的范围之内不会有太多的外延话题也不会机械地罗列API、命令参数、属性字段这些你都可以查阅Kubernetes文档在讲解复杂的知识点时还会配上图片让你能够精准地理解吸收知识。
比如Pod等众多API对象之间的关系一直是学习Kubernetes的难点单用文字很难解释清楚所以我画了很多图帮助你形象地理解它们的联系。就像这张
因为每一讲都聚焦在一个知识点上专栏的整个结构我也梳理出了一条独特路线把Kubernetes的知识点由网状结构简化成了线性结构你可以在这条路线上循序渐进由浅入深、由易到难地学习完整的Kubernetes知识体系。
专栏的线性结构是什么样的
从这些设想出发,我把专栏主要划分成了五个模块。
课前准备
在正式学习前首先有一节课前准备这也是我写专栏的惯例了会跟你说一下我们学习的实验环境用虚拟机软件搭建出一个Linux系统为零基础的同学扫除一些非常简单但是其他地方可能没有讲到的后顾之忧。
入门篇
我会用最流行的Docker来讲解Kubernetes的基础技术容器让你了解它的基本原理熟悉常用的Docker命令能够轻松地拉取、构建镜像运行容器能够使用容器在本机搭建开发测试环境。
初级篇
在具备了容器的知识之后我们就可以来学习Kubernetes了用的是单机环境minikube。你会了解为什么容器会发展到容器编排Kubernetes解决了什么问题它的基本架构是什么样子的再学习YAML语言、核心对象Pod还有离线业务对象Job/CronJob、配置信息对象ConfigMap/Secret。
中级篇
我们会在“初级篇”的基础上更进一步使用kubeadm搭建出一个多节点的集群模拟真实的生产环境并介绍Kubernetes里的4个重要概念Deployment、DaemonSet、Service、Ingress。学习了这些对象你就能够明白Kubernetes的优点、特点是什么知道为什么它能够一统天下成为云原生时代的操作系统。
高级篇
经过前面几个模块的学习你就已经对Kubernetes有了比较全面的认识了所以我会再讲解一些深层次知识点和高级应用技巧包括持久化存储、有状态的对象、应用的滚动更新和自动伸缩、容器和节点的管理等等。
当然,这种纯线性学习也难免会有缺点,我也会用其他的形式来补充完善,让你的学习过程更丰富多样,比如每一讲后面的知识小贴士、互动答疑。
在专栏的中后期我还会为你准备一些“加餐”讲讲Kubernetes相关的一些“花边逸闻”比如docker-compose、CNCF、API Gateway等等扩展一些虽然是外围但也很有实际意义的知识。
前面说过要多动手实践,为了强化实战效果,每个模块的知识点学完后,我都会安排一节实战演练课和一节视频课:
实战课我们会应用模块中学习的知识来实战搭建WordPress网站你可以跟着课程一路走下来看着它如何从单机应用演变到集群里的高可用系统的。
视频课,我会把这个模块里大部分重要的知识点都实机操作演示给你看,相信通过“文字+图片+音频+视频”的多种形式,你的学习一定会非常充实而满足。
你的Kubernetes之旅马上就要开始了我再送你一张课程的知识地图希望你能够在今后的三个月里以它为伴用努力与坚持去浇灌学习之花收获丰硕的知识和喜悦之果-
戳这里 👉学习交流群,进群和罗老师、技术大牛们一起快速成长
专栏的画图工具说明知识讲解类keynote思维导图类Xmind。