1-Kubernetes 是什么?
1.1常见的云平台
IaaS(Infrastructure as a Service
):基础设施服务,常见平台阿里云。
PaaS(platform as a service
):平台即服务,常见平台如新浪云。
SaaS(Software as a Service
):软件即服务,常见平台Office365。
Kubernetes(PaaS
)是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。 Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项目。Kubernetes 建立在 Google 在大规模运行生产工作负载方面拥有十几年的经验 的基础上,结合了社区中最好的想法和实践。
1.2 为什么 Kubernetes 如此有用?
传统部署:
早期,各个组织机构在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。 例如,如果在物理服务器上运行多个应用程序,则可能会出现一个应用程序占用大部分资源的情况, 结果可能导致其他应用程序的性能下降。 一种解决方案是在不同的物理服务器上运行每个应用程序,但是由于资源利用不足而无法扩展, 并且维护许多物理服务器的成本很高。
虚拟化部署:
作为解决方案,引入了虚拟化。虚拟化技术允许你在单个物理服务器的 CPU 上运行多个虚拟机(VM)。 虚拟化允许应用程序在 VM 之间隔离,并提供一定程度的安全,因为一个应用程序的信息 不能被另一应用程序随意访问。
虚拟化技术能够更好地利用物理服务器上的资源,并且因为可轻松地添加或更新应用程序 而可以实现更好的可伸缩性,降低硬件成本等等。
每个 VM 是一台完整的计算机,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。
容器化部署:
容器类似于 VM,但是它们具有被放宽的隔离属性,可以在应用程序之间共享操作系统(OS)。 因此,容器被认为是轻量级的。容器与 VM 类似,具有自己的文件系统、CPU、内存、进程空间等。 由于它们与基础架构分离,因此可以跨云和 OS 发行版本进行移植。容器因具有许多优势而变得流行起来。容器化部署的好处:
- 敏捷应用程序的创建和部署:与使用 VM 镜像相比,提高了容器镜像创建的简便性和效率。
- 持续开发、集成和部署:通过快速简单的回滚(由于镜像不可变性),支持可靠且频繁的 容器镜像构建和部署。
- 关注开发与运维的分离:在构建/发布时而不是在部署时创建应用程序容器镜像, 从而将应用程序与基础架构分离。
- 可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他指标信号。
- 跨开发、测试和生产的环境一致性:在便携式计算机上与在云中相同地运行。
- 跨云和操作系统发行版本的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、 Google Kubernetes Engine 和其他任何地方运行。
- 以应用程序为中心的管理:提高抽象级别,从在虚拟硬件上运行 OS 到使用逻辑资源在 OS 上运行应用程序。
- 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成较小的独立部分, 并且可以动态部署和管理 - 而不是在一台大型单机上整体运行。
- 资源隔离:可预测的应用程序性能,资源利用:高效率和高密度。
2-kubernetes vs Docker Swarm
Docker是一种容器管理服务,帮助开发人员设计应用程序,使用容器能更容易地创建、部署和运行应用程序。Docker有一个用于集群容器的内置机制,称为集群模式(swarm mode)。使用集群模式,可以使用Docker引擎在多台机器上启动应用程序。Docker Swarm是Docker自己针对Docker容器的原生集群解决方案,它的优点是紧密集成到Docker的生态系统中,并且使用自己的API。它监视跨服务器集群的容器数量,是创建集群docker应用程序的最方便的方法,不需要额外的硬件。它为Dockerized应用程序提供了一个小型但有用的编排系统。
2.1 Docker Swarm优点
1、更快的运行速度: 使用虚拟环境时,可能已经意识到它需要很长时间,并且包含了启动和启动您想要运行的应用程序的冗长过程。对于Docker Swarm来说,这不再是一个问题。DockerSwarm不需要启动一个完整的虚拟机,就可以让应用程序在虚拟和软件定义的环境中快速运行,并有助于DevOps的实现。
2、文档提供了所有的信息: Docker团队在文档方面非常突出! Docker正在快速发展,并且非常受欢迎。如果平台的一个版本在短时间间隔内发布,有些平台可能不维护文档。但是Docker Swarm从不这样,如果一些信息只适用于Docker Swarm的特定版本,那么相应文档将确保更新了所有信息。
3、快速简单的配置: Docker Swarm的一个主要优点是它简化了问题。Docker Swarm使用户可以自己配置,将其放入代码中并轻松部署。由于Docker Swarm可以在各种环境中使用,因此需求不受应用程序环境的约束。
4、确保程序独立(容器间低耦合):Docker Swarm负责将每个容器与其他容器隔离,并拥有自己的资源。可以部署各种容器,以便在不同的堆栈中运行单独的应用程序。除此之外,Docker Swarm将在每个应用程序在自己的容器上运行时清除应用程序的删除。如果不再需要应用程序,可以删除它的容器。它不会在您的主机OS上留下任何临时文件或配置文件。
5、版本控制和组件重用:使用Docker Swarm,可以跟踪容器的连续版本、检查差异或回滚到前面的版本。容器重用来自前一层的组件,这使得它们非常轻量级。
2.2 Docker Swarm缺点
1、Docker依赖于平台: Docker Swarm是一个为Linux设计的平台。虽然Docker支持Windows和MacOS X,但它使用虚拟机在非linux平台上运行。设计为在Windows上的Docker容器中运行的应用程序不能在Linux上运行,反之亦然。
2、不提供存储选项: Docker Swarm不提供将容器连接到存储的简便方法,这是主要缺点之一。它的数据量需要对主机和手动配置进行大量的改进。如果想要Docker Swarm解决存储问题,也能办到,但是方式并不高效,且这种方式对用户并不友好。
3、监控不良: Docker Swarm提供关于容器的基本信息,如果正在寻找基本的监控解决方案,那么使用Stats命令就足够了。如果正在寻找先进的监控,那么Docker集群不是好的选择。虽然有像CAdvisor这样的第三方工具可以提供更多的监控,但是使用Docker本身实时收集更多关于容器的数据是不可行的。
为了避免这些不足,这个时刻Kubernetes横空出世,当在多台机器上的多个容器中使用不同组件开发应用程序时,需要一个工具来管理和协调容器。这个时刻
在Kubernetes的帮助下解决问题!!!
2.3 Kubernetes优点
Kubernetes 提供了一个可弹性运行分布式系统的框架,Kubernetes 会满足扩展要求、故障转移、部署模式等。
-
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
-
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
-
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态 更改为期望状态。例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
-
自动完成装箱计算
Kubernetes 允许你指定每个容器所需 CPU 和内存(RAM)。 当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。
-
自我修复
Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的 运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。
-
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
2.4 Kubernetes缺点
Kubernetes 不是传统的、包罗万象的 PaaS(平台即服务)系统。 由于 Kubernetes 在容器级别而不是在硬件级别运行,它提供了 PaaS 产品共有的一些普遍适用的功能, 例如部署、扩展、负载均衡、日志记录和监视。 但是,Kubernetes 不是单体系统,默认解决方案都是可选和可插拔的。 Kubernetes 提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性。
-
不限制支持的应用程序类型。 Kubernetes 旨在支持极其多种多样的工作负载,包括无状态、有状态和数据处理工作负载。 如果应用程序可以在容器中运行,那么它应该可以在 Kubernetes 上很好地运行。
-
不部署源代码,也不构建应用程序。 持续集成(CI)、交付和部署(CI/CD)工作流取决于组织的文化和偏好以及技术要求。
-
不提供应用程序级别的服务作为内置服务。例如中间件(例如,消息中间件)、 数据处理框架(例如,Spark)、数据库(例如,mysql)、缓存、集群存储系统 (例如,Ceph)。这样的组件可以在 Kubernetes 上运行,并且/或者可以由运行在 Kubernetes 上的应用程序通过可移植机制来访问。
-
不要求日志记录、监视或警报解决方案。 它提供了一些集成作为概念证明,并提供了收集和导出指标的机制。
-
不提供或不要求配置语言/系统。它提供了声明性 API, 该声明性 API 可以由任意形式的声明性规范所构成。
-
不提供也不采用任何全面的机器配置、维护、管理或自我修复系统。Kubernetes 不仅仅是一个编排系统,实际上它消除了编排的需要。 编排的技术定义是执行已定义的工作流程:首先执行 A,然后执行 B,再执行 C。 相比之下,Kubernetes 包含一组独立的、可组合的控制过程, 这些过程连续地将当前状态驱动到所提供的所需状态。 如何从 A 到 C 的方式无关紧要,也不需要集中控制,这使得系统更易于使用 且功能更强大、系统更健壮、更为弹性和可扩展。
2.5 Swarm vs Kubernetes 小结
Docker Swarm | Kubernetes | |
---|---|---|
开发者 | Docker 公司 | 谷歌 |
发布年份 | 2013 | 2014 |
公司使用 | Bugsnag,Bluestem Brands, Hammerhead,Code Picnic,Dialonce。 |
Asana,Buffer,CircleCI, Evernote,Harvest,Intel, Starbucks,Shopify。 |
Controller | Manager | Master |
Storage | Volumes | Persistent and Epherma |
公共云服务提供商 | Google,Azure,AWS,OTC | Azure |
兼容性 | 不那么广泛和可定制 | 更广泛和高度可定制 |
安装 | 易于设置 | 需要时间安装 |
容差率 | 低容错性 | 高容错性 |
大集群 | 对于强集群状态考虑速度 | 在不考虑速度的情况下,即使在大型 集群中也提供容器部署和扩展 |
负载均衡(Loading Balancing) | 当容器中的pod定义为服务时,提供负载平衡 | 通过集群中的任何节点提供自动的内部负载平衡 |
部署单位 | Task | Pod |
Port | Published Port | Endpoint |
社区 | 活跃的用户群,定期更新各种应用程序的映像 | 获得开源社区和谷歌,亚马逊,微软和IBM等大公司的大力支持 |
缺点 | 没有供应商的认证计划。大多数组织需要商业认证版本 | 倾向于开发人员而不是中央IT。 |
优点 | 主要由可以决定产品方向的单一供应商控制。 | 明确的市场领导者 最高的采用率。 |
Slave | Worker | Nodes |
容器设置 | 功能由Docker API提供并受其限制 | 客户端API和YAML, 在Kubernetes中是唯一的。 |
可扩展性 | 即使在大型容器中也可以快速部署容器。 | 以牺牲速度为代价为集群状态提供强有力的保证。 |
无论选择Kubernetes
还是Docker
,两者都被认为是最好的,并且有相当大的差异。在这两者之间做出选择的最好方法可能是考虑哪一个您已经比较熟悉,或者哪一个适合现有的软件堆栈。如果需要开发复杂的应用程序,请使用Kubernetes,如果希望开发小型应用程序,请使用Docker Swarm。此外,选择正确的项目是一项非常全面的任务,完全取决于项目需求和目标受众。
3-Kubernetes组件
1、一个 Kubernetes 集群由一组被称作节点的机器组成。这些节点上运行 Kubernetes 所管理的容器化应用。集群具有至少一个工作节点。
工作节点托管作为应用负载的组件的 Pod ,控制平面管理集群中的工作节点和 Pod 。 为集群提供故障转移和高可用性,这些控制平面一般跨多主机运行,集群跨多个节点运行。
3.1 官方文档
1、kubernetes官网地址:https://kubernetes.io/
2、kubernets中文社区地址:https://www.kubernetes.org.cn/
3.2 控制平面组件(Control Plane Components)
控制平面的组件对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的replicas 字段时,启动新的 pod)。
控制平面组件可以在集群中的任何节点上运行。然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件,并且不会在此计算机上运行用户容器。
1、kube-apiserver(所有服务访问统一入口)
- 主节点上负责提供 Kubernetes API 服务的组件,它是 Kubernetes 控制面的前端,kube-apiserver是Kubernetes最重要的核心组件之一。
- 提供集群管理的REST API接口,包括认证授权,数据校验以及集群状态变更等
- 提供其他模块之间的数据交互和通信的枢纽(其他模块通过API Server查询或修改数据,只有API Server才直接操作etcd)
- 生产环境可以为apiserver做LA或LB。在设计上考虑了水平扩缩的需要。 换言之,通过部署多个实例可以实现扩缩。 参见构造高可用集群。
2、etcd(键值对数据库 储存K8S集群所有重要信息(持久化)
-
etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。Kubernetes 集群的 etcd 数据库通常需要有个备份计划,也可以使用外部的ETCD集群。
-
kubernetes需要存储很多东西,像它本身的节点信息,组件信息,还有通过kubernetes运行的pod,deployment,service等等。都需要持久化。etcd就是它的数据中心。生产环境中为了保证数据中心的高可用和数据的一致性,一般会部署最少三个节点。
-
这里只部署一个节点在master,etcd也可以部署在kubernetes每一个节点,组成etcd集群。如果已经有etcd外部的服务,kubernetes直接使用外部etcd服务。
3、 kube-scheduler(负责介绍任务,选择合适的节点进行分配任务)
- 主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。
- kube-scheduler负责分配调度Pod到集群内的节点上,它监听kube-apiserver,查询还未分配Node的Pod,然后根据调度策略为这些Pod分配节点。
4、kube-controller-manager(在主节点上运行控制器的组件)
- Controller Manager由kube-controller-manager和cloud-controller-manager组成,是Kubernetes的大脑,它通过apiserver监控整个集群的状态,并确保集群处于预期的工作状态。
- kube-controller-manager由一系列的控制器组成,像
Replication Controller
控制副本,Node Controller
节点控制,Deployment Controller
管理deployment
,cloud-controller-manager
在Kubernetes启用Cloud Provider
的时候才需要,用来配合云服务提供商的控制。
5、云控制器管理器-(cloud-controller-manager)
- cloud-controller-manager 运行与基础云提供商交互的控制器,cloud-controller-manager 二进制文件是 Kubernetes 1.6 版本中引入的 alpha 功能。
- cloud-controller-manager 仅运行云提供商特定的控制器循环。必须在 kube-controller-manager 中禁用这些控制器循环,可以通过在启动 kube-controller-manager 时将 --cloud-provider 参数设置为external 来禁用控制器循环。
- cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展。在以前的版本中,核心的 Kubernetes 代码依赖于特定云提供商的代码来实现功能。在将来的版本中&