Kubernetes(常简称为K8s[註 1])是用于自动部署、扩展和管理「容器化(containerized)应用程序」的开源系统。[3]該系統由Google设计并捐赠给Cloud Native Computing Foundation(今属Linux基金会)来使用。
| 首次发布 | 2014年6月7日[1] |
|---|---|
| 当前版本 | 1.25.3[2](2022年10月13日) |
| 源代码库 | |
| 编程语言 | Go |
| 操作系统 | 跨平台 |
| 类型 | 集群管理 |
| 许可协议 | Apache许可证 2.0 |
| 网站 | kubernetes |
历史
编辑Kubernetes(在希腊语意為“舵手”或“驾驶员”)由Joe Beda、Brendan Burns和Craig McLuckie创立,[5]并由其他谷歌工程师,包括Brian Grant和Tim Hockin等进行加盟创作,并由谷歌在2014年首次对外宣布 。[6] 該系統的开发和设计都深受谷歌的Borg系统[7][8]的影响,其许多顶级贡献者之前也是Borg系统的开发者。在谷歌内部,Kubernetes的原始代号曾经是Seven,即星际迷航中的Borg(博格人)。[9]Kubernetes标识中舵轮有七个轮辐就是对该项目代号的致意。
Kubernetes v1.0于2015年7月21日发布。[10] 随着v1.0版本发布,谷歌与Linux基金会合作组建了Cloud Native Computing Foundation(CNCF)[11]并將Kubernetes作为种子技术来提供。
Rancher Labs在其Rancher容器管理平台中包含了Kubernetes的发布版。[12]Kubernetes也在很多其他公司的产品中被使用,例如Red Hat的OpenShift,[13][14] CoreOS的Tectonic, IBM的IBM私有雲产品,[15],精灵云的EcOS[16],KubeSphere[17],以及 VMware的PKS等等。
而現今資訊界常見的縮寫手法「K8s」則是將“ubernete”八個字母縮寫為“8”而來。
设计
编辑Kubernetes在設計結構上定义了一系列的构建模块,其目的是為了提供一個可以共同提供部署、维护和扩展应用程序的机制。组成Kubernetes的组件设计概念为松耦合和可扩展的,这样可以使之满足多种不同的工作负载。可扩展性在很大程度上由Kubernetes API提供,此API主要被作为扩展的内部组件以及Kubernetes上运行的容器來使用。[18]
pod
编辑Kubernetes的基本调度单元称为“pod”。通過該種抽象類別可以把更高级别的抽象内容增加到容器化组件。一个pod一般包含一个或多个容器,pod可以保证这些容器运行在同一主机节点上。[18]Kubernetes中的每个pod都被分配一个唯一的(在集群内的)IP地址这样就可以允许应用程序使用同一端口,而避免了發生冲突的問題。[19] Pod可以定义存储的卷,例如本地磁盘目录或网络磁盘,并将其暴露给pod中的某个容器。[20]。pod可以通过Kubernetes API手动管理,也可以委托给控制器来實現自動管理。[18]
标签和选择器
编辑Kubernetes使客户端(用户或内部组件)将称为“标签”(label)的键值对附加到系统中的任何API对象,如pod和节点。相应地,“标签选择器”(label selector)是通过匹配对象的标签,来查询对象的方法。[18]
标签和选择器是Kubernetes中的主要分组机制,用于确定操作适用的组件。[21]
例如,如果应用程序的Pods具有系统分层的标签 tier (比如"front-end"、"back-end")和 release_track 标签(比如"canary"、"production"),那么对所有"back-end" 和 "canary" 节点的操作可以使用如下所示的标签选择器:[22]
tier=back-end AND release_track=canary
控制器
编辑控制器是将集群的状态转移到所需集群状态的对帐循环機制[23]。
举例而言,ReplicaSet控制器,通过在集群中运行指定数量的特定pod的副本,来实现对pod复制和缩放的管理。如果有节点出现故障,它还能够在其他节点创建pod的副本以替代被故障所影响的原来的pod。[23]Kubernetes系统还包括其他控制器,包括“DaemonSet控制器”,能够令所有机器(节点)或其中的一部分机器(节点)运行恰好1个pod;“Job控制器”会启动特定任务所需的pod,这样的pod在完成任务后会进入“完成”状态。[24] 控制器通常使用标签选择器来确定其管理的pod組。[22]
服务
编辑Kubernetes服务本質是一组协同工作的pod,類同多层架构应用中的一层。构成服务的pod组通过标签选择器来定义。[18]Kubernetes通过给服务分配静态IP地址和域名来提供服务发现机制,并且以轮循调度的方式将流量负载均衡到能与选择器匹配的pod的IP地址的网络连接上(即使是故障导致pod从一台机器移动到另一台机器)。[19] 默认情况下,服务任務会暴露在集群中(例如,多个后端pod可能被分组成一个服务,前端pod的请求在它们之间负载平衡);除此以外,服务任務也可以暴露在集群外部(例如,从客户端访问前端pod)。[25]
概念
编辑Kubernetes遵循主從式架構設計。Kubernetes的组件可以分为管理单个的 node 组件和控制平面部分的组件。[18][26]
控制平面
编辑Kubernetes Master是集群的主要控制单元,其用于管理其工作负载并指导整个系统的通信。Kubernetes控制平面由各自的进程组成,每个组件都可以在单个主节点上运行,也可以在支持高可用性集群[26]的多个主节点上运行。是Kubernetes控制平面的各种組件如下:
etcd
编辑etcd (页面存档备份,存于互联网档案馆) 是由CoreOS开发,用于可靠地存储集群的配置数据的一种持久性,轻量型的,分布式的键-值数据存储組件。該組件可表示在任何给定时间点处的集群的整体状态。其他组件在注意到存储的变化之后,会变成相应的状态。[26]
API服务器
编辑API服务器是一个关键组件 并使用 Kubernetes API 和 JSON over HTTP來提供了Kubernetes的内部和外部接口。[18][27] API服务器处理和验证 REST请求并更新 API 对象的状态etcd (页面存档备份,存于互联网档案馆),从而允许客户端在Worker节点之间配置工作负载和容器。
调度器
编辑调度器(scheduler)是可扩展组件,它基于剩余可用的资源以及其他约束条件来选择节点,决定pod到哪个节点上运行。调度器跟踪每个节点上的资源利用率,以确保工作负载(workload)不会被分配到超过可用资源的量。为此,调度程其必须知道工作负载的资源需求、节点的可用资源量,以及用户提供的各种约束和策略指令,例如服务质量,亲和性/反亲和性要求,数据本地性等。简言之,调度器的作用是将资源的“供应”与工作负载的“需求”相匹配以維持系統的穩定和可靠。 [28]
控制器管理
编辑控制器管理器是核心Kubernetes控制器,其包括DaemonSet控制器和复制控制器等。該控制器可与API服务器進行通信以在需要時创建,更新和删除他们管理的资源(pod,服务端点等)[27]
Kubernetes 节点
编辑Node也称为Worker或Minion,是部署容器(工作负载)的单机器(或虚拟机)。集群中的每个节点都必须具备容器的运行环境(runtime) ——比如 Docker,以及下面提到的其他组件,以便与这些容器的网络配置进行通信。
Kubelet
编辑Kubelet负责每个节点的运行状态(即确保节点上的所有容器都正常运行)。它按照控制面(control plane)的指示,以pod来容纳容器,处理容器的启动、停止和维护。[18][29]
Kubelet會监视pod的状态,如果不处于所需状态,则pod将被重新部署到同一个节点。而关于节点的状态监控,节点状态的消息每隔几秒就會被传送到控制面的API服务器。控制面上检测到节点故障后,会有一个高级的控制器监控到节点状态的变化,并在其他健康的节点上启动原本运行在故障节点上的pod。[30]
容器
编辑容器从属于pod。在运行应用、库及其依赖的微服务中,容器是最低层级的。通过绑定一个外部IP,容器可以被外网访问。
Kube代理
编辑Kube代理是网络代理和负载均衡的实现,支持服务抽象以及其他网络操作。[18]根据传入请求的IP和端口,該組件會将流量转发到指定的合适的容器中。
cAdvisor
编辑cAdvisor 是监视和收集例如每个节点上的容器的CPU,内存,文件和网络使用情况等的资源使用情况和性能指标的代理組件。
注释
编辑- ^ 因為開頭字母K与結尾字母s中間有8個其他字母
參見
编辑参考文献
编辑- ^ First GitHub commit for Kubernetes. github.com. 2014-06-07 [2017-06-17]. (原始内容存档于2017-03-01).
- ^ GitHub Releases page. github.com. 2022-10-13 [2022-10-13]. (原始内容存档于2017-03-01).
- ^ kubernetes/kubernetes. GitHub. [2017-03-28]. (原始内容存档于2017-04-21) (英语).
- ^ What is Kubernetes?. Kubernetes. [2017-03-31]. (原始内容存档于2019-05-30).
- ^ Google Made Its Secret Blueprint Public to Boost Its Cloud. [2016-06-27]. (原始内容存档于2016-07-01) (美国英语).
- ^ Google Open Sources Its Secret Weapon in Cloud Computing. Wired. [24 September 2015]. (原始内容存档于2015-09-10).
- ^ Abhishek Verma; Luis Pedrosa; Madhukar R. Korupolu; David Oppenheimer; Eric Tune; John Wilkes. Large-scale cluster management at Google with Borg. Proceedings of the European Conference on Computer Systems (EuroSys). April 21–24, 2015 [2017-06-17]. (原始内容存档于2017-07-27).
- ^ Borg, Omega, and Kubernetes - ACM Queue. queue.acm.org. [2016-06-27]. (原始内容存档于2016-07-09).
- ^ Early Stage Startup Heptio Aims to Make Kubernetes Friendly. [2016-12-06].[失效連結]
- ^ As Kubernetes Hits 1.0, Google Donates Technology To Newly Formed Cloud Native Computing Foundation. TechCrunch. [24 September 2015]. (原始内容存档于2020-11-17).
- ^ Cloud Native Computing Foundation. [2017-06-17]. (原始内容存档于2017-07-03).
- ^ Deploy and Manage Kubernetes Clusters | Rancher Labs. Rancher Labs. [2017-04-15]. (原始内容存档于2017-04-16) (美国英语).
- ^ OpenShift v3 Platform Combines Docker, Kubernetes. blog.openshift.com. [14 August 2014]. (原始内容存档于2015-07-06).
- ^ Why Red Hat Chose Kubernetes for OpenShift. blog.openshift.com. [7 November 2016]. (原始内容存档于2017-02-21).
- ^ IBM Spectrum Conductor for Containers. ibm.com/developerWorks. [2017-05-19]. (原始内容存档于2021-01-28) (美国英语).
- ^ Ghostcloud Enterprise Container OS. www.ghostcloud.cn. [2019-07-24]. (原始内容存档于2020-11-27) (美国英语).
- ^ Open Source Enterprise Kubernetes Platform | KubeSphere. kubesphere.io. [2022-02-21]. (原始内容存档于2022-05-04) (美国英语).
- ^ 18.0 18.1 18.2 18.3 18.4 18.5 18.6 18.7 18.8 An Introduction to Kubernetes. DigitalOcean. [24 September 2015]. (原始内容存档于2015-10-01).
- ^ 19.0 19.1 Langemak, Jon. Kubernetes 101 – Networking. Das Blinken Lichten. 2015-02-11 [2015-11-02]. (原始内容存档于2015-10-25).
- ^ Strachan, James. Kubernetes for Developers. Medium (publishing platform). 2015-05-21 [2015-11-02]. (原始内容存档于2015-09-07).
- ^ Surana, Ramit. Containerizing Docker on Kubernetes. LinkedIn. 2015-09-16 [2015-11-02].
- ^ 22.0 22.1 Intro: Docker and Kubernetes training - Day 2. Red Hat. 2015-10-20 [2015-11-02]. (原始内容存档于2015-10-29).
- ^ 23.0 23.1 Overview of a Replication Controller. Documentation. CoreOS. [2015-11-02]. (原始内容存档于2015-09-22).
- ^ Sanders, Jake. Kubernetes: Exciting Experimental Features. Livewyer. 2015-10-02 [2015-11-02]. (原始内容存档于2015-10-20).
- ^ Langemak, Jon. Kubernetes 101 – External Access Into The Cluster. Das Blinken Lichten. 2015-02-15 [2015-11-02]. (原始内容存档于2015-10-26).
- ^ 26.0 26.1 26.2 Kubernetes Infrastructure. OpenShift Community Documentation. OpenShift. [24 September 2015]. (原始内容存档于2015-07-06).
- ^ 27.0 27.1 Marhubi, Kamal. Kubernetes from the ground up: API server. kamalmarhubi.com. 2015-09-26 [2015-11-02]. (原始内容存档于2015-10-29).
- ^ The Three Pillars of Kubernetes Container Orchestration - Rancher Labs. rancher.com. 18 May 2017 [22 May 2017]. (原始内容存档于2017-06-24).
- ^ Marhubi, Kamal. What [..] is a Kubelet?. kamalmarhubi.com. 2015-08-27 [2015-11-02]. (原始内容存档于2015-11-13).
- ^ Kubernetes Security | Issues and Best Practices | Snyk. snyk.io. 26 July 2020 [2021-05-16] (美国英语).