Kubernetes实战(txt+pdf+epub+mobi电子书下载)


发布时间:2020-09-05 01:20:52

点击下载

作者:吴龙辉

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

Kubernetes实战

Kubernetes实战试读:

前言

随着互联网技术在各领域的广泛应用,所产生的海量数据催生了大数据的诞生。而对于数据中心的需求激活了云计算井喷式的发展,一时间大数据和云计算成为各个企业争夺的战略高地。

在云计算领域的服务模式中,IaaS和SaaS模式已经趋于成熟,因此PaaS就成了全球各大IT巨头和初创公司的焦点,其中的竞争异常激烈。大量的PaaS平台出现,又很快被淘汰,整个行业发生着巨大的迭代更替。正所谓物竞天择,在这样一个激荡变化的背景下,以Docker为代表的容器技术脱颖而出并极速发热,风头无两,大多数主流云厂商已经宣布提供对Docker及其生态系统的支持。容器技术具备融合DevOps的敏捷特性,给云计算市场特别是PaaS市场带来了新的变革力量,Kubernetes就是新一轮变革中产生的一个代表性产品。

Kubernetes是Google开源的容器集群管理系统,它对于容器运行时、编排、常规服务都抽象设计出了准确完整的API,并以此建立起一个开放开源的系统,符合企业化需求,每家企业都可以以此搭建出自动化和标准化的底层平台,以优化研发和运营效率。Kubernetes可以说是Google借助着容器领域的爆发,对于其巨大规模数据中心管理的丰富经验的一次实践,旨在建立新的技术业界标准。

展望未来,我们认为将有更多的企业被迫面对互联网规模所带来的各类难题,Kubernetes和Docker技术可以提供应对这些挑战的解决方案。而随着更多企业的加入,会有更多的人以协作方式构建出更强大的技术堆栈和更多的创新成果,整个行业将朝着更好的方向持续迈进,对此我们乐观其成。

本书特点

本书采用的是理论加实战的模式,结合大量案例由浅入深讲解Kubernetes的各个方面,包括平台架构、基础核心功能、网络、安全和资源管理,以及整个生态系统的组成。技术信息完全来源于Kubernetes开源社区的文档、代码的提炼和总结。本书涉及的Kubernetes内容与官方最新版本同步,包含最新版本的所有新特性说明,并且因为Kubernetes同Docker深度集成,所以本书也会阐述Docker相关的技术话题。

本书的读者对象

本书适用于希望学习和使用Kubernetes以及正在寻找管理数据中心解决方案的软件工程师和架构师,同时本书可以作为Docker的高级延伸书籍,用于搭建基于Kubernetes+Docker的PaaS平台,实践DevOps。

本书的组织结构

本书在组织结构上分成三部分:Kubernetes基础篇、Kubernetes高级篇和Kubernetes生态篇。基础篇可帮助读者认识Kubernetes,并理解其架构和核心概念,同时能够部署和使用Kubernetes完成基本功能操作。高级篇将深入讲解Kubernetes的网络、安全和资源管理等话题,帮助读者掌握管理Kubernetes的能力。生态篇则介绍与Kubernetes密切相关的开源软件,包括CoreOS、Etcd和Mesos,使读者对于Kubernetes生态系统有全面的了解。第1部分Kubernetes基础篇第1章 Kubernetes介绍第2章 Kubernetes的架构和部署第3章 Kubernetes快速入门第4章 Pod第5章 Replication Controller第6章 Service第7章 数据卷第8章 访问Kubernetes API第1章Kubernetes介绍

Kubernetes可以说是云计算PaaS领域的集大成者,它借助了最好的帮助,并且在最适当的时间推出,从而得到了最多的关注。本章首先从整个行业背景介绍入手,介绍Kubernetes诞生的前因,并阐述Kubernetes的优势和发展历程,最后说明Kubernetes中的基本概念,帮助读者对Kubernetes有一个初步但全面的认识。1.1 为什么会有Kubernetes1.1.1 云计算大潮

云计算(Cloud Computing)作为一个新兴领域,它是多种技术混合演进的结果,在许多大公司和初创企业的共同推动下,发展极为迅速并且持续火热,带来了新一轮的IT变革。云计算带给企业的创新能力和发展空间是不可想象的,我们所有人都正处于云计算大潮中。

云计算从狭义上讲,指IT基础设施的交付和使用模式,即通过网络以按需、易扩展的方式获取所需资源。广义上则指服务的交付和使用模式,通过网络以按需、易扩展的方式获取所需服务。提供资源的网络被形象地比喻成“云”,其计算能力通常是由分布式的大规模集群和虚拟化技术提供的。而“云”中的计算资源在用户看来是可以扩展,并且可以随时获取、按需使用的。

云计算彻底改变了人们对计算资源的使用方式,有一个形象的比喻说明了云计算革命性的影响:“云”好比一个发电厂,互联网好比是输电线路,只不过这个发电厂对外提供的是IT服务,这种服务将通过互联网传输到千家万户。云计算实现了计算资源从单台发电机供电模式向电厂集中供电模式的转变。

业界根据云计算提供服务资源的类型将其划分为三大类:基础设施即服务(Infrastructure-as-a-Service,IaaS)、平台即服务(Platform-as-a-Service,Paas)和软件即服务(Software-as-a-Service,SaaS),如图1-1所示。图1-1 云计算的三层架构• 基础设施即服务

基础设施即服务(IaaS)通过虚拟化和分布式存储等技术,实现了对包括服务器、存储设备、网络设备等各种物理资源的抽象,从而形成了一个可扩展、可按需分配的虚拟资源池。IaaS对外呈现的服务是各种基础设置,例如虚拟机、磁盘以及主机互联而成的网络,这些虚拟机中可以运行Windows系统,也可以运行Linux系统,在用户看来,它与一台真实的物理机是没有区别的。目前最具代表性的IaaS产品有Amazon AWS,其提供了虚拟机EC2和云存储S3等服务。• 平台即服务

平台即服务(PaaS)为开发者提供了应用的开发环境和运行环境,将开发者从烦琐的IT环境管理中解放出来。自动化应用的部署和运维,使开发者能够集中精力于应用业务开发,极大地提升了应用的开发效率。可以说,PaaS主要面向的是软件专业人员,Google的GAE是PaaS的鼻祖,而Kubernetes可以说是在PaaS的定义范畴内。• 软件即服务

软件即服务(SaaS)主要面向使用软件的终端用户。一般来说,SaaS将软件功能以特定的接口形式发布,终端用户通过网络浏览器就可以使用软件功能。终端用户将只关注软件业务的使用,除此之外的工作,如软件的升级和云端实现,对终端用户来说都是透明的。SaaS是应用最广的云计算模式,比如我们在线使用的邮箱系统和各种管理系统都可以认为是SaaS的范畴。

综上所述,可以简单地概括为:SaaS通过网络运行,为最终用户提供应用服务;PaaS是一套工具服务,可以为编码和部署应用程序提供快速、高效的服务;IaaS包括硬件和软件,例如服务器、存储、网络和操作系统。

与SaaS相比,PaaS和IaaS的概念和技术相对较新,图1-2比较了传统IT、IaaS和PaaS。假设现在要上线一项新业务,传统IT的做法就是自下而上地搭建部署、购置硬件、配置网络、安装操作系统、部署中间件系统,到最后业务上线。使用IaaS的客户则无须关心操作系统以下的实现,Paas更进一步封装操作系统、中间件和运行时,形成标准式的业务发布平台,提供智能化运维能力。这是一种递进式的演化,一步一步地将技术栈分层分级,将资源进行整合管理,可极大提高效率。图1-2 传统IT、IaaS和PaaS的比较

正是由于云计算的强大优势,越来越多的公司进入这波潮流中,形成了百家齐放的场面。在云计算的不同层次,在各个行业的不同领域,都涌现出一大批云计算产品,整个云计算市场正在高速发展。1.1.2 不温不火的PaaS

在SaaS的成熟和IaaS的高速发展催生下,特别是在Amazon、Google、Salesforce、Microsoft等公司的推动下,PaaS得到了长足的发展,越来越多的人开始谈论和关注PaaS,包括运营商、互联网巨头、传统IT厂商、咨询和集成商、IT技术媒体等。但是PaaS的发展可以说是一波三折,可以分为三个阶段。• 第一代PaaS

比如GAE(Google App Engine)、SAE(Sina App Engine)。这是早期的PaaS,当时并没有PaaS这个概念,现在看来是包含在PaaS范围内的。• 第二代PaaS

比如Cloud Foundry、Openshift。这是各大IaaS(如Amazon AWS、OpenStack)流行之后,顺势推出的PaaS,并且发展迅速。其中Cloud Foundry是VMware于2011年推出的业界第一个开源PaaS云平台,后来分拆出Pivotal公司进行接管,2014创立Cloud Foundry基金会进行运作。技术和模式相比第一代PaaS都有一定的提高,在云计算大潮中引领了PaaS的发展,一时成为PaaS的代表。华为云、IBM BlueMix、HP Cloud和Dell云服务都采用了Cloud Foundry作为基础。

但是这个阶段的PaaS不管是在市场份额,还是提升速度上都处于弱势,用户对PaaS的兴趣似乎也不大。同时,随着各种云服务之间界限的逐步模糊,一部分人甚至认为PaaS将最终消亡或成为IaaS或者SaaS的一个功能,PaaS处于不温不火的尴尬位置。• 第三代PaaS

在Docker火爆之后,利用Docker的特性构建出许多PaaS,比如Kubernetes。这些PaaS更加灵活,更加适应企业,逐渐成为PaaS的主力。1.1.3 Docker的逆袭

Docker是一种Linux容器工具集,它是为构建(Build)、交付(Ship)和运行(Run)分布式应用而设计的。作为DotCloud公司的开源项目,其首发版本的时间是2013年3月。该项目很快就受到欢迎,这也使得DotCloud公司将其品牌改为Docker,并最终将其原有的PaaS业务出售而专注在Docker上,Docker完成了华丽的逆袭。

Docker设计理论来自集装箱,假设交付运行环境如同海运,操作系统如同一艘货轮,每一个在操作系统基础上运行的软件都如同一个集装箱,用户可以通过标准化手段自由组装运行环境,同时集装箱的内容可以由用户自定义,也可以由专业人员制造。这样,交付一个软件,就是一系列标准化组件的集合的交付,如同搭建乐高积木,用户只需选择合适的积木组合,并且在顶端署上自己的名字,最后这个标准化组件就是用户的应用。

基于这个理念,在技术实现上,Docker利用容器(Container)来实现类似虚拟机的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源。同虚拟机的方式不同,容器并不是一套硬件虚拟化方法,也无法归属到全虚拟化、部分虚拟化和半虚拟化中的任意一个,而是一个操作系统级虚拟化方法。

Docker容器技术的优势有以下几点。• 一次构建,到处运行

当将容器固化成镜像后,可以快速地加载到任何环境中部署运行。而构建出来的镜像打包了应用运行所需的程序、依赖和运行环境,这是一个完整可用的应用集装箱,在任何环境下都能保证环境的一致性。• 容器的快速轻量

容器的启动、停止和销毁都是以秒或毫秒为单位的,并且相比传统的虚拟化技术,使用容器在CPU、内存,网络I/O等资源上的性能损耗都有同样水平甚至更优的表现。• 完整的生态链

容器技术并不是Docker首创,但是以往的容器实现只关注于如何运行,而Docker站在巨人的肩膀上进行了整合和创新,特别是Docker镜像的设计,完美地为容器从构建、交付到运行提供了完整的生态链支持。

Docker 1.0在2014年6月发布,而且延续了之前每月发布一个版本的节奏。其1.0版本标志着Docker公司认为Docker平台已经足够成熟,并可以被应用到生产环境中。每月的版本更新显示出该项目正在快速发展,比如增加新的特性,解决发现的问题等。

Docker的持续火热是有着坚实的基础来支撑的。Docker吸引了业界众多知名大牌厂家的支持,其中包括Amazon、Canonical、CenturyLink、Google、IBM、Microsoft、New Relic、Pivotal、Red Hat和VMware,这使得只要在有Linux的地方,Docker就几乎随处可用。除了这些大厂,许多初创企业也围绕着Docker来发展,或是将他们的发展方向和Docker更好地结合起来。所有这些合作伙伴都驱动着Docker核心项目和周边生态系统的快速发展。

更重要的是Docker的流行和标准化,激活了一直不温不火的PaaS,随之而来的是各类Micro-PaaS的出现,Kubernetes是其中最具代表性的一员。1.2 Kubernetes 是什么

Kubernetes是Google开源的容器集群管理系统。它构建在Docker技术之上,为容器化的应用提供资源调度、部署运行、服务发现、扩容缩容等一整套功能,本质上可看作是基于容器技术的Micro-PaaS平台,即第三代PaaS的代表性项目。

Google从2004年起就已经开始使用容器技术了,于2006年发布了Cgroup,而且内部开发了强大的集群资源管理平台Borg和Omega,这些都已经广泛使用在Google的各个基础设施中,而Kubernetes的灵感来源于Google的内部Borg系统,更是吸收了包括Omega在内的容器管理器的经验和教训。

Kubernetes,古希腊语是舵手的意思,也是Cyber的词源,Kubernetes利用Google在容器技术上的实践经验和技术积累,同时吸取Docker社区的最佳实践,已经成为云计算服务的舵手。

Kubernetes有着如下的优秀特性。• 强大的容器编排能力

Kubernetes可以说是同Docker一起发展起来的,深度集成了Docker,天然适应容器的特点,设计出强大的容器编排能力,比如容器组合、标签选择和服务发现等,可以满足企业级需求。• 轻量级

Kubernetes遵循微服务架构理论,整个系统划分出各个功能独立的组件,组件之间边界清晰,部署简单,可以轻易地运行在各种系统和环境中。同时,Kubernetes中的许多功能都实现了插件化,可以非常方便地进行扩展和替换。• 开放开源

Kubernetes顺应了开放开源的趋势,吸引了大批开发者和公司参与其中,协同工作共同构建生态圈。同时,Kubernetes同OpenStack、Docker等开源社区积极合作、共同发展,企业和个人都可以参与其中并获益。1.3 Kubernetes的发展历史

Kubernetes自推出后迅速得到关注和参与,2015年7月经过400多位贡献者一年的努力,多达14,000次代码提交,Google正式对外发布了Kubernetes v1.0,意味着这个开源容器编排系统可以正式在生产环境中使用。与此同时,谷歌联合Linux基金会及其他合作伙伴共同成立了CNCF基金会(Cloud Native Computing Foundation),并将Kubernetes作为首个编入CNCF基金会管理体系的开源项目,助力容器技术生态的发展进步。

Kubernetes的发展里程碑如下所示。

• 2014年6月:谷歌宣布Kubernetes开源。

• 2014年7月:Microsoft、Red Hat、IBM、Docker、CoreOS、Mesosphere和Saltstack加入Kubernetes。

• 2014年8月:Mesosphere宣布将Kubernetes作为框架整合到Mesosphere生态系统中,用于Docker容器集群的调度、部署和管理。

• 2014年8月:VMware加入Kubernetes社区,Google产品经理Craig Mcluckie公开表示,VMware将会帮助Kubernetes实现利用虚拟化来保证物理主机安全的功能模式。

• 2014年11月:HP加入Kubernetes社区。

• 2014年11月:Google容器引擎Alpha启动,谷歌宣布GCE支持容器及服务,并以Kubernetes为构架。

• 2015年1月:Google和Mirantis及伙伴将Kubernetes引入OpenStack,开发者可以在OpenStack上部署运行Kubernetes应用。

• 2015年4月:Google和CoreOS联合发布Tectonic,它将Kubernetes和CoreOS软件栈整合在了一起。

• 2015年5月:Intel加入Kubernetes社区,宣布将合作加速Tectonic软件栈的发展进度。

• 2015年6月:Google容器引擎进入beta版。

• 2015年7月:Google正式加入OpenStack基金会,Kubernetes产品经理Craig McLuckie宣布Google将成为OpenStack基金会的发起人之一,Google将把他的容器计算的专家技术带入OpenStack,以提高公有云和私有云的互用性。

• 2015年7月:Kubernetes v1.0正式发布。1.4 Kubernetes的核心概念1.4.1 Pod

Pod是若干相关容器的组合,Pod包含的容器运行在同一台宿主机上,这些容器使用相同的网络命名空间、IP地址和端口,相互之间能通过localhost来发现和通信。另外,这些容器还可共享一块存储卷空间。在Kubernetes中创建、调度和管理的最小单位是Pod,而不是容器,Pod通过提供更高层次的抽象,提供了更加灵活的部署和管理模式。1.4.2 Replication Controller

Replication Controller用来控制管理Pod副本(Replica,或者称为实例),Replication Controller确保任何时候Kubernetes集群中有指定数量的Pod副本在运行。如果少于指定数量的Pod副本,Replication Controller会启动新的Pod副本,反之会杀死多余的副本以保证数量不变。另外,Replication Controller是弹性伸缩、滚动升级的实现核心。1.4.3 Service

Service是真实应用服务的抽象,定义了Pod的逻辑集合和访问这个Pod集合的策略。Service将代理Pod对外表现为一个单一访问接口,外部不需要了解后端Pod如何运行,这给扩展和维护带来很多好处,提供了一套简化的服务代理和发现机制。1.4.4 Label

Label是用于区分Pod、Service、Replication Controller的Key/Value对,实际上,Kubernetes中的任意API对象都可以通过Label进行标识。每个API对象可以有多个Label,但是每个Label的Key只能对应一个Value。Label是Service和Replication Controller运行的基础,它们都通过Label来关联Pod,相比于强绑定模型,这是一种非常好的松耦合关系。1.4.5 Node

Kubernetes属于主从分布式集群架构,Kubernetes Node(简称为Node,早期版本叫作Minion)运行并管理容器。Node作为Kubernetes的操作单元,用来分配给Pod(或者说容器)进行绑定,Pod最终运行在Node上,Node可以认为是Pod的宿主机。第2章Kubernetes的架构和部署

Kubernetes遵循微服务架构理论,整个系统划分出各个功能独立的组件,组件之间边界清晰,部署简单,可以轻易地运行在各种系统和环境中。本章将首先介绍Kubernetes的架构和各个组件的功能,然后详细说明如何从头开始部署一套完整的Kubernetes运行环境,包括Kubernetes提供的各种扩展插件(Cluster Add-on)的安装方式。2.1 Kubernetes的架构和组件

Kubernetes属于主从分布式架构,节点在角色上分为Master和Node,如图2-1所示。图2-1 Kubernetes的架构

Kubernetes使用Etcd作为存储中间件,Etcd是一个高可用的键值存储系统,灵感来自于ZooKeeper和Doozer,通过Raft一致性算法处理日志复制以保证强一致性。Kubernetes使用Etcd作为系统的配置存储中心,Kubernetes中的重要数据都是持久化在Etcd中的,这使得Kubernetes架构的各个组件属于无状态,可以更简单地实施分布式集群部署。

Kubernetes Master作为控制节点,调度管理整个系统,包含以下组件。

• Kubernetes API Server:作为Kubernetes系统的入口,其封装了核心对象的增删改查操作,以REST API接口方式提供给外部客户和内部组件调用。它维护的REST对象将持久化到Etcd中。

• Kubernetes Scheduler:负责集群的资源调度,为新建的Pod分配机器。这部分工作分出来变成一个组件,意味着可以很方便地替换成其他的调度器。

• Kubernetes Controller Manager:负责执行各种控制器,目前已经实现很多控制器来保证Kubernetes的正常运行,主要包含的控制器如表2-1所示。表2-1 Kubernetes 控制器

Kubernetes Node是运行节点,用于运行管理业务的容器,包含以下组件。

• Kubelet:负责管控容器,Kubelet会从Kubernetes API Server接收Pod的创建请求,启动和停止容器,监控容器运行状态并汇报给Kubernetes API Server。

• Kubernetes Proxy:负责为Pod创建代理服务,Kubernetes Proxy会从Kubernetes API Server获取所有的Service,并根据Service信息创建代理服务,实现Service到Pod的请求路由和转发,从而实现Kubernetes层级的虚拟转发网络。

• Docker:Kubernetes Node是容器运行节点,需要运行Docker服务,目前Kubernetes也支持Rocket,这是一款CoreOS开发的类Docker的开源容器引擎,本书只说明Docker。2.2 部署Kubernetes

Kubernetes能够运行在各个平台上,包括物理机、虚拟机和云平台。在部署方式上,Kubernetes可以在生产环境中大规模地进行分布式部署,也可以简单地运行在单机中以用于测试开发,我们可以根据不同的需求搭建不同的Kubernetes运行环境。

Kubernetes官方和社区针对不同系统和平台提供了自动化部署脚本,具体情况如表2-2所示。表2-2 Kubernetes 部署支持

接下来我们将详细说明Kubernetes的部署步骤,同时也会涉及Kubernetes的一些概念,可以进一步帮助读者理解Kubernetes的架构和原理。2.2.1 环境准备

Kubernetes是一个分布式架构,可灵活地进行安装部署,可以部署在单机,也可以分布式部署。机器可以是物理机,也可以是虚拟机,但是需要运行Linux(x86_64)操作系统,至少1核CPU和1GB内存。

本书准备了4台虚拟机(CentOS 7.0系统)用于部署Kubernetes运行环境,包括一个Etcd、一个Kubernetes Master和三个Kubernetes Node,如表2-3所示。表2-3 Kubernetes 运行环境

使用的各种软件版本信息如表2-4所示。表2-4 软件版本

提示

本书后续的实践操作都在此套环境中运行。2.2.2 运行Etcd

Kubernetes依赖于Etcd,需要先部署Etcd,可以从Github上下载指定版本的Etcd发布包:$ wget https://github.com/coreos/etcd/releases/download/v2.2.0/etcd-v2.2.0-linux-amd64.tar.gz $ tar xzvf etcd-v2.2.0-linux-amd64.tar.gz $ cd etcd-v2.2.0-linux-amd64 $ cp etcd /usr/bin/etcd $ cp etcdctl /usr/bin/etcdctl

运行Etcd:$ etcd -name etcd \ -data-dir /var/lib/etcd \ -listen-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \ -advertise-client-urls http://0.0.0.0:2379,http://0.0.0.0:4001 \ >> /var/log/etcd.log 2>&1 &

Etcd运行后可以查询其健康状态:$ etcdctl -C http://etcd:4001 cluster-health member ce2a822cea30bfca is healthy: got healthy result from http://etcd:4001 cluster is healthy 2.2.3 获取Kubernetes发布包

Kubernetes发布包可以从Github上下载,本书使用的是Kubernetes V1.1.1版本:$ wget https://github.com/kubernetes/kubernetes/releases/download/v1.1.1/kubernetes.tar.gz$tar zxvf kubernetes.tar.gz

Kubernetes发布包中包含如下内容。

• cluster:Kubernetes自动化部署脚本。

• contrib:Kubernetes非必需程序。

• examples:Kubernetes示例配置文件。

• docs:Kubernetes文档。

• platforms:Kubernetes的命令行工具kubectl。

• server:Kubernetes组件。

• third_party:第三方程序。

Kubernetes发布包中的server/kubernetes-server-linux-amd64.tar.gz包含各个组件的可执行程序,将这些可执行程序复制到Linux系统目录/use/bin/下:$ cd kubernetes/server$ tar zxvf kubernetes-server-linux-amd64.tar.gz$ cd kubernetes/server/bin/$ find ./ -perm 755 | xargs -i cp {} /usr/bin/2.2.4 运行Kubernetes Master组件

在Kubernetes Master上需要运行以下组件:

• Kubernetes API Server

• Kubernetes Controller Manager

• Kubernetes Scheduler

• Kubernetes Proxy(可选)

Kubernetes API Server

运行Kubernetes API Server:$ kube-apiserver \--logtostderr=true --v=0 \--etcd_servers=http://etcd:4001 \--insecure-bind-address=0.0.0.0 --insecure-port=8080 \--service-cluster-ip-range=10.254.0.0/16 \>> /var/log/kube-apiserver.log 2>&1 &

Kubernetes Controller Manager

运行Kubernetes Controller Manager:$ kube-controller-manager \--logtostderr=true --v=0 \--master=http://kube-master:8080 \>> /var/log/kube-controller-manager.log 2>&1 &

Kubernetes Scheduler

运行Kubernetes Scheduler:$ kube-scheduler \--logtostderr=true --v=0 \--master=http://kube-master:8080 \>> /var/log/kube-scheduler.log 2>&1 &

Kubernetes Proxy

运行Kubernetes Proxy:$ kube-proxy \--logtostderr=true --v=0 \--api_servers=http://kube-master:8080 \>> /var/log/kube-proxy.log 2>&1 &2.2.5 运行Kubernetes Node组件

Kubernetes Node上需要运行以下组件:

• Docker

• Kubelet

• Kubernetes Proxy

Docker

Docker官方社区提供各个平台的安装方法(可参考http://docs.docker.com/installation/),很多Linux发行版都陆续对Docker进行了支持,可以使用以下方式快速安装Docker:$ curl -sSL https://get.docker.com/ | sh提示

1. Docker要求Linux 64系统,并且内核至少3.10版本以上。

2. 不同的Kubernetes版本对Docker的版本要求可能会有不同,总体上我们建议使用最新稳定的Docker版本,如果Kubelet发现Docker版本过低,在创建Pod的时候会失败并发出告警日志。

启动Docker:$ docker -d \-H unix:///var/run/docker.sock -H 0.0.0.0:2375 \>> /var/log/docker.log 2>&1 &

Kubelet

运行Kubelet:$ kubelet \--logtostderr=true --v=0 \--config=/etc/kubernetes/manifests \--address=0.0.0.0 \--api-servers=http://kube-master:8080 \>> /var/log/kubelet.log 2>&1 &

Kubernetes Proxy

运行Kubelet Proxy:$ kube-proxy \--logtostderr=true --v=0 \--api_servers=http://kube-master:8080 \>> /var/log/kube-proxy.log 2>&1 &2.2.6 查询Kubernetes的健康状态

在部署运行各个组件以后,可以通过Kubernetes命令行kubectl查询Kubernetes Master各组件的健康状态:$ kubectl -s http://kube-master:8080 get componentstatusNAME STATUS MESSAGE ERROR controller-manager Healthy ok nil scheduler Healthy ok nil etcd-0 Healthy {"health": "true"} nil

以及Kubernetes Node的健康状态:$ kubectl -s http://kube-master:8080 get nodeNAME LABELS STATUS AGE kube-node-1 kubernetes.io/hostname=kube-node-1 Ready 19m kube-node-2 kubernetes.io/hostname=kube-node-2 Ready 18m kube-node-3 kubernetes.io/hostname=kube-node-3 Ready 18m 2.2.7 创建Kubernetes覆盖网络

Kubernetes的网络模型要求每一个Pod都拥有一个扁平化共享网络命名空间的IP,称为PodIP,Pod能够直接通过PodIP跨网络与其他物理机和Pod进行通信。要实现Kubernetes的网络模型,需要在Kubernetes集群中创建一个覆盖网络(Overlay Network),联通各个节点,目前可以通过第三方网络插件来创建覆盖网络,比如Flannel和Open vSwitch。提示

本书中用到的Kubernetes运行环境主要是使用Flannel实现容器覆盖网络的。

Flannel

Flannel是CoreOS团队设计开发的一个覆盖网络工具,可以从Github上下载指定版本的Flannel发布包:$ wget https://github.com/coreos/flannel/releases/download/v0.5.4/flannel-0.5.4-linux- amd64.tar.gz $ tar xzvf flannel-0.5.4-linux-amd64.tar.gz $ cd flannel-0.5.4 $ cp flanneld /usr/bin

Flannel使用Etcd进行配置,来保证多个Flannel实例之间的配置一致性,所以需要首先在Etcd上进行配置:$ etcdctl -C http://etcd:4001 \set /coreos.com/network/config '{ "Network": "10.0.0.0/16" }'

在Kubernetes的所有节点上运行Flannel:$ flanneld -etcd-endpoints=http://etcd:4001 \ >> /var/log/flanneld.log 2>&1 &

Flannel会为不同Node的Docker网桥配置不同的IP网段以保证Docker容器的IP在集群内唯一,所以Flannel会重新配置Docker网桥,需要先删除原先创建的Docker网桥:$ iptables -t nat -F $ ifconfig docker0 down $ brctl delbr docker0

Flannel运行后会生成一个文件subnet.env,其中包含规划好的Docker网桥网段,根据其中的属性重新启动Docker:$ source /run/flannel/subnet.env $ docker -d \ -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 \ --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU} \ >> /var/log/docker.log 2>&1 &

Open vSwitch

Open vSwitch是一个高质量的、多层虚拟交换机,使用开源Apache 2.0许可协议,由Nicira Networks开发。它的目的是让大规模网络自动化可以通过编程扩展,同时仍然支持标准的管理接口和协议。Open vSwitch是一项非常重要的SDN技术,可以实现Kubernetes中的覆盖网络。

为保证Docker容器的IP在集群内唯一,不同Kubernetes Node的Docker网桥配置成不同的IP网段,需要进行规划,如表2-5所示。表2-5 Kubernetes Node的Docker网桥规划节点主机名IPDocker网桥Kubernetes kube-node-1192.168.3.14710.246.0.1/24Node 1Kubernetes kube-node-2192.168.3.14810.246.1.1/24Node 2Kubernetes kube-node-3192.168.3.14910.246.2.1/24Node 3

安装运行Open vSwitch服务以后,可以下载一个工具来协助创建Open vSwitch网络:$ wget https://raw.githubusercontent.com/wulonghui/docker-net-tools/master/k8s-ovs-ctl $ chmod 0750 k8s-ovs-ctl $ mv k8s-ovs-ctl /usr/bin/

在Kubernetes Node上配置~ /k8s-ovs.env:

• Kubernetes Node 1DOCKER_BRIDGE=docker0 CONTAINER_ADDR=10.246.0.1 CONTAINER_NETMASK=255.255.255.0 CONTAINER_SUBNET=10.246.0.0/16 OVS_SWITCH=obr0 TUNNEL_BASE=gre DOCKER_OVS_TUN=tun0 LOCAL_IP=192.168.3.147 NODE_IPS=(192.168.3.147 192.168.3.148 192.168.3.149) CONTAINER_SUBNETS=(10.246.0.1/24 10.246.1.1/24 10.246.2.1/24)

• Kubernetes Node 2DOCKER_BRIDGE=docker0 CONTAINER_ADDR=10.246.1.1 CONTAINER_NETMASK=255.255.255.0 CONTAINER_SUBNET=10.246.0.0/16 OVS_SWITCH=obr0 TUNNEL_BASE=gre DOCKER_OVS_TUN=tun0 LOCAL_IP=192.168.3.148 NODE_IPS=(192.168.3.147 192.168.3.148 192.168.3.149) CONTAINER_SUBNETS=(10.246.0.1/24 10.246.1.1/24 10.246.2.1/24)

• Kubernetes Node 3DOCKER_BRIDGE=docker0 CONTAINER_ADDR=10.246.2.1 CONTAINER_NETMASK=255.255.255.0 CONTAINER_SUBNET=10.246.0.0/16 OVS_SWITCH=obr0 TUNNEL_BASE=gre DOCKER_OVS_TUN=tun0 LOCAL_IP=192.168.3.149 NODE_IPS=(192.168.3.147 192.168.3.148 192.168.3.149) CONTAINER_SUBNETS=(10.246.0.1/24 10.246.1.1/24 10.246.2.1/24)

配置完成后,先删除原先创建的Docker网桥:$ iptables -t nat -F $ ifconfig docker0 down $ brctl delbr docker0

然后使用k8s-ovs-ctl创建Open vSwitch网络:$ k8s-ovs-ctl setup

最后重新运行Docker:$ docker -d \ -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375 \ --bridge=docker0 \ >> /var/log/docker.log 2>&1 & 2.3 安装Kubernetes扩展插件

Kubernetes中提供了许多平台扩展插件(Cluster Add-on),包含在Kubernetes发布包中,可以在Kubernetes上进行安装部署,目前包含以下扩展插件:

• Cluster DNS

• Cluster Monitoring

• Cluster Logging

• Kube UI提示

Kubernetes平台扩展插件并不是必需的,初次部署可以跳过此章节,待后续阅读中有需要再进行安装。2.3.1 安装Cluster DNS

Cluster DNS扩展插件用于支持Kubernetes的服务发现机制,Cluster DNS主要包含如下几项。

• SkyDNS:提供DNS解析服务。

• Etcd:用于SkyDNS的存储。

• Kube2sky:监听Kubernetes,当有新的Service创建时,生成相应记录到SkyDNS。

下载Kubernetes发布包,Cluster DNS扩展插件在Kubernetes发布包的cluster/addons/dns目录下:$ wget https://github.com/kubernetes/kubernetes/releases/download/v1.1.1/kubernetes.tar.gz $ tar zxvf kubernetes.tar.gz $ cd kubernetes/cluster/addons/dns

通过环境变量配置参数:$ export DNS_SERVER_IP="10.254.10.2" $ export DNS_DOMAIN="cluster.local" $ export DNS_REPLICAS=1

设置Cluster DNS Server的IP为10.254.10.2,Cluster DNS的本地域为cluster.local,另外需要配置到Kubelet的启动参数中:--cluster-dns=10.254.10.2 --cluster-domain=cluster.local

Kubernetes发布包cluster/addons/dns目录下的skydns-rc.yaml.in和skydns-svc.yaml.in是两个模板文件,通过设置的环境变量修改其中相应的属性值,生成Replication Controller和Service的定义文件:$ sed -e "s/{{ pillar\['dns_replicas'\] }}/${DNS_REPLICAS}/g;s/{{ pillar\['dns_ domain'\]}}/${DNS_DOMAIN}/g;" \skydns-rc.yaml.in > skydns-rc.yaml $ sed -e "s/{{ pillar\['dns_server'\] }}/${DNS_SERVER_IP}/g" skydns-svc.yaml.in > skydns-svc.yaml

Cluster DNS Replication Controller的定义文件skydns-rc.yaml如下:apiVersion: v1 kind: ReplicationController metadata: name: kube-dns-v9 namespace: kube-system labels: k8s-app: kube-dns version: v9 kubernetes.io/cluster-service: "true" spec: replicas: 1 selector: k8s-app: kube-dns version: v9 template: metadata: labels: k8s-app: kube-dns version: v9 kubernetes.io/cluster-service: "true" spec: containers: - name: etcd image: gcr.io/google_containers/etcd:2.0.9 resources: limits: cpu: 100m memory: 50Mi command: - /usr/local/bin/etcd - -data-dir - /var/etcd/data - -listen-client-urls - http://127.0.0.1:2379,http://127.0.0.1:4001 - -advertise-client-urls - http://127.0.0.1:2379,http://127.0.0.1:4001 - -initial-cluster-token - skydns-etcd volumeMounts: - name: etcd-storage mountPath: /var/etcd/data - name: kube2sky image: gcr.io/google_containers/kube2sky:1.11 resources: limits: cpu: 100m memory: 50Mi args: # command = "/kube2sky" - -domain=cluster.local - -kube_master_url=http://kube-master:8080 - name: skydns image: gcr.io/google_containers/skydns:2015-10-13-8c72f8c resources: limits: cpu: 100m memory: 50Mi args: # command = "/skydns" - -machines=http://127.0.0.1:4001 - -addr=0.0.0.0:53 - -ns-rotate=false - -domain=cluster.local. ports: - containerPort: 53 name: dns protocol: UDP - containerPort: 53 name: dns-tcp protocol: TCP livenessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 30 timeoutSeconds: 5 readinessProbe: httpGet: path: /healthz port: 8080 scheme: HTTP initialDelaySeconds: 1 timeoutSeconds: 5 - name: healthz image: gcr.io/google_containers/exechealthz:1.0 resources: limits: cpu: 10m memory: 20Mi args: - -cmd=nslookup kubernetes.default.svc.cluster.local localhost >/dev/null - -port=8080 ports: - containerPort: 8080 protocol: TCP volumes: - name: etcd-storage emptyDir: {} dnsPolicy: Default # Don't use cluster DNS. 提示

kube2sky需要Service Account来调用Kubernetes API,如果Kubernetes没有开启Service Account,可以显式指定Kubernetes API的URL,在skydns-rc.yaml中设置Kube2sky的启动参数如下所示。args:# command = "/kube2sky"- -domain=cluster.local- -

通过定义文件创建Cluster DNS Replication Controller:$ kubectl create -f skydns-rc.yamlreplicationcontroller "kube-dns-v9" created

Cluster DNS Replication Controller创建运行Cluster DNS Pod:$ kubectl get pod --selector k8s-app=kube-dns --namespace=kube-systemNAME READY STATUS RESTARTS AGE kube-dns-v9-qdck6 4/4 Running 0 2m

Cluster DNS Service的定义文件skydns-svc.yaml:apiVersion: v1

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载