书名:Kubernetes快速入门(第2版)
ISBN:978-7-115-63579-2
本书由人民邮电出版社发行数字版。版权所有,侵权必究。
您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。
我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。
如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。
著 [英] 奈吉尔 • 波尔顿(Nigel Poulton)
译 苏 格
责任编辑 孙喆思
人民邮电出版社出版发行 北京市丰台区成寿寺路11号
邮编 100164 电子邮件 315@ptpress.com.cn
网址 http://www.ptpress.com.cn
读者服务热线:(010)81055410
反盗版热线:(010)81055315
Simplified Chinese translation copyright ©2023 by Posts and Telecommunications Press
All Rights Reserved.
Quick Start Kubernetes: 2023 Edition, by Nigel Poulton, ISBN 9781916585027.
Copyright © 2023 by Nigel Poulton
本书中文简体版由作者授权人民邮电出版社有限公司出版。未经出版者书面许可,对本书的任何部分不得以任何方式或任何手段复制和传播。
版权所有,侵权必究。
本书是Kubernetes的快速入门指南,书中不但介绍了Kubernetes是什么、为什么需要Kubernetes,而且介绍了Kubernetes的发展方向。在理论层面,读者将学到微服务、编排、Kubernetes为什么成为云的操作系统和Kubernetes集群的架构等方面的内容;在实践层面,读者将学会构建一个集群、容器化应用、部署应用、破坏应用,还会看到Kubernetes修复应用、扩缩容应用,并完成应用的更新。
本书将理论与实践相结合,适合任何需要快速掌握Kubernetes基础知识的人阅读。无论是技术型读者还是非技术型读者都将从本书中获益匪浅。
虽然Kubernetes刚刚兴起不久,但它是谷歌十几年来大规模应用容器技术的经验积累和升华的重要成果。确切地说,Kubernetes是谷歌严格保密十几年的秘密武器Borg的一个开源版本。Borg是谷歌的一个久负盛名的内部使用的大规模集群管理系统,它基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心资源利用率的最大化。正是因为站在Borg这个前辈的肩膀上,汲取了Borg过去十几年间的经验与教训,所以Kubernetes一经开源就一鸣惊人,并迅速称霸容器领域。
本书作者的写作初衷是带着读者边做边学,帮助读者掌握Kubernetes最核心的知识,包括使用Kubernetes构建集群、进行容器化应用的部署、扩缩容等。对想要快速掌握Kubernetes基础知识的读者而言,本书会是一个不错的起点。
书中所涉及的部分专业术语与概念尚无公认的中文译法,因此我较多地参考了网络上和研究论文中常用的译法,若读者阅读过程中有理解起来比较吃力的术语,可根据原词确认其原始词意。在翻译过程中,虽然我力求准确地反映原著内容,但由于水平有限,如有错漏之处,恳请读者批评指正。
最后要感谢人民邮电出版社的编辑和校对人员,他们为保证本书的质量做了大量的编辑和校正工作,在此深表谢意。
苏格
顾名思义,这是一本Kubernetes的快速入门指南。本书并不涵盖关于Kubernetes的所有方面,只是介绍重要的部分。不过,本书尽可能清晰地以一种引人入胜的方式介绍相关内容,并将理论与实践完美结合。
这旨在揭开 Kubernetes 的神秘面纱,并让你获得一些实践经验。
本书的目标读者是任何需要快速掌握Kubernetes基础知识的人,如果你喜欢边做边学,本书会是不错的选择。
本书将理论与实践相结合,是多年精心打造的结果,无论是技术型读者还是非技术型读者都将从本书中获益匪浅。因此,无论你从事的是市场营销、管理和架构设计工作,还是在实践中需要用到Kubernetes的人员,本书都会让你爱不释手。
本书并不能让你成为专家,但它会带你开启成为专家的旅程。读完本书,你就可以与他人就Kubernetes展开交流了。
本书的英文版可以在Amazon上买到,包括平装版和Kindle版。本书的英文版电子书可以在Leanpub上买到。
本书其他语言的翻译版本可以在Amazon和Leanpub上买到,包括法语版、德语版、印地语版、意大利语版、葡萄牙语版、俄语版、简体中文版、西班牙语版。
在本书中,Kubernetes API对象采用首字母大写的方式。
更简单地说,Kubernetes的特征(feature),如Pod和Service,都用了首字母大写的方式。
本书遵守了“包容性命名倡议”(Inclusive Naming Initiative)的指导原则,该倡议提倡大家使用负责任的语言。例如,Kubernetes项目将可能有害的术语“主节点”换成了“控制面板节点”,本书采取了同样的做法,力图遵守“包容性命名倡议”的指导原则。
我是Nigel Poulton(@nigelpoulton)。我住在英国,是一个技术控,我热衷于与云、容器和WebAssembly这样的技术打交道,对我而言这就是梦想的生活。
我早期的职业生涯深受马克·米纳西(Mark Minasi)的Mastering Windows Server 2000一书的影响。这让我充满了写自己的书的激情,我也希望我的书能像马克的书影响了我的生活和职业生涯那样影响人们的生活和职业生涯。从那时起,我写了几本畅销书,包括《数据存储网络》(Data Storage Networking)、《深入浅出Docker》(Docker Deep Dive)和《Kubernetes修炼手册》(The Kubernetes Book)。能接触到这么多人我感到非常荣幸,我真的对我收到的所有反馈都心存感激。
我还制作了Docker、Kubernetes和WebAssembly的视频培训课程。我的视频寓教于乐,甚至偶尔会令人捧腹大笑(不是我自夸)。
在我的个人网站上,你可以找到我所有的书、视频、博客、简讯,以及其他有助于你学习的资料。
工作之余,我就是在陪伴家人。我也喜欢驾驶美国的肌肉车、指导青少年踢足球、阅读科幻小说。
欢迎大家通过推特、领英、我的个人网站、电子邮件等方式与我联系。
本书实践性很强,它有一个示例应用。这是一个简单的Node.js应用,可在本书的GitHub仓库中找到。
即使你不是一个开发者,也不要对应用和GitHub感到有压力。本书的重点是Kubernetes,而不是这个示例应用。另外,在谈论这个示例应用时,本书将用通俗的语言解释一切,你不必知道如何使用GitHub。
示例应用的代码在App
文件夹中,包括以下文件。
● app.js:这是示例应用的主文件,它是一个Node.js网络应用。
● bootstrap.css:这是示例应用的网页设计模板。
● package.json:这个文件列出了示例应用的所有依赖。
● views:这是一个存放示例应用网页内容的文件夹。
● Dockerfile:这个文件告诉Docker如何将示例应用构建成一个容器。
如果你现在就要下载这个应用,可以执行下面的命令,为此需要在你的计算机上安装git
。如果你还没有安装git
,也没有关系,本书后面将演示如何获取git
并下载这个应用。
$ git clone https://github.com/nigelpoulton/qsk-book.git
$ cd qsk-book
这个应用每年至少维护一次,以检查软件包的更新和已知的漏洞。
本书提供如下资源:
● 本书源代码;
● 本书思维导图;
● 异步社区7天VIP会员。
要获得以上资源,您可以扫描下方二维码,根据指引领取。
作者和编辑尽最大努力来确保书中内容的准确性,但难免会存在疏漏。欢迎您将发现的问题反馈给我们,帮助我们提升图书的质量。
当您发现错误时,请登录异步社区(https://www.epubit.com),按书名搜索,进入本书页面,点击“发表勘误”,输入勘误信息,点击“提交勘误”按钮即可(见下页图)。本书的作者和编辑会对您提交的勘误进行审核,确认并接受后,您将获赠异步社区的100积分。积分可用于在异步社区兑换优惠券、样书或奖品。
我们的联系邮箱是contact @epubit.com.cn。
如果您对本书有任何疑问或建议,请您发邮件给我们,并请在邮件标题中注明本书书名,以便我们更高效地做出反馈。
如果您有兴趣出版图书、录制教学视频,或者参与图书翻译、技术审校等工作,可以发邮件给本书责任编辑(sunzhesi@ptpress.com.cn)。
如果您所在的学校、培训机构或企业,想批量购买本书或异步社区出版的其他图书,也可以发邮件给我们。
如果您在网上发现有针对异步社区出品图书的各种形式的盗版行为,包括对图书全部或部分内容的非授权传播,请您将怀疑有侵权行为的链接发邮件给我们。您的这一举动是对作者权益的保护,也是我们持续为您提供有价值内容的动力之源。
“异步社区”(www.epubit.com)是由人民邮电出版社创办的IT专业图书社区,于2015年8月上线运营,致力于优质内容的出版和分享,为读者提供高品质的学习内容,为作译者提供专业的出版服务,实现作者与读者在线交流互动,以及传统出版与数字出版的融合发展。
“异步图书”是异步社区策划出版的精品IT图书的品牌,依托于人民邮电出版社在计算机图书领域40余年的发展与积淀。异步图书面向IT行业以及各行业使用相关技术的用户。
本章的目标很简单——尽可能以最清晰的方式描述Kubernetes。
从本质上说,Kubernetes是云原生微服务(cloud-native microservice)应用的编排器(orchestrator)。
在上面这么短的一个句子里有这么多让人头痛的术语。那么,接下来我先解释一下这些术语:
● 微服务;
● 云原生;
● 编排器。
在过去,开发人员构建和部署的是单体应用(monolithic application)。这是比较专业的说法,在单体应用中每个功能都被捆绑在一起作为单个大的包,如图1-1所示。Web前端、认证、日志生成、数据存储、报告系统等被紧密地耦合在一起,捆绑成一个应用。这意味着,如果想改变某个部分,必须改变每一部分。
图1-1
举个简单的例子,如果需要修补或更新图1-1中的应用的报告功能,必须关闭整个应用并修补/更新整个应用。像这样的工作需要详尽的计划,面临巨大的风险且十分复杂,通常还不得不在漫长无聊的周末和大家一起加班完成。
但是,单体应用带来的痛苦还不止于此。如果想对它们的某个功能进行扩缩容,不得不对整个单体应用扩缩容。
基本上,应用的每个功能都被作为一个单体的单元捆绑、部署、升级和扩缩容,这是很笨拙的,显然不是很理想。
另外,微服务应用采用完全相同的一组功能——Web前端、认证、日志生成、数据存储、报告系统等,并将每个功能拆分为自己的小应用。“小”的另一个词是“微”,“应用”的另一个词是“服务”。这就是“微服务”这个术语的由来。
如果仔细观察图1-2你会发现,它就是和图1-1完全相同的一组应用功能。不同的是,每个功能都是独立开发、独立部署的,并且可以独立更新和扩缩容。但它们依然协同工作,创造与单体应用完全相同的应用体验。
图1-2
最常见的模式是每个微服务都作为独立的容器来开发和部署。例如,Web前端微服务会是一个容器,认证微服务会是另一个不同的容器,报告系统微服务又会再是不同的容器,以此类推。每个微服务都是独立的,但又是通过网络松散耦合的,以创建相同的应用体验。
通过设计让微服务之间是松散耦合的,这是修改一个微服务而不影响其他微服务的基础。从技术上讲,每个微服务都通过IP网络暴露一个API,让其他微服务能够通过这个API来使用它。
如果不熟悉 API 这个概念,下面这个类比对你可能会有所帮助。
汽车的外形和大小各异,它们配置的可能是直列四缸、水平对卧六缸、八缸的发动机,甚至可能是电动发动机。但是,所有这些复杂的细节都通过使用标准化控制器——方向盘、加速器、刹车踏板和车速表对驾驶员隐藏了。在这个模型中,控制器相当于汽车的API——驾驶员通过它们来使用汽车的功能。这种模型的一个主要优点是,学会驾驶后就能驾驶任何一款汽车。例如,我学开车时用的是一辆前轮驱动的汽车,它配置的是四缸汽油发动机,但我无须学习任何新的驾驶技能就能开全轮驱动的电动汽车,这就是因为标准化的方向盘和脚踏板(API)将发动机和传动系统的复杂细节隐藏起来了。同样,更换汽车的发动机、替换其方向盘和轮胎、升级其排气系统后,驾驶员依然能够驾驶它,而无须学习任何新的驾驶技能。
回到正题——微服务应用。只要没有修改微服务的API,就可以在其他微服务和应用用户不会注意到的情况下对微服务进行修补或更新。
除了让微服务能够独立地更新和扩缩容,微服务设计模式还让开发团队更小、更敏捷,能够更快地迭代功能。这是基于Jeff Bezos提出的两块比萨团队规则(two pizza team rule)——如果你不能用两块比萨养活一个开发团队,那么这个团队就太大了。一般来说,与大团队相比,2~8人团队的沟通和合作的职场政治因素会更少,也会更敏捷。
微服务设计模式还有其他优点,但希望你能明白——将功能开发成独立的微服务,可以在不影响应用任何部件的情况下对它们进行开发、部署、更新、扩缩容等。
但是,微服务并不完美。如果有很多由不同团队管理的移动部件,微服务可能会变得很复杂,这需要谨慎的管理和良好的沟通。
最后,这两种设计应用的方式——单体与微服务——被称为设计模式。微服务设计模式是当前云时代最常见的模式。
因为前面已经涵盖了云原生的一些内容,所以现在说起来就比较容易了。
一个云原生应用必须能够:
● 按需扩缩容;
● 自我修复;
● 支持滚动更新;
● 可以在任何有Kubernetes的地方运行。
让我们花点儿时间来定义其中一些流行术语的含义。
按需扩缩容是指应用和相关基础设施为了满足当前需求自动增长和收缩的能力。例如,在线零售应用可能需要在特殊的假期增加基础设施和应用资源,然后在假期结束时缩小规模。如果配置正确,Kubernetes可以在需求增加时自动对应用和基础设施进行扩容,也可以在需求下降时对它们进行缩容。
这不仅有助于企业对突发变化做出更快速的反应,还能在缩容时帮助其降低基础设施的成本。
Kubernetes还可以自我修复应用和单个微服务,这需要更多关于Kubernetes的知识,将会在后面介绍。但现在要知道的是,当用户把一个应用部署到Kubernetes时,用户告诉Kubernetes这个应用应该是什么样子。例如,每个微服务有多少个实例,应该连接到哪些网络。Kubernetes将其保存为期望状态(desired state),并监视应用,以确保它始终与期望状态匹配。如果有什么变化,例如,某个微服务崩溃,Kubernetes会注意到这一点,并启动一个副本作为替代,这就是所谓的自我修复或弹性。
滚动更新是一种在不让应用离线甚至客户不会注意到的情况下更新应用的某些部分的能力。它改变了现代商业世界的游戏规则,稍后我们就可以看到它的实际效果。
关于云原生还有最后一点要讲。云原生几乎是与公有云无关的,它是一组我们讨论过的功能和能力。因此,云原生应用可以在任何有Kubernetes的地方运行,如AWS、Azure、Linode、本地数据中心或者家中的树莓派集群。
总之,云原生应用是具有弹性的、可以自动扩缩容的,并且可以在不停机的情况下进行更新。它们还可以在任何拥有 Kubernetes的地方甚至是内部环境运行。
借助一个类比可以更好地解释编排器这个概念。
一个管弦乐队由一群演奏不同乐器的音乐家组成。每位音乐家都可以用不同的乐器,在演奏开始后发挥着不同的作用,乐器包括小提琴、大提琴、竖琴、双簧管、长笛、单簧管、小号、长号、鼓,甚至三角琴。每一个音乐家在管弦乐队中扮演着不同的角色。
在图1-3中,每位乐器都是独立的个体,还没有被指定扮演什么样的角色——这简直是一团糟,鼓甚至是上下颠倒的。
图1-3
一位指挥家拿着乐谱和指挥棒走过来,维持秩序。她把弦乐器都安排到舞台前面,木管乐器安排在中间,铜管乐器安排在后面一点儿,打击乐器安排在后面高一些的地方。她还指挥一切,告诉每组乐器什么时候演奏、演奏多大声以及以什么速度演奏。
简而言之,指挥家将图1-3中的混乱情况变成如图1-4所示那样井井有条,以确保音乐按照作曲家的意图演奏。
云原生微服务应用就像管弦乐队。
每个云原生应用都是由很多小的微服务组成的,它们各司其职:有的服务于Web请求,有的用于认证会话,有的进行日志记录,有的用于持久化数据,还有一些生成报告。但就像一个管弦乐队一样,它们需要有人或某种东西将它们组织成一个有用的应用。
图1-4
由此,我们真正走进Kubernetes世界。
Kubernetes将独立的微服务组织成一个有意义的应用,如图1-5所示。如前所述,它可以对应用进行扩缩容、自我修复和更新等操作。
图1-5
总之,像Kubernetes这样的编排器将不同的微服务组合在一起,并将它们组织成一个有用的应用。它还提供并管理云原生功能,如扩缩容、自我修复和更新。
“Kubernetes”这个名字来自希腊语,意思是“舵手”。舵手是一个航海/航行术语,指掌舵的人,如图1-6所示。
图1-6
船的轮子称为“舵”,这显然是Kubernetes标志(如图1-7所示)的由来。
然而,如果仔细观察,你会发现Kubernetes标志的轮子有7根辐条,而不是通常的6根或8根。这是因为Kubernetes最初是基于谷歌公司的一个内部工具Borg开发的,而创始人想用著名的《星际迷航》中的博格个体“九之七”(Seven of Nine)来命名Kubernetes。
图1-7
如果你非常熟悉《星际迷航》就会知道,“九之七”是在星历25479年被凯瑟琳·珍妮薇(Kathryn Janeway)舰长指挥的航海家号船员救出的博格个体。遗憾的是,版权法不允许Kubernetes使用“九之七”这个名字,但Kubernetes的创始人希望以某种形式引用Borg和《星际迷航》的典故,所以他们赋予了标志7个辐条,以这样一种微妙的方式向“九之七”致敬。
你也许还看到Kubernetes被简称为“K8s”,其中的“8”代表Kubernetes中“K”和“s”之间的8个字符。一般来说,它的发音为“kates”,这也是人们开玩笑说Kubernetes的女朋友叫Kate的原因。
这些都不会让你更善于部署和管理云原生微服务应用,但这是很有用的背景知识。
在本章的开始,我们说Kubernetes是云原生微服务应用的编排器。
在消除了专业术语的障碍之后,你知道这意味着“Kubernetes运行和管理由小型专用部件组成的应用,这些应用可以自我修复、扩缩容和独立更新,而无须停机。”这些专用部件称为微服务,每个微服务通常部署在自己的容器中。
但是,要学的东西还有很多,你不能指望现在就什么都懂。我们会继续解释这些东西,并且会通过大量的例子进行实践,从而真正掌握这些知识。