总体架构

Kubernetes系统采用C/S架构,分为Master和Node两个部分,Master作为Server端,Node作为Client端。

多Master的方式可以实现集群的高可用。

Master也叫做主控节点,它主要负责:

  • 管理所有的节点
  • 调度POD
  • 控制集群运行过程中的所有状态 包含了以下几个组件:
  • API-Server:集群的HTTP REST接口,统一入口
  • Controller-Manager:所有资源的自动化控制中心
  • Scheduler:POD调度

Node也叫做工作节点,主要负责:

  • 管理所有容器
  • 监控、上报所有POD的运行状态 包含了以下几个组件:
  • Kubelet:管理节点上容器的生命,与Master节点通信
  • Kube-Proxy:服务通信、负载均衡
  • CRI容器运行时:接收kubelet的容器相关的指令并执行

Master节点也拥有Node相关的组件,即该Master也可以作为工作节点进行计算。

除此之外,k8s内部的存储采用ETCD作为唯一存储,一般采用集群高可用的方式部署。

Etcd集群是分布式K/V存储集群,提供了可靠的强一致性服务发现。Etcd集群存储Kubernetes系统的集群状态和元数据,其中包括所有Kubernetes资源对象信息、资源对象状态、集群节点信息等。Kubernetes将所有数据存储至Etcd集群前缀为/registry的目录下。

各个组件的功能

在k8s集群中主要有以下几种组件:

kubectl

kubectl是K8s官方提供的命令行工具,它主要与API-Server交互,通信协议采用HTTP/Json。

client-go

除了有命令行工具对K8s进行管理之外,还提供了编程方式。client-go用golang进行开发,它最初是K8s的部分代码,现在抽成了独立的仓库。

K8s任何组件与API-Server通信都是基于client-go。

API-Server

负责将K8s “资源组/资源版本/资源” 以RESTful形式对外提供服务。API-Server是集群中唯一与ETCD交互的组件。并且实现了集群的安全访问机制以及认证、授权、准入控制等。

Controller-Manager

管理控制器负责管理、维护集群内的状态,如维护POD的副本个数为期望的状态值等。

包含了多个控制器:

  • DeploymentControllers控制器
  • StatefulSet控制器
  • Namespace控制器
  • PersistentVolume控制器
  • 等等 每个控制器通过kube-apiserver组件提供的接口实时监控整个集群每个资源对象的当前状态,当因发生各种故障而导致系统状态出现变化时,会尝试将系统状态修复到“期望状态”。

Scheduler

负责调度POD在某个节点上运行。Kubelet上报节点信息,Scheduler通过监控这些信息,当有新的POD需要调度时,会根据这些节点信息进行调度算法计算最有节点。

调度算法分为两种,分别为预选调度算法和优选调度算法。除调度策略外,Kubernetes还支持优先级调度、抢占机制及亲和性调度等功能。

kube-scheduler组件支持高可用性(即多实例同时运行),即基于Etcd集群上的分布式锁实现领导者选举机制,多实例同时运行,通过kube-apiserver提供的资源锁进行选举竞争。抢先获取锁的实例被称为Leader节点(即领导者节点),并运行kube-scheduler组件的主逻辑;而未获取锁的实例被称为Candidate节点(即候选节点),运行时处于阻塞状态。在Leader节点因某些原因退出后,Candidate节点则通过领导者选举机制参与竞选,成为Leader节点后接替kube-scheduler的工作。

Kubelet

kubelet组件用来接收、处理、上报kube-apiserver组件下发的任务。kubelet进程启动时会向kube-apiserver注册节点自身信息。它主要负责所在节点(Node)上的Pod资源对象的管理,例如Pod资源对象的创建、修改、监控、删除、驱逐及Pod生命周期管理等。

kubelet组件实现了3种开放接口:

  • Container Runtime Interface:简称CRI(容器运行时接口),提供容器运行时通用插件接口服务。CRI定义了容器和镜像服务的接口。CRI将kubelet组件与容器运行时进行解耦,将原来完全面向Pod级别的内部接口拆分成面向Sandbox和Container的gRPC接口,并将镜像管理和容器管理分离给不同的服务。

  • Container Network Interface:简称CNI(容器网络接口),提供网络通用插件接口服务。CNI定义了Kubernetes网络插件的基础,容器创建时通过CNI插件配置网络。

  • Container Storage Interface:简称CSI(容器存储接口),提供存储通用插件接口服务。CSI定义了容器存储卷标准规范,容器创建时通过CSI插件配置存储卷。

Kube-Proxy

kube-proxy组件,作为节点上的网络代理,运行在每个Kubernetes节点上。它监控kube-apiserver的服务和端点资源变化,并通过iptables/ipvs等配置负载均衡器,为一组Pod提供统一的TCP/UDP流量转发和负载均衡功能。

Kube-Proxy有几个工作模式:

  • userspace
  • iptables 模式
  • ipvs 模式

具体可以参考:services-networking

CRI容器运行时组件

CRI 在 Kubernetes 1.5 中引入,充当kubelet和容器运行时之间的桥梁。

即kubelet需要跟Contaner Runtime交互去管理容器的生命周期。