Kubernetes 组件

小小码农 2021年08月26日 1,071次浏览

当您部署Kubernetes时,您将得到一个集群。
Kubernetes集群由一组运行容器化应用程序的工作机器(称为节点)组成。每个集群至少有一个工作节点。
工作节点托管作为应用程序工作负载组件的Pods。控制平面管理集群中的工作节点和pod。在生产环境中,控制平面通常跨多台计算机运行,集群通常运行多个节点,提供容错和高可用性。
下图展示了包含所有相互关联组件的 Kubernetes 集群。
从图中可看出大致分为两大类,控制平面(Control Plane)和节点(Node)。控制平面和节点里又有很多小组件。

Control Plane Components

Control Plane Components(控制平面组件)对集群做出全局决策(比如调度),以及检测和响应集群事件(例如,当不满足部署的 replicas 字段时,启动新的 pod)。
控制平面组件可以在集群中的任何节点上运行。 然而,为了简单起见,设置脚本通常会在同一个计算机上启动所有控制平面组件, 并且不会在此计算机上运行用户容器。

kube-apiserver

API server是Kubernetes Control Plane中的一个组件,用于公开Kubernetes API。API server是Kubernetes Control Plane的前端。
Kubernetes API server的主要实现是kube-apiserver。Kube-apiserver被设计为水平扩展,也就是说,它通过部署更多的实例进行扩展。您可以运行多个kube-apiserver实例,并在这些实例之间平衡流量。

etcd

etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。

kube-scheduler

控制平面组件,它监视新创建的没有指定节点的Pods,并选择一个节点让它们运行。
调度决策考虑的因素包括:单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据局部性、工作负载间的干扰和截止日期。

kube-controller-manager

运行控制器进程的控制平面组件。
从逻辑上讲,每个控制器都是一个独立的进程,但为了降低复杂性,它们都被编译成一个二进制文件,并在一个进程中运行。
这些控制器包括:

  • 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应
  • 任务控制器(Job controller): 监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
  • 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)
  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌

cloud-controller-manager

云控制器管理器是指嵌入特定云的控制逻辑的 控制平面组件。 云控制器管理器使得你可以将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。
cloud-controller-manager 仅运行特定于云平台的控制回路。 如果你在自己的环境中运行 Kubernetes,或者在本地计算机中运行学习环境, 所部署的环境中不需要云控制器管理器。

与 kube-controller-manager 类似,cloud-controller-manager 将若干逻辑上独立的 控制回路组合到同一个可执行文件中,供你以同一进程的方式运行。 你可以对其执行水平扩容(运行不止一个副本)以提升性能或者增强容错能力。

下面的控制器都包含对云平台驱动的依赖:

  • 节点控制器(Node Controller): 用于在节点终止响应后检查云提供商以确定节点是否已被删除
  • 路由控制器(Route Controller): 用于在底层云基础架构中设置路由
  • 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器

Node Components

Node Components(节点组件)在每个节点上运行,维护运行的 Pod 并提供 Kubernetes 运行环境。

kubelet

一个在集群中每个节点(node)上运行的代理。 它保证容器(containers)都 运行在 Pod 中。
kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。 kubelet 不管理不是由 Kubernetes 创建的容器。

kube-proxy

kube-proxy 是集群中每个节点上运行的网络代理, 实现 Kubernetes 服务(Service) 概念的一部分。

kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。

如果操作系统提供了数据包过滤层并可用的话,kube-proxy 会通过它来实现网络规则。否则, kube-proxy 仅转发流量本身。

扩展

Container Runtime

Container Runtime(容器运行时)是负责运行容器的软件。

Kubernetes 支持多个容器运行环境: Docker、 containerd、CRI-O 以及Kubernetes CRI (Container Runtime Interface,容器运行时接口)任何实现。

  • OCI(Open Container Initiative,开放容器计划)
    是一个开放的治理结构,其明确的目的是围绕容器格式和运行时创建开放的行业标准。即它只是给容器运行时创建规则,大家一起来做符合规则的东东,这样就能更好的集成。
    OCI由Docker和其他容器行业的领导者于2015年6月建立,目前包含两个规范:运行时规范(Runtime -spec)和图像规范(Image -spec)。运行时规范概述了如何运行在磁盘上解压缩的“文件系统包”。在高层,OCI实现将下载OCI Image,然后将该映像解压缩到OCI Runtime文件系统包中。此时,OCI运行时包将由OCI运行时运行。

  • Kubernetes CRI
    Kubernetes CRI(Container Runtime Interface)基于OCI规范抽象出来的一个容器运行时插件接口,是KS8的标准方式。这个插件接口使得kubelet可以使用更广泛的容器运行时,而且不用重新编译。在没有CRI的年代,容器运行时(例如 docker、rkt等)是通过在kubelet中实现一个内部的高级接口(例如 docker-shim等)而与kubelet集成的,每次新增一个容器运行时,都需要写一个 shim 去适配,这会使K8S难以维护,不符合可扩展性、会性能降低。注意,CRI不是一个完整的、包含所有容器运行时的接口,他只是K8S方便扩展、维护的一个标准方式。

  • CRI-O
    CRI-O(Container Runtime Interface-OCI)是K8S CRI的实现,由红帽发起并开源的一款容器运行时,CRI-O 能够让 Kubernetes 使用任意兼容 OCI 的运行时作为运行 Pod 的容器运行时,CRI-O 本身也是 CRI-runtime。

  • Cotainerd
    原名CRI-Containerd:目前 CRI-Conainerd 已经变成containerd的一个插件,是容器虚拟化技术,只负责容器运行时 和 基本的镜像管理,支持K8S CRI规范的所有特性,提供了使用ansible和kubeadm工具部署k8S集群的方法。

Pod

Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。包含一个或多个应用容器, 这些容器是相对紧密的耦合在一起的。可以将 Pod 看作单个容器的包装器,如果有多个容器共享一个存储卷(资源),那么就可以将这些容器放在同一个 Pod里进行管理,Pod 会将这些容器和存储资源打包为一个可管理的实体。每个 Pod 都旨在运行给定应用程序的单个实例。如果希望横向扩展应用程序(例如,运行多个实例 以提供更多的资源),则应该使用多个 Pod,每个实例使用一个 Pod。 在 Kubernetes 中,这通常被称为 副本(Replication)。 通常使用一种工作负载资源及其控制器 来创建和管理一组 Pod 副本。
简单理解就是 Kubernetes 集群不直接管理容器,它管理的最小单元为Pod,Pod运行多个需要一起工作的容器