Borg 的研究人员曾经在论文中提到这样一个观点:
运行在大规模集群中的各种任务之间,实际上存在着各种各样的关系。这些关系的处理,才是作业编排和管理系统最困难的地方。

而 k8s 项目所擅长的,正是按照用户的意愿和整个系统的规则,完全自动化地处理好容器之间的各种关系。

这种功能,就是我们经常听到的一个概念:编排。




一、k8s 的设计架构

认识 k8s 的本质


类似 Borg ,k8s 也由 Master 和 Node 两种节点组成,这两种角色分别对应控制节点和计算节点。


1、控制节点

Master 主要用于编排、管理、调度用户提交的作业。


Master 由三个独立组件组合而成:
1.1 kube-apiserver: 负责 API 服务,整个集群的持久化数据由 kube-apiserver 处理后保存在 Etcd 中。
1.2 kube-scheduler: 负责调度
1.3 kube-controller-manager: 负责容器编排


2、计算节点

计算节点 Node 上最核心的部分,是 kubelet组件。


2.1 kubelet 主要负责同容器运行时打交道,交互需要依赖 CRI ;


CRI:Container Runtime Interface
这个远程调用接口定义了容器运行时的各项核心操作,比如启动一个容器需要的所有参数。
只要你的容器运行时能够运行标准的容器镜像,就可以通过实现 CRI 接入到 k8s 项目当中。

OCI : 容器运行时规范
具体的容器运行时一般通过 OCI 同底层的 Linux 操作系统进行交互,
把 CRI 请求翻译成对 Linux 操作系统的调用( 操作 Linux Namespace 和 Cgroups 等)。


2.2 kubelet 还通过 gRPC 协议同一个叫作 Device Plugin 的插件进行交互;


Device Plugin :
是 k8s 项目用来管理 GPU 等宿主机物理设备的主要组件,
也是基于 k8s 项目进行机器学习训练、高性能作业支持等工作必须关注的功能。

2.3 kubelet 还能调用网络插件和存储插件,为容器配置网络和持久化存储
kubelet 与网络插件进行交互的接口: CNI(Container Networking Interface)
kubelet 与存储插件进行交互的接口: CSI(Container Storage Interface)




二、k8s 项目本质


1、关键对象

1.1 Pod :

k8s 项目对容器间的“访问”进行了分类,总结出哪些应用之间需要非常频繁的交互和访问;
这些应用被划分为一个“Pod”,
Pod 是 k8s 项目中最基础的一个对象,
Pod 里的容器共享同一个 Network Namespace、同一组数据卷,从而达到高效率交换信息的目的。


1.2 Service :

Web 应用与数据库之间的访问关系,k8s 项目则提供了一种叫作“Service”的服务。
Web 应用与数据库 往往故意不部署在同一台机器上,这样即使 Web 应用所在的机器宕机了,数据库也完全不受影响。

对于一个容器来说,它的 IP 地址等信息不是固定的,那么 Web 应用又是怎么找到数据库容器的 Pod 呢?
给 Pod 绑定一个 Service 服务,而 Service 服务声明的 IP 地址等信息是“终生不变”的。

这个Service 服务的主要作用,就是作为 Pod 的代理入口(Portal),从而代替 Pod 对外暴露一个固定的网络地址。


2、k8s 如何处理应用与应用之间的关系?

容器间“紧密协作”关系如何维护
===>
Pod


如何一次启动多个应用?
===>
Deployment ( Pod 多实例管理器 )


如何通过一个固定的 IP 地址和端口以负载均衡的方式访问这组 POD ?
===>
Service


如果两个不同 Pod 之间在访问发起时需要加上授权信息,那如何处理这种关系 ?
===>
Secret对象

授权信息以 Secret 键值对方式保存在 Etcd 里 ,
k8s 就会在指定的Web 应用 Pod 启动时,自动把 Secret 里的数据以 Volume 的方式挂载到容器里。
这样这个 Web 应用 Pod 就可以访问数据库了。


3、k8s 如何定义应用运行的形态?

Job: 基于 Pod 改进后的对象,用来描述一次性运行的 Pod(比如,大数据任务)
DaemonSet :用来描述每个宿主机上必须且只能运行一个副本的守护进程服务;
CronJob:则用于描述定时任务等等。


4、k8s 核心功能

围绕容器和 Pod 不断向真实的技术场景扩展,从而得到 k8s 的项目核心功能:


认识 k8s 的本质


k8s 提供了一套基于容器构建分布式系统的基础依赖。
所以说,
k8s 项目的本质,是为用户提供一个具有普遍意义的容器编排工具!




参考文档:张磊老师的 深入剖析Kubernetes

相关文章:

  • 2021-12-30
  • 2021-12-13
  • 2021-04-26
  • 2021-11-11
  • 2021-09-15
  • 2021-12-12
  • 2021-10-13
  • 2021-09-15
猜你喜欢
  • 2022-12-23
  • 2022-01-01
  • 2022-12-23
  • 2021-05-05
  • 2022-12-23
  • 2021-07-04
  • 2021-12-05
相关资源
相似解决方案