基本概念
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资源模板进行新建
- ReplicaSet主要三个组件组成:
- StatefulSet:管理有状态应用
- Job:只要完成就立即退出,不需要重启或重建。
-
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数量越多 集群的调度能力越重要
- 主要功能是接收调度pod到适合的运算节点上- 预算策略
输入是所有节点,输出是满足预选条件的节点。kube-scheduler根据预选策略过滤掉不满足策略的Nodes。例如,如果某节点的资源不足或者不满足预选策略的条件如“Node的label必须与Pod的Selector一致”时则无法通过预选。
1. 基于存储卷数量的判断<br />- MaxEBSVolumeCount:确保已挂载的EBS存储卷数量不超过设置的最大值(默认39),调度器会检查直接或及间接使用这种类型存储的PVC,累加总数,如果卷数目超过设最大值限制,则不能调度新Pod到这个节点上。<br />- MaxGCEPDVolumeCount:同上,确保已挂载的GCE存储卷数量不超过预设的最大值(默认16)。<br />- MaxAzureDiskVolumeCount:同上,确保已挂载的Azure存储卷不超过设置的最大值(默认16)。<br />2. 基于资源压力状态的判断<br />- CheckNodeMemoryPressure:判断节点是否已经进入到内存压力状态,如果是则只允许调度内存为0标记的Pod。<br />- CheckNodeDiskPressure:判断节点是否已经进入到磁盘压力状态,如果是,则不能调度新的Pod。<br />3. 基于卷冲突的判断<br />- NoDiskConflict:卷冲突判断,即如果该节点已经挂载了某个卷,其它同样使用相同卷的Pod将不能再调度到该节点。<br />- NoVolumeZoneConflict:对于给定的某块区域,判断如果在此区域的节点上部署Pod是否存在卷冲突。<br />- NoVolumeNodeConflict:对于某个指定节点,检查如果在此节点上部署Pod是否存在卷冲突。<br />4. 基于约束关系的判断<br />- MatchNodeSelector:检查节点标签(label)是否匹配Pod指定的nodeSelector,是则通过预选。<br />- MatchInterPodAffinity:根据Pod之间的亲和性做判断。<br />- PodToleratesNodeTaints:排斥性关系,即判断Pod不允许被调度到哪些节点。这里涉及到两个概念Taints(污点)和Toleration(容忍)。Node可以定义一或多个Taint,Pod可以定义一或多个Toleration,对于具有某个Taint的节点,只有遇到能容忍它的(即带有对应Toleration的)Pod,才允许Pod被调度到此节点,从而避免Pod被分配到不合适的节点。<br />5. 基于适合性的判断<br />- PodFitsResources:检查节点是否有足够资源(如CPU、内存、GPU等)满足Pod的运行需求。<br />- PodFitsHostPorts:检查Pod容器所需的HostPort是否已被节点上其它容器或服务占用。如果已被占用,则禁止Pod调度到该节点。<br />- PodFitsHost:检查Pod指定的NodeName是否匹配当前节点。<br />- 优选策略
输入是预选阶段筛选出的节点,优选会根据优先策略为通过预选的Nodes进行打分排名,选择得分最高的Node。例如,资源越富裕、负载越小的Node可能具有越高的排名。
- 运算节点 node
- kube-kubelet服务
- kubelet 主要定时获取pod 期望的运行状态,并调用对应的容器平台接口达到这个状态。
- 定时汇报当前节点的状态给apiservier由apiserver 写入etcd,以供调度的时候使用。
- 镜像和容器的清理工作,保证节点上镜像不会占满磁盘空间,退出的容器不会占用太多资源
- kube-proxy服务
K8S每个节点上运行网络代理,service资源的载体
将pod网络和集群网络相互打通 猜测使用vpn技术,具体给pod分配网络ip 由kubelet负责
常用三种流量调度模式
1. Userspace 废弃1. Iptables 濒临废弃1. Ipvs 推荐
负责建立和删除、更新调度规则,通知apiserver自己的更新,或者从apiserver哪里获取其它kube-proxy的调度规则变化来更新自己
CLI客户端 kubectl
核心附件
- CNI网络插件 flannel、calico
- 服务发现插件 coredns
- 服务暴露插件 traefik
- GUI管理插件 Dashboard
