【译】什么是Kubernetes(K8s)

948 阅读8分钟

原文: kubernetes.io/docs/concep…

本页是对于Kubernetes的一个概览。

  • 回到过去
  • 你为什么需要Kubernetes以及它能做什么
  • Kubernetes不做的事情
  • 接下来的是什么

Kubernetes是一个轻便的、可扩展的用来管理容器化的工作负载以及服务的开源平台,它可以促进声明式配置和自动化。同时它拥有一个庞大的并且快速成长的生态系统。Kubernetes服务、支持和工具正在被广泛使用。

Kubernetes这个名称来源于希腊语,它表示舵手或者飞行员。Google在2014年开源了Kubernetes。Kubernetes基于Google在生产环境上对大规模工作负载的十几年经验构建,同时它还融合了许多来自社区的最佳想法和实践。

回到过去

让我们通过回顾过去,来看看Kubernetes为何如此有用。

传统部署时代:很早之前,许多组织会在物理服务器上运行应用。在一台物理服务器上,由于人们没办法定义应用之间的资源边界,它会造成资源分配问题。举个例子,如果多个应用运行在一台物理服务器上,有可能会出现某个应用占用了大多数资源的情况。这样无疑会导致其它应用性能下降。一个解决方案是把每个应用运行在不同的物理服务器上。但是因为资源会利用不足,该方案将无法扩展,并且对于组织而言,维护许多物理机器是十分昂贵的。

虚拟化部署时代:虚拟化作为一个解决方案被引入了。它允许你在一台单一的物理服务器的CPU上运行多个虚拟机器(VMs)。虚拟化让应用在VMs之间被隔离,并且提供了一种一个应用不能被其它应用自由访问信息的级别的安全性。

虚拟化使在一台物理服务器上的资源利用变得更好,同时扩展性也会更好。因为一个应用可以被轻易地添加和更新,这样减少了硬件成本等等。通过虚拟化,你可以把一套物理资源表示成一组一次性的虚拟机器。

除了虚拟化的硬件之外,每一个VM是一个运行了所有组件的完整机器,它包括它自己的操作系统。

容器部署时代:容器与VMs是类似的,但是容器有着轻松的隔离属性,来让各个应用共享操作系统。因此容器被认为是轻量的。与VM相似的是,一个容器有它自己的文件系统、CPU、内存、进程空间以及其它东西。由于容器与底层设施解耦,它们可以跨云和操作系统进行移植。

容器变得流行越来越流行由于它们提供了以下额外的好处,比如:

  • 灵活的应用创建和部署:相较于使用VM镜像,使用容器镜像更加容易和高效。
  • 持续开发、集成和部署:通过快速轻松的回滚提供可靠且频繁的容器镜像构建和部署(由于镜像的不可变性)
  • 开发和运维的关注点分离:创建应用容器镜像在构建/发布时期,而不是在部署阶段,因此我们把应用从基础设施当中解耦了。
  • 不仅可以观察操作系统级别的信息和指标,还可以查看应用健康以及其它信号。
  • 运行环境在开发、测试以及生产都是一致的:在笔记本运行的效果与在云上一样。
  • 云和操作系统的移植性:能够在Ubuntu, RHEL, CoreOS, on-prem, Google Kubernetes Engine,以及任何其它地方运行。
  • 以应用为中心的管理:从在虚拟硬件上运行一个操作系统到在使用逻辑资源的操作系统上运行一个应用程序,提高了抽象的级别。
  • 松耦合、分布式的、弹性的、解放的微服务:应用程序可以被打分成更小的、独立的,并且可以被部署和动态管理的部分-而不是一个运行在一个庞大的单一目标的机器上的单体栈。
  • 资源隔离:可预测的应用性能
  • 资源利用:高效率和高密度

你为什么需要Kubernetes以及它能做什么

容器是一个集成以及运行你的应用的好方法。在一个生产环境当中,你需要管理运行着应用程序的容器,并且确保没有停机时间的发生。比如,一个容器挂了,另外一个容器需要启动。如果这种行为可以被一个系统来处理,它是不是会变得更容易呢?

这就是为什么Kubernetes应运而生!Kubernetes给你提供了一个弹性运行分布式系统的框架。它负责对你的应用进行扩展和故障转移,以及提供部署模式和其它的一些功能。举个例子,Kubernetes能够轻而易举地对你的系统进行一次金丝雀部署的管理。

Kubernetes提供了:

  • 服务发现和负载均衡

    Kubernetes能够通过使用DNS名称或者它们的IP地址暴露一个容器。如果一个容器的流量很高,Kubernetes可以平衡负载并且分发网络流量来让部署稳定。

  • 存储编排

    Kubernetes可以从你选择的存储系统当中,自动挂载一个。比如本地存储、公有云存储以及其它等等。

  • 自动部署和回滚

    你能够通过使用Kubernetes描述部署容器需要达到的状态,然后Kubernetes就可以在一个可控的速率内将实际状态改变到这个状态。比如,你可以让Kubernetes自动创建新的容器,移除存在的容器并且将它们的资源分配给新的容器。

  • 自动装箱

    你给Kubernetes提供一个用来运行容器化任务的节点集群。然后你告诉Kubernetes每个容器需要多少CPU和内存(RAM)。Kubernetes能够把容器刚好放进你的节点来充分利用资源。

  • 自我修复

    Kubernetes将会重启失败的容器,替换和杀死那些不响用户定义的健康检查的容器,并且不会把它们暴露给客户端直到它们恢复了服务。

  • 密钥和配置管理

    Kubernetes能够让你存储和管理诸如密码,OAuth令牌和SSH keys这样的敏感信息。你能够部署和更新密钥和应用配置,却不用重新构建容器镜像,也不用把密钥暴露在栈配置当中。

Kubernetes不做的事情

Kubernetes不是一个传统的,包罗万象的Pass(Platform as a Service)系统。由于Kubernetes基于容器级别操作,而不是硬件级别,所以它提供了一些Pass也提供的通用应用特性,比如部署、扩展、负载均衡日志以及监控。然而Kubernetes不是单体的,并且这些解决方案是可选的和插件化的。Kubernetes提供了构建开发人员平台的基础,但是在重要的地方保留了用户的选择和灵活性。

Kubernetes:

  • 不限制支持的应用的类型。Kubernetes的目标是支持丰富种类的工作负载,包括无状态的,有状态的以及数据处理工作负载。如果一个应用可以运行在容器当中,那么它也应该在Kubernetes当中也运行得很好。

  • 不部署源码也不构建你的应用。持续集成,交付和部署(CI / CD)工作流取决于组织的文化和偏好以及技术要求。

  • 不提供应用级别的服务,如中间件(比如消息bus),数据处理框架(比如Spark),数据库(比如MySQL),缓存以及集群存储系统作为内置服务。但是这些组件可以运行在Kubernetes当中,并且能够通过如Open Service Broker这样轻便的机制被Kubernetes中运行的应用访问

  • 不决定日志,监控和告警方案。它提供了一些集成作为概念证明,以及收集和导出指标的机制。

  • 不提供也不授权一个配置语言/系统(比如,Jsonnet)。它提供了一个声明式的API,可能会被任意形式的声明式规范作为目标。

  • 不提供也不应用任何复杂的机器配置、维护、管理或者自我修复系统。

  • 除此之外,Kubernetes也不仅仅是一个编排系统。实际上,它消除了编排的需要。编排的技术定义是执行一个定义好的工作流:首先做A,然后B,最后C。相反的是,Kubernetes由一组独立的,可组合的控制过程构成。它可以持续地驱使当前状态向提供的期望状态变化。你是如何从A到C并不重要。中心化的控制不是必需的。这样的话,系统将会变得更容易使用、更有威力、更健壮、更有弹性和更好扩展。

接下来的是什么