Kubernetes

Kubernetes（常简称为K8s）是用于自动部署、扩展和管理“容器化（containerized）应用程序”的开源系统。该系统由Google设计并捐赠给Cloud Native Computing Foundation（今属Linux基金会）来使用。

它旨在提供“跨主机集群的自动部署、扩展以及运行应用程序容器的平台”。它支持一系列容器工具，包括Docker等。

## 历史

<image>

Kubernetes（在希腊语意为“舵手”或“驾驶员”）由Joe Beda、Brendan Burns和Craig McLuckie创立，并由其他谷歌工程师，包括Brian Grant和Tim Hockin等进行加盟创作，并由谷歌在2014年首次对外宣布。该系统的开发和设计都深受谷歌的Borg系统的影响，其许多顶级贡献者之前也是Borg系统的开发者。在谷歌内部，Kubernetes的原始代号曾经是Seven，即星际迷航中的Borg（博格人）。Kubernetes标识中舵轮有七个轮辐就是对该项目代号的致意。

Kubernetes v1.0于2015年7月21日发布。随着v1.0版本发布，谷歌与Linux基金会合作组建了Cloud Native Computing Foundation（CNCF）并将Kubernetes作为种子技术来提供。

Rancher Labs在其Rancher容器管理平台中包含了Kubernetes的发布版。Kubernetes也在很多其他公司的产品中被使用，例如Red Hat的OpenShift， CoreOS的Tectonic， IBM的IBM私有云产品，精灵云的EcOS，KubeSphere，以及 VMware的PKS等等。

而现今资讯界常见的缩写手法“K8s”则是将“ubernete”八个字母缩写为“8”而来。

## 设计

Kubernetes在设计结构上定义了一系列的构建模块，其目的是为了提供一个可以共同提供部署、维护和扩展应用程序的机制。组成Kubernetes的组件设计概念为松耦合和可扩展的，这样可以使之满足多种不同的工作负载。可扩展性在很大程度上由Kubernetes API提供，此API主要被作为扩展的内部组件以及Kubernetes上运行的容器来使用。

### pod

Kubernetes的基本调度单元称为“pod”。通过该种抽象类别可以把更高级别的抽象内容增加到容器化组件。一个pod一般包含一个或多个容器，pod可以保证这些容器运行在同一主机节点上。Kubernetes中的每个pod都被分配一个唯一的（在集群内的）IP地址这样就可以允许应用程序使用同一端口，而避免了发生冲突的问题。Pod可以定义存储的卷，例如本地磁盘目录或网络磁盘，并将其暴露给pod中的某个容器。pod可以通过Kubernetes API手动管理，也可以委托给控制器来实现自动管理。

### 标签和选择器

Kubernetes使客户端（用户或内部组件）将称为“标签”（label）的键值对附加到系统中的任何API对象，如pod和节点。相应地，“标签选择器”（label selector）是通过匹配对象的标签，来查询对象的方法。

标签和选择器是Kubernetes中的主要分组机制，用于确定操作适用的组件。

例如，如果应用程序的Pods具有系统分层的标签 `tier` （比如"`front-end`"、"`back-end`"）和 `release_track` 标签（比如"`canary`"、"`production`"），那么对所有"`back-end`" 和 "`canary`" 节点的操作可以使用如下所示的标签选择器：

`tier=back-end AND release_track=canary`

### 控制器

控制器是将集群的状态转移到所需集群状态的对帐循环机制。

举例而言，ReplicaSet控制器，通过在集群中运行指定数量的特定pod的副本，来实现对pod复制和缩放的管理。如果有节点出现故障，它还能够在其他节点创建pod的副本以替代被故障所影响的原来的pod。Kubernetes系统还包括其他控制器，包括“DaemonSet控制器”，能够令所有机器（节点）或其中的一部分机器（节点）运行恰好1个pod；“Job控制器”会启动特定任务所需的pod，这样的pod在完成任务后会进入“完成”状态。控制器通常使用标签选择器来确定其管理的pod组。

### 服务

Kubernetes服务本质是一组协同工作的pod，类同多层架构应用中的一层。构成服务的pod组通过标签选择器来定义。Kubernetes通过给服务分配静态IP地址和域名来提供服务发现机制，并且以轮循调度DNS的方式将流量负载均衡到能与选择器匹配的pod的IP地址的网络连接上（即使是故障导致pod从一台机器移动到另一台机器）。默认情况下，服务任务会暴露在集群中（例如，多个后端pod可能被分组成一个服务，前端pod的请求在它们之间负载平衡）；除此以外，服务任务也可以暴露在集群外部（例如，从客户端访问前端pod）。

## 概念

<image>

Kubernetes遵循主从式架构设计。Kubernetes的组件可以分为管理单个的 node 组件和控制平面部分的组件。

### 控制平面

Kubernetes Master是集群的主要控制单元，其用于管理其工作负载并指导整个系统的通信。Kubernetes控制平面由各自的进程组成，每个组件都可以在单个主节点上运行，也可以在支持高可用性集群的多个主节点上运行。是Kubernetes控制平面的各种组件如下：

#### etcd

etcd 是由CoreOS开发，用于可靠地存储集群的配置数据的一种持久性，轻量型的，分布式的键-值数据存储组件。该组件可表示在任何给定时间点处的集群的整体状态。其他组件在注意到存储的变化之后，会变成相应的状态。

#### API服务器

API服务器是一个关键组件 并使用 Kubernetes API 和 JSON over HTTP来提供了Kubernetes的内部和外部接口。API服务器处理和验证 REST请求并更新 API 对象的状态 etcd，从而允许客户端在Worker节点之间配置工作负载和容器。

#### 调度器

调度器（scheduler）是可扩展组件，它基于剩余可用的资源以及其他约束条件来选择节点，决定pod到哪个节点上运行。调度器跟踪每个节点上的资源利用率，以确保工作负载（workload）不会被分配到超过可用资源的量。为此，调度程其必须知道工作负载的资源需求、节点的可用资源量，以及用户提供的各种约束和策略指令，例如服务质量，亲和性/反亲和性要求，数据本地性等。简言之，调度器的作用是将资源的“供应”与工作负载的“需求”相匹配以维持系统的稳定和可靠。

#### 控制器管理

控制器管理器是核心Kubernetes控制器，其包括DaemonSet控制器和复制控制器等。该控制器可与API服务器进行通信以在需要时创建，更新和删除他们管理的资源（pod，服务端点等）

### Kubernetes 节点

Node也称为Worker或Minion，是部署容器（工作负载）的单机器（或虚拟机）。集群中的每个节点都必须具备容器的运行环境（runtime） ——比如 Docker，以及下面提到的其他组件，以便与这些容器的网络配置进行通信。

#### Kubelet

Kubelet负责每个节点的运行状态（即确保节点上的所有容器都正常运行）。它按照控制面（control plane）的指示，以pod来容纳容器，处理容器的启动、停止和维护。

Kubelet会监视pod的状态，如果不处于所需状态，则pod将被重新部署到同一个节点。而关于节点的状态监控，节点状态的消息每隔几秒就会被传送到控制面的API服务器。控制面上检测到节点故障后，会有一个高级的控制器监控到节点状态的变化，并在其他健康的节点上启动原本运行在故障节点上的pod。

#### 容器

容器从属于pod。在运行应用、库及其依赖的微服务中，容器是最低层级的。通过绑定一个外部IP，容器可以被外网访问。

#### Kube代理

Kube代理是网络代理和负载均衡的实现，支持服务抽象以及其他网络操作。根据传入请求的IP和端口，该组件会将流量转发到指定的合适的容器中。

#### cAdvisor

cAdvisor 是监视和收集例如每个节点上的容器的CPU，内存，文件和网络使用情况等的资源使用情况和性能指标的代理组件。

## 外部链接

- https://github.com/kubernetes/kubernetes
- Kubernetes（K8s）是什么？基础介绍+3大优点解析

## 基本资料

- 发行日期：2014年6月7日
- 软件版本周期：1.25.3
- 编程语言：Go
- 操作系统：跨平台
- 类型：集群管理
- 许可协议：Apache许可证 2.0