课程目标

  • 组件的形象比喻
  • Kubernetes架构
  • 讨论kubernetes集群上的主要组件
    • 从角色上分
    • 从逻辑上分
  • 组件和组件之间是怎样交互的

1. 组件的形象比喻

我们可以把各个组件比喻成一个学校中的实际形象,希望大家能够理解

组件名称 职责 形象 职责
节点 master节点,worker节点 教学楼 有行政楼,1,2,3,4号教学楼
api-server 负责所有接收和分析请求,是集群的中枢 校长 对学校负责,是整个学校的协调人
scheduler 负责监控所有集群的资源使用情况 行政校长 对于整个校园的资源进行调度,分配工作
controller-manager 监控controller,保证controller的健康 副校长-教务 负责学校内各个年级的教务主任的工作
etcd 数据库 学生管理系统 存储所有信息
controller 负责pod的状态监控,保证管辖内的pod一直向着既定目标改变 教务主任 安排课程,安排老师,保证每个学生都上好课
kubelet 负责监控node上的状态是否健康 摄像头 负责监控班级内部的同学是不是上课开小差
service 服务发现和负载均衡 班主任 负责班级内部事务
kubelet 负责监控node上的状态是否健康 摄像头 负责监控班级内部的同学是不是上课开小差
kube-proxy 负责给资源分配可用的网络 手机 让大家都可以通信
网络插件 提供网络功能和隔离功能 步话机频段/手机供应商 联通或者电信,可以给每个人一个手机号
pod 最小调度单位 学生 我们来到学校都是为了完成学业
initcontainer 在主容器启动之前的容器 肚子 吃饱了才能上学
sidecar 辅助主容器的容器 书包 可以放上学的书,可以放水杯
daemonset 每个节点上都有 厕所 每个教学楼都有,新建教学楼就得有厕所
deployment 我们的应用都会做成deployment来服务 班级 学校都是以班级为单位进行教学任务的
namespace 集群隔离 学校的区域 教学区域,app,大操场,default,老师办公室,kube-system
docker 容器运行时 教师 负责学生的学习

2. Kubernetes架构

  • Master and worker nodes
  • Controllers
  • Services
  • Pods of containers
  • Network and policies

img

Concepts Underlying the Cloud Controller Manager

kubernetes从运维的角度来说,其实就是一个集群,组合多台主机整合成为一个大的资源池,并统一对外提供计算,存储等能力的集群,这个集群,就是找几台主机,每台主机都安装上相关的kubernetes应用程序,并通过某些具有管理功能的应用程序来协调资源,共同工作,把多个主机当一个主机来使用。

3. 从角色来分

在k8s的集群当中,主机是分角色的。k8s就是一个有中心节点的系统,他是master/nodes模型,他有一个/组节点来做master,其他节点做node节点。一般的master有三个就足够了,而nodes或者worker,负责工作。还有一种说法,把Master节点分成了控制平面control panel和数据库节点etcd,我们这里统称为master节点。

3.1. Master Node(行政楼)

Kubernetes的master节点上运行着多个集群中的服务和管理进程。在master节点上运行着kube-apiserver,kube-scheduler和etcd数据库。随着软件的成熟,为了满足某些特定的需求,就会有新的组件产生,比如cloud-controller-manager,如果kube-controller-manager发现有需要和外部程序打交道的需求事,就会把这部分任务交给cloud-controller-manager,比如Rancher,DigitalOcean这种第三方的集群管理软件。

  • kube-apiserver(校长)

    有一个对外的email,xiaozhang@xuexiao.com,邮箱地址就相当于我们api-server所监听的6443。

    kube-apiserver是操作Kubernetes集群的核心。所有的请求,不管是内部的还是外部的请求,都是由kube-apiserver来代理的。所有的操作都是由apiserver来接受并且验证,并且他是链接到etcd数据的唯一一个组件。他为API对象验证并且配置数据(etcd中的数据),可以接受RESTful风格的请求(GET,PUT)。他作为master节点上的进程,是整个集群的入口,扮演着前端的角色,他负责共享整个集群的状态(通过查询etcd)。

  • kube-scheduler(行政校长)

    会根据学校的资源情况,对学生进行分班。

    kube-scheduler借助于算法来决定含有容器的Pod应该被分配到哪个主机上去。scheduler会查看可以被分配出来的系统资源,然后尝试并且失败了会重新尝试部署Pod,直到成功。有很多元素会影响算法,或者我们可以使用自定的调度器。我们甚至可以把pod绑定在某个特定的节点,但由于其他设置,Pod可能仍处于挂起状态。引用的第一个设置之一是Pod是否可以在当前配额限制内部署。如果是这样,那么taints污点和tolerations容忍度、pod的标签和节点的标签一起用于确定正确的位置。

  • etcd(数据库)

    学校的管理系统,储存这整个学校的情况。

    集群、网络和其他持久信息的状态保存在etcd数据库中,或者更准确地说,保存在b+树键值存储中。他不是查找和更改条目,而是始终将值追加到末尾。数据的先前副本随后被标记,以便将来通过回收(compaction)过程移除。它可以通过curl使用HTTP库访问,并提供可靠的监视查询。

    更新值的同时请求通过kube apiserver,然后将请求以顺序的形式传递给etcd。第一个请求将更新数据库。第二个请求将不再具有相同的版本号,在这种情况下,kube apiserver将用错误409回复请求者。服务器端没有超过该响应的逻辑,这意味着客户端需要期望这一点,并在拒绝更新时采取行动。

    有一个master数据库和follower。他们在不停的相互沟通,以确定谁将是master,并在发生故障时确定另一个master。虽然速度很快,而且可以快速回复,但如果使用某些工具(如kubeadm),来升级整个集群的话,就会出现一些短暂的服务终端。

  • Other Agents(kube-controller-manager教务校长)

    负责教务主任的安排。

    kube controller manager是一个核心控制循环守护进程,它与kube apiserver交互以确定集群的状态。如果状态不匹配,管理器将联系必要的控制器以匹配所需的状态。我们有许多的控制器,例如endpoint、namespace和replication。随着kubernetes的成熟,控制器的数量已经扩大。

    在v1.16的测试版中,云控制器管理器ccm)与云外的代理交互。一旦由kube controller manager处理任务,它就会处理这些任务。这允许在不改变核心Kubernetes控制过程的情况下进行更快的更改。每个kubelet必须使用传递给二进制文件的–cloud provider external设置。您还可以开发自己的ccm,它可以作为守护程序部署为树内部署或独立的树外安装。cloud controller manager是一个可选的代理,它需要几个步骤来启用。

3.2. Worker Nodes(教学楼)

在教学楼来完成学习任务

所有工作节点都运行kubelet和kube-proxy,以及容器引擎,如Docker或rkt。部署其他管理守护程序来监视这些代理或提供Kubernetes尚未包含的服务。

kubelet与安装在所有节点上的底层Docker引擎进行交互,并确保需要运行的容器实际上正在运行。kube代理负责管理到容器的网络连接。它是通过使用iptables条目来实现的。它还具有用户空间模式,在这种模式下,它使用一个随机端口来代理流量和ipv的alpha特性来监视服务和端点。

您也可以运行Docker引擎的另一种选择:cri-o或rkt。要了解如何做到这一点,您应该查看文档。在未来的版本中,Kubernetes很可能支持其他容器运行时引擎。

Supervisord是一个轻量级的进程监视器,用于传统Linux环境中监视和通知其他进程。在集群中,这个守护进程监视kubelet和docker进程。如果失败,它将尝试重新启动它们,并记录事件。虽然不是标准安装的一部分,但有些可能会添加此监视器以添加报告。

  • Kubelet(监控摄像头)

    他的职责,监控学校的运行情况。一旦出现异常,通知校长。

    kubelet是worker节点上更改和配置的重要工具。它接受Pod的specifications规范的API调用(一个PodSpec是描述Pod的JSON或YAML文件)。在满足规范之前,它将不停的配置本地节点。

    如果Pod需要访问storage, Secrets or ConfigMaps,kubelet将确保访问或创建。它还将状态发送回kube apiserver,以便最终持久化。

    • 使用PodSpec

    • 将卷装载到Pod

    • 下载secret

    • 将请求传递到本地容器引擎

    • 向群集报告pod和节点的状态。

    Kubelet调用其他组件,如拓扑管理器,它使用来自其他组件的提示来配置拓扑感知资源分配,如CPU和硬件加速器。作为alpha功能,默认情况下不启用。

  • kube-proxy(手机)

    即使有两个容器,它们共享相同的名称空间和相同的IP地址,这将由kubectl发起请求,kube-proxy负责配置。IP地址在容器启动之前分配到容器中。容器将具有类似于eth0@tun10的接口。这个IP是跟随pod整个生命周期的。

    endpoint与service同时创建。注意,它使用pod IP地址,但也包括一个端口。该服务使用ipvs中的iptables将网络流量从节点高位端口连接到端点。kube-controller-manager处理监视循环,以监视endpoint和service以及任何更新或删除的需要。

    此图显示了一个单pod、双containers的节点。NodePort服务将Pod连接到外部网络。

    w7eqx8n15cor-ContainerNetwork

  • 网络插件

    尽管kube-proxy负责分配IP地址,但是kube-proxy自己不能完成这项任务,需要借助其他的软件来帮助提供网络功能和策略。kubernetes提供了一个网络接口就CNI,只要符合这个接口的软件都可以kubernetes的网络解决方案。

    如果您有部署基于IaaS解决方案的虚拟机(vm)的经验,这听起来会很熟悉。唯一需要注意的是,在Kubernetes中,最低的计算单位不是容器,而是我们所说的pod。就比如,我们的openstack,他的网络组建叫neutron,而实际上内部是借助于其他网络插件来构建网络的,比如ovs或者calico。

    pod是共享相同IP地址的一组位于同一位置的容器。从网络的角度来看,pod可以看作是物理主机的虚拟机。网络需要为pod分配IP地址,并且需要在任何节点上的所有pod之间提供流量路由。

    在容器编排系统中要解决的三个主要网络挑战是:

    • 耦合容器到容器的通信(通过pod概念解决)。

    • 点对点通信。

    • 外部到pod通信(由服务概念解决,我们稍后将讨论)。

4. 从逻辑上分

  • Pods(学生)

    学校的最小调度单元。

    Kubernetes的整个要点是协调容器的生命周期。我们不与特定的容器交互。相反,我们能处理的最小的单元是一个Pod。有人会说一个荚豌豆。由于资源共享,Pod的设计通常遵循每个容器一个进程的架构。

    Pod中的容器是并行启动的。因此,没有办法确定哪一个容器首先在Pod内可用。在某种程度上,使用InitContainers可以命令启动。要支持在容器中运行的单个进程,可能需要日志记录、代理或特殊适配器。这些任务通常由同一个pod中的其他容器处理。

    每个Pod只有一个IP地址,几乎每个网络插件都有。如果一个pod中有多个容器,它们必须共享IP。为了相互通信,它们可以使用IPC、环回接口或共享文件系统。

    虽然Pod通常在部署时每个应用程序容器中都有一个,但是Pod中有多个容器的一个常见原因是用于日志记录。您可能会发现术语sidecar是指专用于执行帮助器任务(如处理日志和响应请求)的容器,因为主应用程序容器可能不具备此功能。术语sidecarambassadoradapter一样,没有特殊的设置,但指的是包含二级吊舱的概念。

image-20200420154642789

  • Controllers(教务主任)

    教务主任的主要任务,就是安排学生们的学习,主任会对同类的学生分配一定的学习任务。

    编排的一个重要概念是使用控制器。各种控制器与Kubernetes一起发布,您也可以创建自己的控制器。控制器的简单来说就是是agent(或称为Informer)和downsteam存储。使用DeltaFIFO队列比较源和downsteam数据。循环进程接收一个obj或对象,它是来自FIFO队列的delta数组。只要delta不是Deleted类型,控制器的逻辑控制器就会创建或修改某个对象,直到它与规范匹配为止。

    使用API-server作为源的Informer通过API调用请求对象的状态。数据会被缓存,来最小化API-server的负载。类似的agent是SharedInformer;对象通常由多个其他对象使用。它为多个请求创建状态的共享缓存。

    工作队列workqueue使用一个键将任务分发给不同的worker。通常使用go语言内置的队列(queue)来做资源限制、延迟和时间队列。

    endpointnamespaceserviceaccount控制器分别管理pod的同名资源。

  • Services(班主任)

    访问某个班级,我要一个学生帮我做卫生,班主任来班级选学生来参加扫除。

    由于每个对象和代理都是分离的,所以我们需要一个灵活的、可伸缩的代理,它将资源连接在一起,如果有什么东西死了,产生了替代品,它就会重新连接。每个服务都是一个微服务,处理特定的通信量,例如单个NodePort或LoadBalancer,以在多个pod之间分发入站请求。

    7bsdyahn0rbx-Servicesuserspaceoverview

服务还处理入站请求的访问策略,这对于资源控制和安全性都很有用。

  • 把Pod连接在一起

  • 向Internet公开播客

  • 解耦配置

  • 定义Pod访问策略。

Service Network

Service Network(做卫生)

ClusterIP的方式,实际上是由老师来指定学生做卫生。

NodePort的方式,老师把值班表贴在的班级的门口。

Node

节点是在集群外部创建的表示实例的API对象。虽然主节点必须是Linux,但工作节点也可以是Microsoft Windows Server 2019。一旦节点安装了必要的软件,它就会被接收到API服务器中。

现在,您可以通过传递join,创建一个带有kubeadm init和worker节点的主节点。在不久的将来,可以加入辅助主节点和/或etcd节点。

如果kube apiserver在5分钟内无法与节点上的kubelet通信,则默认的NodeLease将安排删除该节点,并且NodeStatus将从ready更改。一旦重新建立连接,播客将被逐出。它们不再被集群强制移除和重新调度。

每个节点对象都存在于kube-node-lease命名空间中。要从集群中删除节点,首先使用kubectl delete node将其从API服务器中删除。这将导致吊舱被疏散。然后,使用kubeadm reset删除集群特定信息。您可能还需要删除iptables信息,这取决于您是否计划重新使用该节点。

API Call Flow

img