图解 K8s 核心概念和术语

我第一次接触容器编排调度工具是Docker自家的DockerSwarm , 主要解决当时公司内部业务项目部署繁琐的问题 , 我记得当时项目实现容器化之后 , 花在项目部署运维的时间大大减少了 , 当时觉得这玩意还挺新鲜的 , 原来自动化运维可以这么玩 。 后面由于工作原因 , 很久没碰过容器方面的知识了 。 最近在公司的数据同步项目中 , 需要使用到分布式调度数据同步执行单元 , 目前使用的方案是将数据同步执行单元打包成镜像 , 使用K8s进行调度 , 正好趁这个机会了解一下K8s , 下面我就用图解的形式将我所理解的K8s分享给大家 。 K8s三大核心功能
K8s是一个轻便的和可扩展的开源平台 , 用于管理容器化应用和服务 。 通过K8s能够进行应用的自动化部署和扩缩容 。
K8s是比容器更上一层的架构 , 它可以支持多种容器技术 , 比如我们熟悉的Docker , K8s定位是一个容器调度工具 , 它主要具备以下三大核心能力:
1、自动调度
k8s将用户部署提交的容器放到k8s集群的任意一个节点中 , k8s可以根据容器所需要的资源大小 , 以及节点的负载情况来决定容器放在哪个节点上面 。
图解 K8s 核心概念和术语
文章图片

2、自动修复
当k8s的健康检查机制发现某个节点出现问题 , 它会自动将该节点上的资源转移到其它节点上面完成自动恢复 。
图解 K8s 核心概念和术语
文章图片

3、横向自动扩缩容
在k8s1.1+版本中 , 有一个功能叫“HorizontalPodAutoscaler” , 简称“HPA” , 意思是Pod自动扩容 , 它可以预先定义Pod的负载指标 , 当达到预期设定的负载指标后 , 就会根据指标自动触发自动动态扩容/缩容行为 。
1)横向自动扩容
图解 K8s 核心概念和术语
文章图片

2)横向自动缩容
图解 K8s 核心概念和术语
文章图片

节点
从上面的图可以看出来 , k8s集群的节点有两个角色 , 分别为Master节点和Node节点 , 整个K8s集群Master和Node节点关系如下图所示:
图解 K8s 核心概念和术语
文章图片

1、Master节点
Master节点也称为控制节点 , 每个k8s集群都有一个Master节点负责整个集群的管理控制 , 我们上面介绍的k8s三大能力都是经过Master节点发起的 , Master节点包含了以下几个组件:
图解 K8s 核心概念和术语
文章图片

APIServer:提供了HTTPRest接口的服务进程 , 所有资源对象的增、删、改、查等操作的唯一入口;
ControllerManager:k8s集群所有资源对象的自动化控制中心;
Scheduler:k8s集群所有资源对象自动化调度控制中心;
ETCD:k8s集群注册服务发现中心 , 可以保存k8s集群中所有资源对象的数据 。
2、Node
Node节点的作用是承接Master分配的工作负载 , 它主要有以下几个关键组件:
图解 K8s 核心概念和术语
文章图片

kubelet:负责Pod对应容器的创建、启停等操作 , 与Master节点紧密协作;
kube-porxy:实现k8s集群通信与负载均衡的组件 。
从图上可看出 , 在Node节点上面 , 还需要一个容器运行环境 , 如果使用Docker技术栈 , 则还需要在Node节点上面安装DockerEngine , 专门负责该节点容器管理工作 。 Pod
Pod是k8s最重要而且是最基本的一个资源对象 , 它的结构如下:
图解 K8s 核心概念和术语
文章图片

从以上Pod的结构图可以看出 , 它其实是容器的一个上层包装结构 , 这也就是为什么K8s可以支持多种容器类型的原因 , 基于这方面 , 我理解k8s的定位就是一个编排与调度工具 , 而容器只是它调度的一个资源对象而已 。
Pod可包含多个容器在里面 , 每个Pod至少会有一个Pause容器 , 其它用户定义的容器都共享该Pause容器 , Pause容器的主要作用是用于定义Pod的ip和volume 。
Pod在k8s集群中的位置如下图所示:
图解 K8s 核心概念和术语
文章图片

Label
Label在k8s中是一个非常核心的概念 , 我们可以将Label指定到对应的资源对象中 , 例如Node、Pod、ReplicaSet、Service等 , 一个资源可以绑定任意个Label , k8s通过Label可实现多维度的资源分组管理 , 后续可通过LabelSelector查询和筛选拥有某些Label的资源对象 , 例如创建一个Pod , 给定一个Label , workerid=123 , 后续可通过workerid=123删除拥有该标签的Pod资源 。
图解 K8s 核心概念和术语
文章图片

ReplicaSet
ReplicaSet目的是为了定义一个期望的场景 , 比如定义某种Pod的副本数量在任意时刻都处于PeplicaSet期望的值 , 假设ReplicaSet定义Pod的副本数目为:replicas=2 , 当该ReplicaSet提交给Master后 , Master会定期巡检该Pod在集群中的数目 , 如果发现该Pod挂掉了一个 , Master就会尝试依据ReplicaSet设置的Pod模板创建Pod , 以维持Pod的数量与ReplicaSet预期的Pod数量相同 。
通过ReplicaSet , k8s集群实现了用户应用的高可用性 , 而且大大减少了运维工作量 。 因此生产环境一般用Deployment或者ReplicaSet去控制Pod的生命周期和期望值 , 而不是直接单独创建Pod 。
图解 K8s 核心概念和术语
文章图片

类似ReplicaSet的还有Deployment , 它的内部实现也是通过ReplicaSet实现的 , 可以说Deployment是ReplicaSet的升级版 , 它们之间的yaml配置文件格式大部分都相同 。 Service
Service是k8s能够实现微服务集群的一个非常重要的概念 , 顾名思义 , k8s的Service就是我们平时所提及的微服务架构中的“微服务” , 本文上面提及的Pod、ReplicaSet等都是为Service服务的资源 , 如下图表示Service、Pod、ReplicaSet的关系:
图解 K8s 核心概念和术语
文章图片

从上图可看出 , Service定义了一个服务访问的入口 , 客户端通过这个入口即可访问服务背后的应用集群实例 , 而Service则是通过LabelSelector实现关联与对接的 , ReplicaSet保证服务集群资源始终处于期望值 。
以上只是一个微服务 , 通常来说一个应用项目会由多个不同业务能力而又彼此独立的微服务组成 , 多个微服务间组成了一个强大而又高可用的应用服务集群 。
图解 K8s 核心概念和术语
文章图片

Namespace
Namespace顾名思义是命名空间的意思 , 在k8s中主要用于实现资源隔离的目的 , 用户可根据不同项目创建不同的Namespace , 通过k8s将资源分配到不同Namespace中 , 即可实现不同项目的资源隔离:
【图解 K8s 核心概念和术语】图解 K8s 核心概念和术语
文章图片


    推荐阅读