Kubernetes(也称 "k8s" 或 "kube")是一个容器编排平台,用于调度和自动部署、管理和扩展容器化应用程序。
Kubernetes 最初由谷歌开发,并在 2014 年开源发布。它是 Google 内部使用的容器编排平台 Borg 的后代。Kubernetes 在希腊语中是舵手或飞行员的意思,在 Kubernetes 徽标(链接位于 ibm.com 外部)中以船舵为象征。
如今,Kubernetes 和更广泛的容器生态系统正发展为通用计算平台和生态系统,可以媲美甚至超越虚拟机 (VM),作为现代云基础设施和应用程序的基本构建块。该生态系统使组织能够提供高生产力的平台即服务 (PaaS),解决围绕云原生开发的多个基础设施相关和操作相关任务与问题,以便开发团队专注于编码和创新。
以下视频介绍了 Kubernetes 基础知识:
适用于希望在确保应用程序性能的同时加快上市速度的平台和开发运维工程师。
容器是轻量级可执行应用程序组件,将应用程序源代码与在任何环境中运行代码所需的所有操作系统 (OS) 库和依赖关系相结合。
容器利用操作系统 (OS) 虚拟化形式,通过隔离进程并控制进程可以访问的 CPU、内存和磁盘量,实现多个应用程序共享单个操作系统实例。容器比 虚拟机 (VM) 更小、资源效率更高、更便携,已成为现代云原生应用程序事实上的计算单元。
最近的一项 IBM 研究揭示了容器和相关技术带来的一些具体技术和业务优势。
将容器理解为 IT 基础设施自动化和抽象连续体的最新点,可能会更容易或更有帮助。
在传统基础设施中,应用程序在物理服务器上运行并获取其可以获得的所有资源。企业有两种选择:在一台服务器上运行多个应用程序,希望一个应用程序不会以牺牲其他应用程序为代价来占用资源;为每个应用程序配备一台服务器,这会浪费资源并且无法扩展。
虚拟机 (VM) 是从实际计算机硬件中抽象出来的服务器,支持在一台物理服务器上运行多个 VM,或者跨多个物理服务器运行单个 VM。每台虚拟机都运行自己的操作系统实例。企业可以将每个应用程序隔离在自己的虚拟机中,降低了在相同底层物理硬件上运行的应用程序相互影响的机会。与传统基础设施相比,虚拟机的资源利用率更高、、更容易扩展、成本更低。而且虚拟机是一次性的——企业不再需要运行应用程序时,可以关闭虚拟机。
有关虚拟机的更多信息,请参阅“什么是虚拟机?”
容器将这种抽象提升到更高的层次。具体来说,除了共享底层虚拟化硬件外,容器还共享底层虚拟化操作系统内核。容器具有与虚拟机相同的隔离性、可扩展性和可处置性,但由于不携带自己操作系统实例的载荷,因此比虚拟机更轻(即占用空间更少)。容器更节省资源——可以在更少的机器(虚拟机和物理机)上运行更多的应用程序,使用更少的操作系统实例。容器更容易在桌面、数据中心和云环境中移植;而且非常适合敏捷和 DevOps 开发实践。
“什么是容器?”完整解释了容器和 容器化。博客文章“容器与虚拟机有何区别?”全面列出二者的差异。
Docker 是创建和运行 Linux® 容器的最流行工具。虽然数十年前人们就已经引入早期形式的容器(使用 FreeBSD Jails 和 AIX Workload Partitions 等技术),但在 2013 年,Docker 通过一种新的开发者友好和云友好的实现,使容器变得大众化。
Docker 最初是个开源项目,今天还指 Docker Inc.,也即生产 Docker 的公司。Docker 是个建立在开源项目之上的商业容器工具包(并将这些改进回馈开源社区)。
Docker 基于传统的 Linux 容器 (LXC) 技术构建,但支持更精细的 Linux 内核进程虚拟化,并添加了一些功能,助力开发人员更轻松地构建、部署、管理和保护容器。
尽管当今存在替代容器平台(例如开放容器计划 (OCI)、CoreOS 和 Canonical (Ubuntu) LXD),但 Docker 广受青睐,以至于几乎成为容器的代名词,有时会被误认为与 Kubernetes 等互补技术相互竞争(参阅下文“Kubernetes 与 Docker:不是非此即彼的问题”视频)。
随着容器的广泛应用,如今一个组织可能拥有数百甚至数千个容器,运维团队需要针对容器部署、网络化、可扩展性和可用性进行调度和自动化。容器编排市场应运而生。
虽然其他容器编排选项(最著名的是 Docker Swarm 和 Apache Mesos)在早期获得一些关注,但 Kubernetes 迅速成为最广泛采用的(实际上一度是开源软件历史上增长最快的项目)的技术。
开发者之所以选择并继续使用 Kubernetes,关键在于其丰富的功能,庞大且不断增长的开源工具生态系统,以及在云服务提供商间的支持性和可移植性。所有领先的公共云提供商(包括 Amazon Web Services (AWS)、Google Cloud、IBM Cloud 和 Microsoft Azure)都提供完全托管的 Kubernetes 服务。
Kubernetes 在应用程序生命周期中调度和自动执行与容器相关的任务,包括:
到这里,您已经明白 Kubernetes 虽是 Docker Swarm 的替代方案,但(与持续流行的误解相反)并非 Docker 本身的替代品或竞争对手。
事实上,如果您热心于采用 Docker 并正在创建基于 Docker 的大规模容器部署,那么 Kubernetes 编排就是管理这些工作负载的下个合理步骤。
如需更多信息,请观看“Kubernetes 与 Docker:不是非此即彼的问题”视频。
Kubernetes 架构的主要组成如下:
集群是 Kubernetes 架构的构建块。集群由节点组成,每个节点代表一台计算主机(虚拟机或物理机)。
每个集群由一个主节点和多个工作节点组成:前者用作集群的控制计划,后者部署、运行和管理容器化应用程序。主节点运行一个调度服务,根据开发者设置的部署要求和可用的计算能力,自动确定容器的部署时间和位置。每个工作节点包括容器管理工具(如 Docker)和 Kubelet 软件代理(负责接收和执行来自主节点的命令)。
开发人员使用 kubectl 管理集群操作,kubectl 是直接与 Kubernetes API 通信的命令行界面 (cli)。
要更深入了解 Kubernetes 集群,请阅读“Kubernetes 集群:实现快速、受控云应用程序交付的架构”。
Pod 是共享相同计算资源和相同网络的容器组。它们也是 Kubernetes 中的可扩展单位:如果某个 pod 中的容器获得的流量超出其处理能力,Kubernetes 会将该 pod 复制至集群中的其他节点。因此,最好保持 Pod 紧凑,以便其仅包含必须共享资源的容器。
部署控制容器化应用程序的创建和状态并保持应用程序的运行。它确定集群上应运行的 Pod 副本数量。如果 Pod 故障,部署将创建一个新的 Pod。
有关 Kubernetes 部署的更多信息,请观看“Kubernetes 部署:快速入门”:
Kubernetes 能够部署和扩展 pod,但无法管理或自动化 pod 之间的路由,并且不提供监视、保护或调试这些连接的工具。随着集群中容器数量的增长,容器之间的可能连接路径呈指数级增长(例如,两个容器有两个潜在的连接路径,但 10 个 Pod 有 90 个),从而导致配置和管理方面的困扰。
Istio 是用于 Kubernetes 集群的开源服务网格层。Istio 针对每个 Kubernetes 集群添加一个 sidecar 容器(对程序员和管理员基本不可见),配置、监视和管理其他容器之间的交互。
您可以通过 Istio 设置单一策略来配置容器之间的连接,无需单独配置每个连接。这使得容器之间的连接更易于调试。
Istio 还有一个仪表板,DevOps 团队和管理员可以使用该仪表板监控容器之间连接的延迟、服务时间错误等特性。它还内置安全功能(特别是防止未经授权的用户在容器之间欺骗服务调用的身份管理)以及可供安全专业人员监控集群的身份验证、授权和审计 (AAA) 功能。
Knative(发音 "kay-native")是基于 Kubernetes 的开源平台,为云原生开发提供两类重要优势:
无服务器计算是一种相对较新的代码部署方式,能提高云原生应用程序的效率和成本效益。无服务器并非部署在等待请求时处于空闲状态的持续代码实例,而是在需要时启动代码,并根据需求波动进行扩缩,然后在不使用时关闭代码。无服务器计算可防止浪费计算容量和电力,并降低成本,因为您只在代码实际运行时付费。
借助 Knative,开发人员能够构建一次容器并将其作为软件服务或无服务器函数运行。这对开发人员完全透明:Knative 在后台处理细节,开发人员可以专注于代码。
对于开发人员而言,容器化代码需要大量重复步骤,编排容器需要大量配置和脚本编写,例如生成配置文件、安装依赖项、管理日志和跟踪以及编写持续集成/持续部署 (CI/CD) 脚本。
Knative 通过三个组件实现这些任务的自动化执行:
Build: Build 组件自动将源代码转换为云原生容器或函数。具体来说,它从存储库中提取代码,安装所需的依赖项,构建容器映像,并将其放入容器注册表以供其他开发人员使用。开发人员需要指定组件的位置,以便 Knative 找到它们;不过之后,Knative 就会自动构建。
Serve: Serve 组件将容器作为可扩展服务运行;可以扩展到数千个容器实例或缩小到没有容器实例(称为扩展到零)。Serve 还有两个非常有用的功能:配置,每次将容器推送到生产环境时都会保存容器的版本(称为快照),并支持同时运行这些版本;服务路由,支持将不同数量的流量引导至这些版本。您可以组合使用这些功能来分阶段部署容器,或者在将容器化应用程序投入全球生产之前对其进行金丝雀测试。
Event:Event 组件使指定的事件能够触发基于容器的服务或功能。这对于 Knative 的无服务器功能尤其重要;在时机恰当时,系统需要有某种机制来启动函数。Event 允许团队表达对事件类型的兴趣,然后自动连接到事件生产者,并将事件路由到容器,无需对这些连接进行编程。
Kubernetes 跻身史上增长最快的开源项目之列并且正在加速增长。开发人员及其雇主的采用率继续飙升。几个值得注意的数据点:
如果您准备开始使用 Kubernetes,或想培养使用 Kubernetes 和 Kubernetes 生态系统工具的技能,请试试这些教程:
借助 Red Hat OpenShift on IBM Cloud,OpenShift 开发者可以快速安全地在 Kubernetes 集群中容器化和部署企业工作量。
使用一套通用的云服务(包括工具链、数据库和 AI),在任何云服务商的基础上,一致地在本地、边缘计算和公有云环境中部署和运行应用程序。
IBM Cloud Code Engine 是一个完全托管的无服务器平台,可让您在完全托管的容器运行时上运行容器、应用程序代码或批处理作业。