基本概念

Pod 与 Pod控制器

Pod

  • pod是k8s能够运行的最小逻辑单元
  • 一个pod里面可以运行多个容器
  • 一个pod内 多个容器之间 共享 UTS(主机和域名)、NET(网络设备、端口等)、IPC(信号量、消息队列、共享内容等),但是 文件系统和进程编号依旧是隔离的(PID、mount)
  • 可以将Pod理解成豌豆荚,一个豌豆荚内有多个豌豆,豌豆就是docker容器
  • 一个Pod里运行多个容器,又叫:边车(SideCar)模式,SideCar 名词出现的较为频繁
  • 由于pod内共享uts、net、ipc的原因,pod不支持跨节点组合,一般来说一个主机只能有一个pod
  • pod可以单独启动而不依赖于pod控制器,这并不是必须的,pod控制器只是为了更好的管理pod,但在生产上强烈建议使用pod控制器管控pod它可以保证pod始终按照我们的意愿来管理整个生命周期及副本数量

    Pod控制器

    Pod控制器是pod启动的一种模板,用来保证在K8S里启动的Pod应始终按照人们的预期运行(副本数、生命周期、健康状态检查等)

K8S内 提供了众多的Pod控制器,常用的有:

  • Deployment:工作在ReplicaSet之上,用于管理无状态应用,目前来说最好的控制器。支持滚动更新和回滚功能,还提供声明式配置。
  • DaemonSet:用于确保集群中的每一个节点只运行特定的pod副本,通常用于实现系统级后台任务。比如ELK服务
    • 特性:服务是无状态的
    • 服务必须是守护进程
  • ReplicaSet:代用户创建指定数量的pod副本数量,确保pod副本数量符合预期状态,并且支持滚动式自动扩容和缩容功能。
    • ReplicaSet主要三个组件组成:
      • 用户期望的pod副本数量
      • 标签选择器,判断哪个pod归自己管理
      • 当现存的pod数量不足,会根据pod资源模板进行新建
  • StatefulSet:管理有状态应用
  • Job:只要完成就立即退出,不需要重启或重建。
  • CronJob:周期性任务控制,不需要持续后台运行,

    Name 与 Namespace

    Name 名称

    由于K8S内部,使用资源来定义每一种功能,每一种资源都应该有自己的名称
    通过五个维度的信息来定义资源,每一种资源都有这五个信息:

    • API版本(apiVersion)
    • 类别(kind)
    • 元数据(metadata)
    • 定义清单(spec)
    • 状态(status)

Namespace 命名空间

命名空间,可以理解为K8S内部的虚拟集群组
不同命名空间的资源名称可以相同,相同命名空间内的同种资源名称不能相同

K8S里默认存在的命名空间有:Defeat、kube-system、kube-public等
查询K8S里特定资源 要带上命名空间

Label 与 Label 选择器

label 标签

用于分类管理资源对象 ,标签与资源是多对多的关系
标签的组成:key:value
与标签类似的 还有一种“注解” (annotations)
标签的值不能大于63个字节 并且只能是大小写字母或者是数字开头,只能包含-、_和.

label 选择器

给资源创建标签之后们可以使用标签选择器过滤指定的标签
选择器目前只有两个:基于等值关系和基于集合关系
许多资源支持内嵌字段:
matchLabels
matchExpressions

Service 与 Ingress

Service 服务

在K8S中,每个pod会被分配一个单独的IP地址,这个IP地址会随着Pod的销毁而消失(换句话来说就是IP资源的上限,决定了Pod的上限)
Service 就是用来解决这个问题的核心概念
一个Service 可以看作一组提供相同服务的Pod对外访问接口
Service 作用于那些Pod是通过标签选择器来定义的
Service 基于label选择器

Ingress

Ingress 是K8S集群里工作在OSI 网络参考模型下,第七层的应用,对外暴露的接口。
Service 只能进行L4(第四层:传输层)流量调度,表现形式是ip + port
Ingress 则可以调度不同业务域, 不同URL访问路径的业务流量
ingress 基于Service
如果提供类似HTTP以及HTTPS的资源 应该使用ingress 而不是Service

K8S的三条网络

  • 核心组件
    • 配置存储中心 etcd服务
    • 主控节点 master
      • kube-apiserver服务
      • kube-controller-manager服务
      • kube-scheduler服务

运算节点的资源损耗和剩余、负载情况、数据位置等信息由节点本身汇报存储在etcd,scheduler 通过评估这些资源 负载 等各个因素进行判断,确保满足场景需求的同时将Pod分配到最优节点,kube-scheduler 影响着kubernetes集群的可用性与性能,pod数量越多 集群的调度能力越重要

  1. - 主要功能是接收调度pod到适合的运算节点上
  2. - 预算策略

输入是所有节点,输出是满足预选条件的节点。kube-scheduler根据预选策略过滤掉不满足策略的Nodes。例如,如果某节点的资源不足或者不满足预选策略的条件如“Node的label必须与Pod的Selector一致”时则无法通过预选。

  1. 1. 基于存储卷数量的判断<br />
  2. - MaxEBSVolumeCount:确保已挂载的EBS存储卷数量不超过设置的最大值(默认39),调度器会检查直接或及间接使用这种类型存储的PVC,累加总数,如果卷数目超过设最大值限制,则不能调度新Pod到这个节点上。<br />
  3. - MaxGCEPDVolumeCount:同上,确保已挂载的GCE存储卷数量不超过预设的最大值(默认16)。<br />
  4. - MaxAzureDiskVolumeCount:同上,确保已挂载的Azure存储卷不超过设置的最大值(默认16)。<br />
  5. 2. 基于资源压力状态的判断<br />
  6. - CheckNodeMemoryPressure:判断节点是否已经进入到内存压力状态,如果是则只允许调度内存为0标记的Pod。<br />
  7. - CheckNodeDiskPressure:判断节点是否已经进入到磁盘压力状态,如果是,则不能调度新的Pod。<br />
  8. 3. 基于卷冲突的判断<br />
  9. - NoDiskConflict:卷冲突判断,即如果该节点已经挂载了某个卷,其它同样使用相同卷的Pod将不能再调度到该节点。<br />
  10. - NoVolumeZoneConflict:对于给定的某块区域,判断如果在此区域的节点上部署Pod是否存在卷冲突。<br />
  11. - NoVolumeNodeConflict:对于某个指定节点,检查如果在此节点上部署Pod是否存在卷冲突。<br />
  12. 4. 基于约束关系的判断<br />
  13. - MatchNodeSelector:检查节点标签(label)是否匹配Pod指定的nodeSelector,是则通过预选。<br />
  14. - MatchInterPodAffinity:根据Pod之间的亲和性做判断。<br />
  15. - PodToleratesNodeTaints:排斥性关系,即判断Pod不允许被调度到哪些节点。这里涉及到两个概念Taints(污点)和Toleration(容忍)。Node可以定义一或多个TaintPod可以定义一或多个Toleration,对于具有某个Taint的节点,只有遇到能容忍它的(即带有对应Toleration的)Pod,才允许Pod被调度到此节点,从而避免Pod被分配到不合适的节点。<br />
  16. 5. 基于适合性的判断<br />
  17. - PodFitsResources:检查节点是否有足够资源(如CPU、内存、GPU等)满足Pod的运行需求。<br />
  18. - PodFitsHostPorts:检查Pod容器所需的HostPort是否已被节点上其它容器或服务占用。如果已被占用,则禁止Pod调度到该节点。<br />
  19. - PodFitsHost:检查Pod指定的NodeName是否匹配当前节点。<br />
  20. - 优选策略

输入是预选阶段筛选出的节点,优选会根据优先策略为通过预选的Nodes进行打分排名,选择得分最高的Node。例如,资源越富裕、负载越小的Node可能具有越高的排名。

  • 运算节点 node
    • kube-kubelet服务
    1. kubelet 主要定时获取pod 期望的运行状态,并调用对应的容器平台接口达到这个状态。
    2. 定时汇报当前节点的状态给apiservier由apiserver 写入etcd,以供调度的时候使用。
    3. 镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源
    • kube-proxy服务
      K8S每个节点上运行网络代理,service资源的载体

将pod网络和集群网络相互打通 猜测使用vpn技术,具体给pod分配网络ip 由kubelet负责
常用三种流量调度模式

  1. 1. Userspace 废弃
  2. 1. Iptables 濒临废弃
  3. 1. Ipvs 推荐

负责建立和删除、更新调度规则,通知apiserver自己的更新,或者从apiserver哪里获取其它kube-proxy的调度规则变化来更新自己

  • CLI客户端 kubectl

  • 核心附件

    • CNI网络插件 flannel、calico
    • 服务发现插件 coredns
    • 服务暴露插件 traefik
    • GUI管理插件 Dashboard