【前言】
需要掌握的要点:
介绍说明: 前世今生 KUbernetes 框架 KUbernetes关键字含义
基础概念: 什么是 Pod 控制器类型 K8S 网络通讯模式
Kubernetes: 构建 K8S 集群
资源清单:资源 掌握资源清单的语法 编写 Pod 掌握 Pod 的生命周期***
Pod 控制器:掌握各种控制器的特点以及使用定义方式
服务发现:掌握 SVC 原理及其构建方式
存储:掌握多种存储类型的特点 并且能够在不同环境中选择合适的存储方案(有自己的简介)
调度器:掌握调度器原理 能够根据要求把Pod 定义到想要的节点运行
安全:集群的认证 鉴权 访问控制 原理及其流程
HELM:Linux yum 掌握 HELM 原理 HELM 模板自定义 HELM 部署一些常用插件
运维:修改Kubeadm 达到证书可用期限为 10年 能够构建高可用的 Kubernetes 集群(高可用集群副本数据最好是 >= 3 奇数个)
服务分类:有状态服务:DBMS 、无状态服务:LVS APACHE
K8S架构
各个组件的功能作用:
scheduler
参考文章
Kubernetes中的关键模块,为Pod提供调度服务,例如基于资源的公平调度、调度Pod到指定节点、或者通信频繁的Pod调度到同一节点等。要确保以下几个目标:公平性(公平的进行决策,每个节点都有被分配资源的机会,调度器需要对不同节点的使用作出平衡决策)、资源高效利用(最大化群集所有资源的利用率,使有限的CPU、内存等资源服务尽可能更多的Pod)、 效率问题(能快速的完成对大批量Pod的调度工作)、灵活性(Pod的调度策略是可控的,允许多个调度器并行工作,支持自定义调度器)
调度流程
kube-scheduler的根本工作任务是根据各种调度算法将Pod绑定(bind)到最合适的工作节点,整个调度流程分为两个阶段:预选策略(Predicates)和优选策略(Priorities)
通俗点说,调度的过程就是在回答两个问题:1. 候选有哪些?2. 其中最适合的是哪个?
- 预选(
Predicates
):输入是所有节点,输出满足预选条件的节点。kube-scheduler根据预选策略过滤掉不满足策略的Nodes。例如,如果某节点的资源不足或者不满足预选策略的条件如“Node的label必须与Pod的Selector一致”时则无法通过预选。预选的策略:
存储卷数量、资源(内存和磁盘)压力状态、卷冲突、约束关系(nodeSelector)、适合性
- 优选(
Priorities
):输入是预选阶段筛选出的节点,优选会根据优先策略为通过预选的Nodes进行打分排名,选择得分最高的Node。例如,资源越富裕、负载越小的Node可能具有越高的排名。优选的策略:
用一组优先级函数处理每个通过预选的节点,每个函数返回0-10的分数,各个函数有不同权重,最终得分是所有优先级函数的加权和,即节点得分的计算公式为:FinalScore=Σ(i从1到n)weight*priorityFunction。优先级函数priorityFunction包括LeastRequestedPriority、BalancedResourceAllocation、SelectorSpreadPriority、NodeAffinityPriority、InterPodAffinityPriority、NodePreferAvoidPodsPriority等
Pod的整个启动流程进行总结:
- 资源管控中心
Controller Manager
创建新的Pod,将该Pod加入待调度的Pod列表。 - kube-scheduler通过
API Server
提供的接口监听Pods,获取待调度pod,经过预选和优选两个阶段对各个Node节点打分排序,为待调度Pod列表中每个对象选择一个最优的Node。 - kube-scheduler将Pod与Node的绑定写入
etcd
(元数据管理服务)。 - 节点代理服务
kubelet
通过API Server监听到kube-scheduler产生的绑定信息,获得Pod列表,下载Image并启动容器,然后由kubelet负责拉起Pod。
【注意】如果在预选阶段没有节点满足条件,Pod会一直处在Pending
状态直到出现满足的节点,在此期间调度器会不断的进行重试。
pod简介
pod是一个或多个容器的组合,这些容器共享存储、网络、命名空间和运行规范。pod相当于是这些容器的逻辑主机,容器有相同的共享上下文,所有容器被统一的安排和调度。
- 什么是pod的上下文? 多个linux命名空间的联合:
PID 命名空间(同一个Pod中应用可以看到其它进程)
网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限)
IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信)
UTS 命名空间(同一个Pod中的应用共享一个主机名称)
在不同Pod中的容器,拥有不同的IP地址,因此不能够直接在进程间进行通信。容器间通常使用Pod IP地址进行通信。
在Pod被创建时,会被指派一个唯一的ID,并被调度到Node中,直到Pod被终止或删除。如果Pod所在的Node宕机,给定的Pod(即通过UID定义)不会被重新调度。相反,它将 被完全相同的Pod所替代。