文章目录
Borg 的研究人员曾经在论文中提到这样一个观点:
运行在大规模集群中的各种任务之间,实际上存在着各种各样的关系。这些关系的处理,才是作业编排和管理系统最困难的地方。
而 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 项目的本质,是为用户提供一个具有普遍意义的容器编排工具!
参考文档:张磊老师的 深入剖析Kubernetes