k8s重要概念及各组件简介

解析k8s的重要概念和介绍其工作原理。

简单介绍一下k8s中的重要概念和各个主要的工作组件,主要参考了官方的技术文档和《每天5分钟玩转kubernetes》。

1、重要概念

1. k8s/kubernetes

Kubernetes 源于希腊语,意为 “舵手” 或 “飞行员”, 且是英文governorcybernetic的词根。 K8s 是通过将 8 个字母ubernete替换为 8 而导出的缩写。

k8s是谷歌在2014年发布的一个开源项目,其主要用途就是用来管理大量的容器。Kubernetes 建立在 Google 公司超过十余年的运维经验基础之上,Google 所有的应用都运行在容器上。在谷歌内部,使用的容器管理系统叫Borg,现在已经改名叫Omega。(就是数学里面经常用到的那个欧米茄符合的读音)所以k8s其实相当于是Borg的开源版本。

我们再来看一下k8s官网的说法:

Kubernetes 是一个跨主机集群的 开源的容器调度平台,它可以自动化应用容器的部署、扩展和操作 , 提供以容器为中心的基础架构。

Kubernetes 具有如下特点:

  • 便携性: 无论公有云、私有云、混合云还是多云架构都全面支持
  • 可扩展: 它是模块化、可插拔、可挂载、可组合的,支持各种形式的扩展
  • 自修复: 它可以自保持应用状态、可自重启、自复制、自缩放的,通过声明式语法提供了强大的自修复能力

2. Cluster

Cluster就是集群的意思,即整个k8s管理的所有机器和容器等等的总称。它是计算、存储和网络资源的集合,k8s利用这些资源运行各种基于容器的应用。

3. Master

Master是Cluster中的管理者,即该集群中所有节点的老大或老大们,因为Master可能不止一个,如果是有多个Master节点的集群我们一般称之为高可用集群。它的主要职责是调度,即决定将应用放在哪里运行。

4. Node

Node的职责是运行容器应用。Node由Master管理,Node负责监控并汇报容器的状态,同时根据Master的要求管理容器的生命周期。

5. Pod

Pod是Kubernetes的最小工作单元。每个Pod包含一个或多个容器。Pod中的容器会作为一个整体被Master调度到一个Node上运行。这意味着,即使是只有一个容器,Master也是要把它作为一个Pod调度运行的。

Kubernetes 引入Pod主要基于下面两个目的:
(1)可管理性。
有些容器天生就是需要紧密联系,一起工作。Pod提供了比容器更高层次的抽象,将它们封装到一个部署单元中。Kubernetes以Pod为最小单位进行调度、扩展、共享资源、管理生命周期。
(2)通信和资源共享。
Pod 中的所有容器使用同一个网络namespace,即相同的IP地址和Port空间。它们可以直接用localhost通信。同样的,这些容器可以共享存储,当Kubernetes挂载 volume到Pod,本质上是将volume挂载到Pod中的每一个容器。

6. namespace

Kubernetes支持由同一物理集群支持的多个虚拟集群。这些虚拟集群称为namespace。

namespace旨在用于多个用户分布在多个团队或项目中的环境中。对于具有几个到几十个用户的集群,您根本不需要创建或考虑名称空间。当您需要它们提供的功能时,请开始使用命名空间。

  • namespace提供名称范围。
  • 资源名称在namespace中必须是唯一的,但是在不同的namespace中不必唯一。
  • namespace不能彼此嵌套,并且每个Kubernetes资源只能位于一个namespace中。
  • namespace是一种在多个用户之间划分群集资源的方法(通过资源配额)。
  • 在Kubernetes的未来版本中,默认情况下,同一namespace中的对象将具有相同的访问控制策略。
  • 没有必要使用多个namespace来分隔略有不同的资源,例如同一软件的不同版本:可以使用标签来区分同一namespace中的资源。

2、Master节点

Master 组件提供的集群控制。Master 组件对集群做出全局性决策(例如:调度),以及检测和响应集群事件(副本控制器的replicas字段不满足时,启动新的副本)。

Master 组件可以在集群中的任何节点上运行。然而,为了简单起见,设置脚本通常会启动同一个虚拟机上所有 Master 组件,并且不会在此虚拟机上运行用户容器。

2.1 kube-apiserver

kube-apiserver对外暴露了Kubernetes API。它是的 Kubernetes 前端控制层。它被设计为水平扩展,即通过部署更多实例来缩放。

API Server 提供HTTP/HTTPS RESTful API,即Kubernetes API。API Server是Kubernetes Cluster的前端接口,各种客户端工具(CLI或UI)以及Kubernetes其他组件可以通过它管理Cluster的各种资源。

2.2 etcd

etcd用于 Kubernetes 的后端存储。etcd 负责保存Kubernetes Cluster的配置信息和各种资源的状态信息,始终为 Kubernetes 集群的 etcd 数据提供备份计划。当数据发生变化时,etcd 会快速地通知Kubernetes相关组件。

2.3 kube-controller-manager

kube-controller-manager运行控制器,它们是处理集群中常规任务的后台线程。逻辑上,每个控制器是一个单独的进程,但为了降低复杂性,它们都被编译成独立的可执行文件,并在单个进程中运行。

这些控制器包括:

  • 节点控制器(Node Controller): 当节点移除时,负责注意和响应。
  • 副本控制器(Replication Controller): 负责维护系统中每个副本控制器对象正确数量的 Pod。
  • 端点控制器(Endpoints Controller): 填充 端点(Endpoints) 对象(即连接 Services & Pods)。
  • 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的namespace创建默认帐户和 API 访问令牌.

2.4 kube-scheduler

kube-scheduler监视没有分配节点的新创建的 Pod,选择一个节点供他们运行。Scheduler在调度时会充分考虑Cluster的拓扑结构,当前各个节点的负载,以及应用对高可用、性能、数据亲和性的需求。

2.5 Pod 网络

Pod 要能够相互通信,Kubernetes Cluster必须部署Pod网络,flannel是其中一个可选方案。

3、Node节点

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

3.1 kubelet

kubelet是Node的agent,当Scheduler确定在某个Node上运行Pod后,会将Pod的具体配置信息(image、volume等)发送给该节点的kubelet,kubelet根据这些信息创建和运行容器,并向Master报告运行状态。

kubelet是主要的节点代理,它监测已分配给其节点的 Pod(通过 apiserver 或通过本地配置文件),提供如下功能:

  • 挂载 Pod 所需要的数据卷(Volume)。
  • 下载 Pod 的 secrets。
  • 通过 Docker 运行(或通过 rkt)运行 Pod 的容器。
  • 周期性的对容器生命周期进行探测。
  • 如果需要,通过创建 镜像 Pod(Mirror Pod) 将 Pod 的状态报告回系统的其余部分。
  • 将节点的状态报告回系统的其余部分。

3.2 kube-proxy

kube-proxy通过维护主机上的网络规则并执行连接转发,实现了Kubernetes服务抽象。

service在逻辑上代表了后端的多个Pod,外界通过service访问Pod。service接收到的请求就是通过kube-proxy转发到Pod上的。
每个Node都会运行kube-proxy服务,它负责将访问service的TCP/UDP数据流转发到后端的容器。如果有多个副本,kube-proxy会实现负载均衡。