什么是Kubernetes

官方定义k8s能够对容器化软件进行部署管理,在不停机的前提下提供简单快速的发布和更新方式。换句话说,如果项目需要多机器节点的微服务架构,并且采用Docker image(镜像)进行容器化部署,那么k8s可以帮助我们屏蔽掉集群的复杂性,自动选择最优资源分配方式进行部署。在此基础上,k8s还提供简单的多实例部署及更新方案,仅需几个操作命令就可以轻松实现。

拥有自动包装、自我修复、横向缩放、服务发现、负载均衡、自动部署、升级回滚、存储编排等特性。

Kubernetes与DevOps、微服务等相辅相成,密不可分,三者的关系如下图所示。

ps:Kubernetes谐音k8s,所以也叫k8s。

image.png

Kubernetes的设计架构

在Kubernetes集群中,有Master和Node这两种角色。Master管理Node,Node管理容器。

  • Master主要负责整个集群的管理控制,相当于整个Kubernetes集群的首脑。它用于监控、编排、调度集群中的各个工作节点。通常Master会占用一台独立的服务器,基于高可用原因,也有可能是多台。
  • Node则是Kubernetes集群中的各个工作节点。Node由Master管理,提供运行容器所需的各种环境,对容器进行实际的控制,而这些容器会提供实际的应用服务。

Kubernetes的整体架构如下图所示。
image.png

也可以简化成下图去理解:
image.png

Master

API Server(实际操作)

API Server(kube-apiserver)进程为Kubernetes中各类资源对象提供了增删改查等HTTP REST接口。对于资源的任何操作,都需要经过API Server进程来处理。

对于用户来说,访问API Server进程有3种方式。

  • 直接通过REST Request的方式来访问。
  • 通过官方提供的客户端库文件来访问,本质上,通过编程方式,转换为对API Server进程的REST API调用。
  • 通过命令行工具kubectl客户端来访问。kubectl客户端将把命令行转换为对API Server进程的REST API调用。

ps:我们通过kuboard等客户端操作k8s服务,其实也是在使用“API Server”,类似于git客户端和 git命令的关系。

etcd(存储)

etcd项目是一种轻量级的分布式键值存储,在单台Master服务器上配置,也可以配置到多台服务器。

可以将etcd理解为Kubernetes的“数据库”,用于保存集群中所有的配置和各个对象的状态信息

只有API Server进程才能直接访问和操作etcd。

调度器(Pod调度)

调度器(kube-scheduler)是Pod资源的调度器。它用于监听最近创建但还未分配Node的Pod资源,会为Pod自动分配相应的Node。

调度器在调度时会考虑各种因素,包括资源需求、硬件/软件/指定限制条件、内部负载情况等。

调度器所执行的各项操作均是基于API Server进程的。如调度器会通过API Server进程的Watch接口监听新建的Pod,并搜索所有满足Pod需求的Node列表,再执行Pod调度逻辑。调度成功后会将Pod绑定到目标Node上。

ps:它是k8s做容灾处理、负载均衡的关键。

控制器管理器(对象管理)

英文名:kube-controller-manager

Kubernetes集群的大部分功能是由控制器执行的。理论上,以下每种控制器都是一个单独的进程,为了降低复杂度,它们都被编译、合并到单个文件中,并在单个进程中运行。

  • Node 控制器:负责在Node出现故障时做出响应。
  • Replication控制器:负责对系统中的每个ReplicationController对象维护正确数量的Pod。
  • Endpoint 控制器:负责生成和维护所有Endpoint对象的控制器。Endpoint控制器用于监听Service和对应的Pod副本的变化。
  • ServiceAccount及Token 控制器:为新的命名空间创建默认账户和API访问令牌。

kube-controller-manager所执行的各项操作也是基于API Server进程的。例如,Node控制器会通过APIServer进程提供的Watch接口,实时监控Node的信息并进行相应处理

Node

Node主要由3个部分组成,分别是kubelet、kube-proxy和容器运行时(container runtime),其中“容器运行时”包含了多个pod,pod中又运行着多个容器。

Pod(容器组)总是在 Node(节点) 上运行。Node(节点)是 kubernetes 集群中的计算机,可以是虚拟机或物理机。每个 Node(节点)都由 master 管理。一个 Node(节点)可以有多个Pod(容器组),kubernetes master 会根据每个 Node(节点)上可用资源的情况,自动调度 Pod(容器组)到最佳的 Node(节点)上。

Pod(基本单元)

它是Kubernetes处理的最基本单元。

容器本身并不会直接分配到主机上,而是会封装到名为Pod的对象中。

Pod通常表示单个应用程序,由一个或多个关系紧密的容器构成。这些容器拥有同样的生命周期,作为一个整体一起编排到Node上。这些容器共享环境、存储卷和IP空间。尽管Pod基于一个或多个容器,但应将Pod视作单一的整体、单独的应用程序。Kubernetes以Pod为最小单位进行调度、伸缩并共享资源、管理生命周期。

kubelet(值守进程)

kubelet是在每个Node上都运行的主要代理进程。

它以PodSpec为单位来运行任务,PodSpec是一种描述Pod的YAML或JSON对象

kubelet会运行由各种机制提供(主要通过API Server)的一系列PodSpec,并确保这些PodSpec中描述的容器健康运行。不是Kubernetes创建的容器将不属于kubelet的管理范围。kubelet负责维护容器的生命周期,同时也负责存储卷(volume)等资源的管理。

每个Node上的kubelet会定期调用Master节点上API Server进程的REST接口,报告自身状态。API Server进程接收这些信息后,会将Node的状态信息更新到etcd中。kubelet也通过API Server进程的Watch接口监听Pod信息,从而对Node上的Pod进行管理。

kube-proxy(负责服务发现)

它主要用于管理Service的访问入口,包括从集群内的其他Pod到Service的访问,以及从集群外访问Service。

容器运行时(负责操作容器)

容器运行时是负责运行容器的软件。

Kubernetes支持多种运行时,包括Docker、containerd、cri-o、rktlet以及任何基于Kubernetes CRI(容器运行时接口)的实现。

参考文章