基本信息
- 出版社 : 机械工业出版社; 第1版 (2018年12月14日)
- 出版日期 : 2019年1月1日
- 品牌 : 北京华章图文信息有限公司
- 语言 : 简体中文
- 文件大小 : 6576 KB
- 纸书页数 : 808页
- 马永亮 (作者)
- 下载格式:azw3、epub、mobi
内容简介
本书致力于帮助容器编排技术的初级和中级用户循序渐进地理解与使用Kubernetes系统,因此本书的编写充分考虑到初学者进入新知识领域时的茫然,采用由浅入深、提纲挈领、再由点到面的方式讲解每一个知识细节。对于每个知识点,不仅介绍了其概念和用法,还分析了为什么要有这个概念,实现的方式是什么,背后的逻辑为何,等等,使读者不仅能知其然,还能知其所以然。本书不仅要带领读者入门,更是一本可以随时动手加以验证的实践手册,而且对于部分重要的内容还会专门一步步地给出具体的实操案例,帮助读者在实践中升华对概念的理解。本书几乎涵盖了应用Kubernetes系统的所有主流知识点,它甚至可以作为计划考取CKA认证的读者的配套参考图书。
前言
前言
为什么要写这本书
作为置身于IT技术领域多年的实践者和教育者,我们一直盼望着行业迎来这样一个时刻:异构的IT基础设施环境所造成的开发和部署系统应用纷繁复杂的局面终于迎来了终结者,开发人员无须再考虑复杂多样的运行环境下软件程序的移植问题,运维人员不用再手动解决运行环境中组件间的依赖关系等,从而让各自的核心职责都回归到开发和保证系统稳定运行本身。终于,以Docker为首的容器技术为此带来了基础保障,并在容器编排技术的支撑下尘埃落定,甚至连IT管理者心心念念多年的DevOps文化运动也借此找到了易于落地的实现方案。于是,系统运行割据多年的局面终于将走向天下一统。
尽管距Kubernetes 1.0的发布不过三四年的光景,但其如今的影响力在IT技术领域完全算得上空前绝后,目前,一众大小公司都在使用或正筹划使用这一IT技术发展史上可能最为成功的开源项目。Linux软件基金会的常务董事Jim Zemlin在Google Cloud Next 17大会上曾表示,Kubernetes是“云时代的Linux”。的确,Kubernetes应该是开源世界有史以来迭代最快的项目,而且在几乎所有需要采用容器技术的场景里成为占统治地位的解决方案,其发展速度恐怕也仅有Linux内核项目可堪匹敌。2018年3月,Kubernetes成为CNCF旗下“毕业”的第一个项目,并荣获2018年OSCON最具影响力奖项。
目前,Kubernetes保持着每年发布四个重要版本的节奏,版本的每次更新都会引入数个新特性。这种快速迭代的机制在为用户不断带来惊喜的同时,也给他们在学习和使用上造成了一些困扰:相关领域的可参考书籍仍不丰富,互联网上可以得到的众多文档并非源于同一个版本,以及厘清脉络拼凑成完整的知识框架所需的时间成本较大。因此,我在课程以及直接或间接参与生产或测试环境的交付之余便萌生了撰写一本Kubernetes入门、进阶与实战的书籍的想法,将自己学习和使用的经验总结、沉淀并分享给更多有此需求的技术同行,帮助大家快速找到入门路径,降低时间成本,并迅速投入测试和生产之用。
的确,在写作过程中,Kubernetes这种快速迭代的机制,以及每每引入的新特性,在小惊喜之余带给笔者更多的却是真真切切的梦魇般的恐惧感:在一年多的写作时间里,许多章节几易其稿,却也依然无法确保能够涵盖即将成为核心功能的特性,于是沮丧感几度如影随形,直到自我安慰着“基础的核心特性基本不会发生大的变动,只要能帮助读者弄清楚Kubernetes系统的基础架构及核心工作逻辑就算工夫没有白费”之后方才释然。于是便有了这本力图尽量多地包罗Kubernetes系统目前主流特性及实践路径的入门和进阶之书、工具之书。
本书特色
本书致力于帮助容器编排技术的初级和中级用户循序渐进地理解与使用Kubernetes系统,因此本书的编写充分考虑到初学者进入新知识领域时的茫然,采用由浅入深、提纲挈领、再由点到面的方式讲解每一个知识细节。对于每个知识点,不仅介绍了其概念和用法,还分析了为什么要有这个概念,实现的方式是什么,背后的逻辑为何,等等,使读者不仅能知其然,还能知其所以然。
本书不仅要带领读者入门,更是一本可以随时动手加以验证的实践手册,而且对于部分重要的内容还会专门一步步地给出具体的实操案例,帮助读者在实践中升华对概念的理解。本书几乎涵盖了应用Kubernetes系统的所有主流知识点,它甚至可以作为计划考取CKA认证的读者的配套参考图书。
读者对象
·云计算工程师
·运维工程师
·系统开发工程师
·程序架构师
·计划考取CKA认证的人员
·其他对容器编排感兴趣的人员
如何阅读本书
阅读使用本书之前,读者需要具备Docker容器技术的基础使用能力。本书逻辑上共分为五大部分,15章。
第一部分(第1~2章),介绍Kubernetes系统的基础概念及其基本应用。
第1章介绍容器编排系统出现的背景,以及Kubernetes系统的功能、特性、核心概念、系统组件及应用模型。
第2章讲解Kubernetes的核心对象,以及直接使用命令管理资源对象的快速入门技巧。
第二部分(第3~6章),介绍核心资源类型及其应用。
第3章介绍资源管理模型、陈述式与声明式资源管理接口,并通过命令对比说明两种操作方式的不同之处。
第4章介绍Pod资源的常用配置、生命周期、存储状态和就绪状态检测,以及计算资源的需求及限制等。
第5章介绍Pod控制器资源类型,重点讲解了控制无状态应用的ReplicaSet、Deployment、DaemonSet控制器,并介绍了Job和CronJob控制器。
第6章介绍Service和Ingress资源类型,涵盖Service类型、功用及其实现,以及Ingress控制器、Ingress资源的种类及其实现,并通过案例详细说明了Ingress资源的具体使用方式。
第三部分(第7~9章),介绍存储卷及StatefulSet控制器。
第7章主要介绍存储卷类型及常见存储卷的使用方式、PV和PVC出现的原因及应用,以及存储类资源的应用和存储卷的动态供给。
第8章介绍使用一等资源类型ConfigMap和Secret为容器应用提供配置及敏感信息的方式。
第9章主要介绍有状态应用的Pod控制器资源StatefulSet,包括基础应用、动态扩缩容及更新机制等。
第四部分(第10~11章),介绍安全相关的话题,主要涉及认证、授权、准入控制、网络模型与网络策略。
第10章重点讲解认证方式、Service Account和TLS认证、授权插件类型及RBAC,并于章节的最后介绍LimitRanger、ResourceQuota和PodSecurityPolicy三种类型的准入控制器及相关的资源类型。
第11章主要介绍网络插件基础及flannel的三种后端实现与应用、借助Canal插件实现网络策略的方式,以及Calico网络插件的基础使用。
第五部分(第12~15章),介绍Kubernetes系统的高级话题。
第12章介绍Pod资源的调度策略及高级调度方式的应用,包括节点亲和、Pod资源亲和以及基于污点和容忍度的调度。
第13章介绍系统资源的扩展方式,包括自定义资源类型、自定义资源对象、自定义API及控制器、Master节点的高可用、基于Kubernetes的PaaS系统等话题。
第14章介绍资源指标、自定义指标、监控系统及HPA控制器的应用。
第15章介绍简化应用管理的工具Helm,并基于Helm介绍如何为Kubernetes系统提供统一的日志收集与管理工具栈EFK。
有一定Kubernetes使用经验的读者可以挑选感兴趣的章节阅读。而对于初学者,建议从基础部分逐章阅读,但构建在Kubernetes系统之上的应用多数都要求读者能熟练使用相关领域的知识和技能,如果对某些内容的理解比较困难,那么可能是由于相关知识欠缺,建议读者通过其他资料补充学习相关知识后再阅读本书。编撰本书的主要意图是为初学者提供一个循序渐进的实操手册,不过,任何读者也都可以将它作为一本案头的工具书随时进行查阅。
排版约定
本书中所有的命令都附带了或长格式或短格式的命令提示符,以便读者区分文中正常使用的“#”和“$”,命令提示格式为“~]#”或“~]$”,较长的命令使用了“\”为续行符,且命令及其输出使用了有别于正文的字体。
更多内容和附带代码
本书相关的配置清单等都放置于https://github.com/ikubernetes/的相关仓库中,在实践中需要时可直接克隆至本地实验环境中使用。
勘误和支持
尽管进行授课及技术写作已十数年,但动笔著书尚属首次,考虑到排版印刷后的表述无可更改,整个写作过程战战兢兢、如履薄冰。进行每一个关键话题的表述之前都查阅了大量资料,并且反复斟酌,既期望能够将知识点清晰、准确地加以描述,也试图避免因自己的理解偏差而误导读者。尽管如此,由于笔者水平有限,加之编写时间仓促,书中难免存在不妥之处,恳请读者批评指正。如果读者有更多的宝贵意见,请通过邮箱mage@magedu.com联系我,期待能够得到你们的真挚反馈,在技术之路上互勉共进。另外,本书的勘误将会发布在笔者的博客(//www.ilinux.io)或本书专用的GitHub主页(https://github.com/ikubernetes)上,欢迎读者朋友们关注并留言讨论。
参考资料
对于具有不同知识基础和结构的读者来说,仅凭一本书的内容根本不足以获取所需的全部信息,大家还可以通过以下信息获取关于Kubernetes系统的更多资料,本书在写作期间也从这些参考资料中获得了很大的帮助。
·Kubernetes Documentation和Kubernetes API Reference,这是提供Kubernetes领域相关知识最全面、最深入和最准确的参考材料。
·《Kubernetes in Action》,本书的谋篇布局及写作理念与此书不谋而合,因此笔者在本书中对许多概念的理解和验证也以此书为素材,并且在写作之时有多处概念的描述也借鉴了此书的内容。
·Red Hat Openshift Documentation,Red Hat公司的产品文档规范、权威、细致且条理清晰,是不可多得的参考材料。
·The New Stack的技术文章及调研报告是了解Kubernetes系统技术细节和行业应用现状及趋势的不可多得的优秀资源。
·Bitnami及Heptio站点上的博客文章提供了深入了解和学习Kubernetes系统某个特定技术细节的可靠资料。
另外,本书还大量借鉴了通过搜索引擎所获取到的不少技术文章和参考文档,在这里一并向这些书籍和文章的作者表示深深的谢意!
致谢
感谢Kubernetes社区创造性的劳动成果和辛苦付出,我们因此有了学习和使用如此优秀的开源系统的可能性,这也是本书得以编撰的基石。
感谢我的同事们在我写作期间给予的支持和理解,他们的努力让我拥有了得以放心写作的时间和精力。感谢提供了相关行业信息并促使我下定决心开始编写此书的张常安和张士杰先生,本书的写作过程中也得到了他们支援的宝贵素材。
感谢参加了我的课程(马哥教育)的学员朋友们,大家的学习热情及工作中源源不断反馈而来的信息与需求在不同程度上帮助我一直保持着对技术的追求和热忱,教学相长在此得到了充分的体现。
感谢机械工业出版社华章公司高婧雅女士对本书写作的悉心指导,以及对我本人的包容和理解。
最后要特别感谢我的家人,为写作这本书,我牺牲了很多陪伴他们的时间,也正因为他们在生活中的关怀和鼓励才使我能够踏踏实实地完成本书内容的编写。
马永亮
2018年10月
精彩书摘
近十几年来,IT领域新技术、新概念层出不穷,例如DevOps、微服务(Microservice)、容器(Container)、云计算(Cloud Computing)和区块链(Blockchain)等,直有“乱花渐欲迷人眼”之势。另外,出于业务的需要,IT应用模型也在不断地变革,例如,开发模式从瀑布式(Waterfall)到敏捷(Agile)再到精益(Lean),甚至是与QA和Operations融合的DevOps,应用程序架构从单体(monolithic)模型到分层模型再到微服务,部署及打包方式从面向物理机到虚拟机再到容器,应用程序的基础架构从自建机房到托管再到云计算,等等,这些变革使得IT技术应用的效率大大提升,同时却以更低的成本交付更高质量的产品。
尤其是以Docker为代表的容器技术的出现,终结了DevOps中交付和部署环节因环境、配置及程序本身的不同而造成的动辄几种甚至十几种部署配置的困境,将它们统一在容器镜像(image)之上。如今,越来越多的企业或组织开始选择以镜像文件作为交付载体。容器镜像之内直接包含了应用程序及其依赖的系统环境、库、基础程序等,从而能够在容器引擎上直接运行。于是,IT运维工程师(operator)无须关注开发应用程序的编程语言、环境配置等,甚至连业务逻辑本身也不必过多关注,而只需要掌握容器管理的单一工具链即可。
部署的复杂度虽然降低了,但以容器格式运行的应用程序间的协同却成了一个新的亟待解决的问题,这种需求在微服务架构中表现得尤为明显。结果,以Kubernetes为代表的容器编排系统应需而生。
容器是一种轻量级、可移植、自包含的软件打包技术,它使得应用程序可以在几乎任何地方以相同的方式运行。软件开发工程师在自己笔记本上创建并测试完成的容器,无须任何修改就能够在生产系统的虚拟机、物理机或云主机上运行。
容器由应用程序本身和它的环境依赖(库和其他应用程序)两部分组成,并在宿主机(Host)操作系统的用户空间中运行,但与操作系统的其他进程互相隔离,它们的实现机制有别于诸如VMWare、KVM和Xen等实现方案的传统虚拟化技术。容器与虚拟机的对比关系如图1-1所示。
图1-1 容器和虚拟机对比(//www.nuagenetworks.net/blog/containers/)
由于同一个宿主机上的所有容器都共享其底层操作系统(内核空间),这就使得容器在体积上要比传统的虚拟机小得多。另外,启动容器无须启动整个操作系统,所以容器部署和启动的速度更快,开销更小,也更容易迁移。事实上,容器赋予了应用程序超强的可移植能力。
IT系统在架构上已经迭代数十年之久,其环境复杂程度日趋加重,直有积重难返之势。现如今,应用程序开发人员通常需要同时使用多种服务构建,并要架构IT信息系统,涉及MQ、Cache和DB等,且很可能要部署到不同的环境中,如物理服务器、虚拟服务器、私有云或公有云之上。这些不同的主机或许还有着不同的系统环境,如RHEL、Debian或SUSE等Linux发行版,甚至是UNIX、Windows等。
结果,一方面应用程序包含了多种服务,每种服务均可能存在依赖的库和软件包;另一方面存在多种部署环境,而服务在运行时又可能需要动态迁移到不同的环境中。于是,各种服务和环境通过排列组合产生了一个大部署矩阵。应用程序开发工程师在编写代码时需要考虑不同的运行环境,而运维工程师则需要为不同的服务和平台配置环境。对他们双方来说,这都必将是一项困难而艰巨的任务。
幸运的是,货运系统的集装箱机制为解决这个难题提供了有效的借鉴方案。Docker正是将集装箱思想运用到软件打包上,为代码提供了一个基于容器的标准化运输系统。Docker可以将几乎任何应用程序及其依赖的运行环境都打包成一个轻量级、可移植、自包含的容器,并能够运行于支持Docker容器引擎的所有操作系统之上。简言之,容器的优势主要表现在以下两个方面。
·应用程序开发工程师:“一次构建,到处运行”(Build Once,Run Anywhere)。容器意味着环境隔离和可重复性,开发人员只需为应用创建一个运行环境,并将其打包成容器便可在各种部署环境上运行,并与它所在的宿主机环境隔离。
·运维工程师:“一次配置,运行所有”(Configure Once,Run Anything)。一旦配置好标准的容器运行时环境,服务器就可以运行任何容器,这使得运维人员的工作变得更高效、一致和可重复。容器消除了开发、测试、生产环境的不一致性。
容器技术的概念最初出现在2000年,当时称为FreeBSD jail,这种技术可将FreeBSD系统分区为多个子系统(也称为Jail)。2001年,通过Jacques Gélinas的VServer项目,隔离环境的实施理念进入了Linux领域。
Jail的目的是让进程在经过修改的chroot环境中创建,而不会脱离和影响整个系统—chroot环境对文件系统、网络和用户的访问都实现了虚拟化。然而,Jail在实施方面存在着不少的局限性,当它与Namespaces和CGroups等技术结合在一起之后,才让这种隔离方法从构想变为了现实。后来,Linux容器项目(LXC)又为其添加了一些用户常用的工具、模板、库和语言绑定,从而较好地改善了用户使用容器技术时的体验。
Docker在LXC项目的基础上,从文件系统、网络互联到进程隔离等方面对容器技术进行了进一步的封装,极大地简化了容器的创建和维护过程,从而促进了容器技术的大流行。Docker最初是由dotCloud公司创始人Solomon Hykes在法国期间发起的一个公司内部项目,并于2013年3月以Apache 2.0授权协议开源,其项目代码托管于GitHub之上。虽然其最初的实现是基于LXC项目的,但Docker在后来的0.7版本转为使用自行开发的libcontainer容器引擎,而1.11版本又将其换作了runC和containerd。
提示 在2017年4月举行的DockerCon上,Docker公司将GitHub上原本隶属于Docker组织的Docker项目直接转移到了一个新的名为Moby的组织下,并将其重命名为Moby项目。