Kubernetes是什么?
本页是Kubernetes的概述。
Kubernetes是一个可移植的、可扩展的、开源的平台,用于管理容器化的工作负载和服务,有助于声明式配置和自动化。它拥有一个庞大的、快速增长的生态系统。Kubernetes的服务、支持和工具广泛可用。
Kubernetes这个名字来源于希腊语,意思是舵手或领航员。K8s是由数“K”和“s”之间的8个字母得来的。谷歌在2014年开放了Kubernetes项目。Kubernetes结合超过15年的谷歌经验使用来自社区的最佳想法和实践来大规模运行生产工作负载。
时光倒流
让我们回到过去,看看为什么Kubernetes如此有用。
传统部署时代:早期,组织在物理服务器上运行应用程序。没有办法为物理服务器中的应用程序定义资源边界,这就导致了资源分配问题。例如,如果一个物理服务器上运行多个应用程序,可能会出现一个应用程序占用大部分资源的情况,从而导致其他应用程序的性能不佳。解决方案是在不同的物理服务器上运行每个应用程序。但是,由于资源没有得到充分利用,而且组织维护许多物理服务器的成本很高,因此无法扩展。
虚拟化部署时代:作为解决方案,引入了虚拟化。它允许您在单个物理服务器的CPU上运行多个虚拟机(vm)。虚拟化允许应用程序在虚拟机之间隔离,并提供了一种安全级别,因为一个应用程序的信息不能被另一个应用程序自由访问。
虚拟化允许更好地利用物理服务器中的资源,并允许更好的可伸缩性,因为可以轻松地添加或更新应用程序,降低硬件成本等等。通过虚拟化,您可以将一组物理资源表示为可随意使用的虚拟机集群。
每个VM都是一个完整的机器,在虚拟化硬件之上运行所有组件,包括它自己的操作系统。
容器部署时代:容器类似于虚拟机,但它们具有宽松的隔离属性,以便在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。与虚拟机类似,容器有自己的文件系统、CPU共享、内存、进程空间等等。由于它们与底层基础设施解耦,它们可以跨云和操作系统发行版移植。
容器之所以流行,是因为它们提供了额外的好处,比如:
- 敏捷的应用程序创建和部署:与使用VM映像相比,容器映像的创建更加容易,效率更高。
- 持续开发、集成和部署:提供可靠和频繁的容器映像构建和部署,并提供快速和高效的回滚(由于映像的不变性)。
- 开发和操作关注点分离:在构建/发布时而不是部署时创建应用程序容器映像,从而将应用程序与基础设施分离。
- 可观察性:不仅显示操作系统级别的信息和指标,还显示应用程序运行状况和其他信号。
- 跨开发、测试和生产的环境一致性:在笔记本电脑上运行与在云中运行相同的环境。
- 云和操作系统发行版的可移植性:可在Ubuntu、RHEL、CoreOS、本地、主要公共云以及其他任何地方运行。
- 以应用程序为中心的管理:将抽象级别从在虚拟硬件上运行操作系统提升到在使用逻辑资源的操作系统上运行应用程序。
- 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成更小的、独立的部分,可以动态部署和管理——而不是一个运行在大型单用途机器上的单片堆栈。
- 资源隔离:可预测的应用程序性能。
- 资源利用:效率高,密度大。
你为什么需要Kubernetes,它能做什么
容器是捆绑和运行应用程序的好方法。在生产环境中,您需要管理运行应用程序的容器,并确保没有停机。例如,如果一个容器宕机,则需要启动另一个容器。如果这个行为由系统来处理不是更简单吗?
这就是Kubernetes的救命之道!Kubernetes为您提供了一个可弹性地运行分布式系统的框架。它负责应用程序的扩展和故障转移,提供部署模式等等。例如,Kubernetes可以轻松地为您的系统管理canary部署。
Kubernetes为您提供:
- 服务发现和负载均衡Kubernetes可以使用DNS名称或使用自己的IP地址公开容器。如果一个容器的流量很大,Kubernetes能够对网络流量进行负载均衡和分配,从而保证部署的稳定性。
- 存储编排Kubernetes允许您自动挂载选择的存储系统,例如本地存储、公共云提供商等等。
- 自动rollout和rollback您可以使用Kubernetes描述已部署容器所需的状态,并且它可以以可控的速率将实际状态更改为所需状态。例如,您可以自动化Kubernetes为您的部署创建新容器,删除现有容器并将其所有资源采用到新容器中。
- 本自动包装您为Kubernetes提供了一个节点集群,它可以使用该集群运行容器化的任务。告诉Kubernetes每个容器需要多少CPU和内存(RAM)。Kubernetes可以将容器放置到您的节点上,以充分利用您的资源。
- 自愈Kubernetes会重新启动失败的容器,替换容器,杀死不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会向客户端发布它们。
- 机密和配置管理Kubernetes允许存储和管理敏感信息,如密码、OAuth令牌和SSH密钥。您可以部署和更新机密信息和应用程序配置,而无需重新构建容器映像,也无需在堆栈配置中公开机密信息。
Kubernetes不是
Kubernetes不是一个传统的、全面的PaaS(平台即服务)系统。由于Kubernetes在容器级别而不是硬件级别操作,因此它提供了PaaS产品中常见的一些通用特性,例如部署、伸缩、负载平衡,并允许用户集成日志、监控和警报解决方案。然而,Kubernetes不是整体的,这些默认解决方案是可选的和可插入的。Kubernetes提供了构建开发人员平台的构建块,但保留了用户在重要的地方的选择和灵活性。
Kubernetes:
- 不限制所支持的应用程序类型。Kubernetes的目标是支持极其多样化的工作负载,包括无状态、有状态和数据处理工作负载。如果一个应用程序可以在容器中运行,那么它应该在Kubernetes上运行得很好。
- 不部署源代码,也不构建应用程序。持续集成、交付和部署(CI/CD)工作流由组织文化和偏好以及技术需求决定。
- 不提供应用级服务,如中间件(如消息总线)、数据处理框架(如Spark)、数据库(如MySQL)、缓存、集群存储系统(如Ceph)等。这些组件可以在Kubernetes上运行,并且/或者可以被运行在Kubernetes上的应用程序通过可移植机制访问,例如开放的服务代理.
- 不规定日志记录、监视或警报解决方案。它提供了一些集成作为概念验证,以及收集和导出度量的机制。
- 不提供或要求配置语言/系统(例如,Jsonnet)。它提供了一个声明性API,任意形式的声明性规范都可以针对该API。
- 不提供或采用任何全面的机器配置、维护、管理或自愈系统。
- 此外,Kubernetes不仅仅是一个编排系统。事实上,它消除了编制的需要。编制的技术定义是执行已定义的工作流:首先执行a,然后执行B,然后执行c。相反,Kubernetes由一组独立的、可组合的控制过程组成,这些控制过程不断地将当前状态推向所提供的所需状态。你如何从A到达c并不重要,集中控制也不需要。这使得系统更易于使用,功能更强大、更健壮、更有弹性和可扩展。
接下来是什么
- 看一下Kubernetes组件
- 准备好开始?