kubernetes 是什么
这一页是Kubernetes的概述。Kubernetes是一个可移植的、可扩展的、开源的平台,用于管理容器化的工作负载和服务,它促进了声明式配置和自动化。它有一个庞大的、快速增长的生态系统。
回顾历史
让我们回顾一下Kubernetes为什么如此有用。
传统部署时代
早期,组织机构在物理服务器上运行应用程序,没有办法为物理服务器中的应用程序定义资源边界,这导致了资源分配问题。例如,如果在一个物理服务器上运行多个应用程序,那么在某些实例中,一个应用程序可能会占用大部分资源,从而导致其他应用程序的性能不佳。对此的解决方案是在不同的物理服务器上运行每个应用程序。但是,由于资源没有得到充分利用,并且对于组织来说,维护许多物理服务器是昂贵的。
虚拟化部署时代
虚拟化作为一种解决方案被引入。它允许您在单个物理服务器的CPU上运行多个虚拟机(vm)。虚拟化允许应用程序在虚拟机之间进行隔离,并提供一定级别的安全性,因为一个应用程序的信息不能被另一个应用程序自由访问。
虚拟化允许更好地利用物理服务器中的资源,并允许更好的可伸缩性,因为可以轻松地添加或更新应用程序,降低硬件成本等。通过虚拟化,您可以将一组物理资源表示为一次性虚拟机集群。
每个VM都是一个完整的机器,运行虚拟化硬件之上的所有组件,包括自己的操作系统。
容器部署时代
容器类似于虚拟机,但它们放宽了隔离属性,以便在应用程序之间共享操作系统。因此,容器被认为是轻量级的。与VM类似,容器有自己的文件系统、CPU共享、内存和进程空间等。由于它们与底层基础设施解耦,它们可以在云和操作系统发行版之间移植。
container之所以受欢迎,是因为它们提供了额外的好处,比如:
- 敏捷的应用程序创建和部署:与使用VM映像相比,容器映像创建更加容易和高效。
- 持续开发、集成和部署:提供可靠和频繁的容器映像构建和部署,并提供快速和高效的回滚(由于映像不变性)。
- 开发和运维分离:在构建或发布时而不是部署时创建应用程序容器映像,从而将应用程序与基础设施分离。
- 可观测性不仅显示操作系统级的信息和度量,而且还显示应用程序运行状况和其他信号。
- 跨开发、测试和生产的环境一致性:在笔记本电脑上运行与在云中运行相同。
- 云和操作系统发行可移植性:可以运行在Ubuntu、RHEL、CoreOS、on-premises、主要公共云和任何其他地方。
- 以应用程序为中心的管理:将抽象级别从在虚拟硬件上运行操作系统提高到在使用逻辑资源的操作系统上运行应用程序。
- 松散耦合的、分布式的、弹性的、自由的微服务:应用程序被分解成更小的、独立的部分,可以动态地部署和管理,而不是运行在一个大型单一用途机器上的单片堆栈。
- 资源隔离:可预测的应用程序性能。
- 资源利用:高效密度。
你为什么需要Kubernetes,它能做什么
容器是打包和运行应用程序的好方法。在生产环境中,您需要管理运行应用程序的容器,并确保没有停机。例如,如果一个容器宕机,则需要启动另一个容器。如果这种行为由一个系统来处理,不是会更容易吗?
这就是Kubernetes拯救我们的方式!Kubernetes为您提供了一个可弹性运行分布式系统的框架。它负责应用程序的扩展和故障转移,提供部署模式等。例如,Kubernetes可以轻松地为您的系统管理金丝雀部署。
Kubernetes提供如下功能:
-
Service discovery and load balancing
Kubernetes可以使用DNS名称或自己的IP地址公开容器。当一个容器的流量比较大时,Kubernetes能够对网络流量进行负载均衡和分配,从而保证部署的稳定性。
-
Storage orchestration
Kubernetes允许您自动挂载您所选择的存储系统,比如本地存储、公共云提供商等等。
-
Automated rollouts and rollbacks
您可以使用Kubernetes描述已部署容器所需的状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化Kubernetes为您的部署创建新的容器,删除现有的容器,并将它们的所有资源采用到新容器中。
-
Automatic bin packing
您为Kubernetes提供了一个节点集群,它可以使用这些节点来运行容器化的任务。告诉Kubernetes每个容器需要多少CPU和内存(RAM)。Kubernetes可以将容器放置到您的节点上,以充分利用您的资源。
-
Self-healing 自愈
Kubernetes重启失败的容器,替换容器,终止不响应用户定义的健康检查的容器,并且在它们准备好服务之前不会将它们通告给客户端。
-
Secret and configuration management
Kubernetes允许您存储和管理敏感信息,如密码、OAuth令牌和SSH密钥。您可以部署和更新秘密和应用程序配置,而不需要重新构建容器映像,也不需要在堆栈配置中暴露秘密。
kubernetes不能做什么
Kubernetes不是一个传统的、包罗万象的PaaS(平台即服务)系统。由于Kubernetes是在容器级而不是在硬件级操作的,所以它提供了一些PaaS产品普遍适用的特性,比如部署、伸缩、负载平衡,并允许用户集成他们的日志、监视和警报解决方案。然而,Kubernetes不是单片的,这些默认的解决方案是可选的和可插拔的。Kubernetes为构建开发人员平台提供了构建模块,但在重要的地方保留了用户的选择和灵活性。
Kubernetes:
- 不限制支持的应用程序类型。Kubernetes的目标是支持各种各样的工作负载,包括无状态、有状态和数据处理工作负载。如果应用程序可以在容器中运行,那么它在Kubernetes上应该运行得很好。
- 不会部署源代码,也不会构建应用程序。持续集成、交付和部署(CICD)工作流由组织文化、首选项以及技术需求决定。
- 不提供应用级服务,如中间件(如消息总线)、数据处理框架(如Spark)、数据库(如MySQL)、缓存、集群存储系统(如Ceph)等内置服务。这些组件可以在Kubernetes上运行,或者可以通过可移植的机制(如Open Service Broker)被运行在Kubernetes上的应用程序访问。
- 不指定日志记录、监视或警报解决方案。它提供了一些集成作为概念证明,以及收集和导出指标的机制。
- 不提供或强制要求配置语言或系统(例如,Jsonnet)。它提供了一个声明性API,可以被任意形式的声明性规范作为目标。
- 不提供或采用任何全面的机器配置、维护、管理或自修复系统。
- 此外,Kubernetes不仅仅是一个编配系统。事实上,它消除了对编配的需要。编排的技术定义是一个已定义工作流的执行:首先执行A,然后执行B,然后执行C。相反,Kubernetes由一组独立的、可组合的控制过程组成,这些过程不断地将当前状态推向所提供的期望状态。从A到C的方式并不重要,也不需要集中控制。这将产生一个更易于使用、更强大、更健壮、更有弹性和可扩展的系统。