什么是Pod

Pod是K8S的一个逻辑概念,Pod其实是一组紧密协作的容器,容器就是我们应用程序执行代码的地方,在K8S里管理员要去管理应用的生命周期(包括异常退出等),那就需要获取应用运行的状态,获取应用的状态需要获取容器的运行状态。容器在K8S里是一个单进程,该进程就是应用进程,这样就可以从外部获取容器现在的状态,一个Pod内所有的进程共享资源。

为什么K8S要有Pod

方便去管理容器进程,也就是方便管理容器内主要的应用进程。

图为物理机,物理机上已经安装好了Kubelet进程,Kubelet接收到安装文件(一个有Pod信息)会先创建Infra Container(是一个镜像,大概 100~200KB 左右,永远处于暂停状态的容器。是用来对Pod共享网络的)会对Docker0这个网桥进行网络连接,然后其他Pod内部的容器在依次创建后会共享Infra网络,实现一个Pod内的网络共享。存储的共享还是需要每个Pod去挂载相同的存储地址来实现。

容器内使用Pod信息

1.通过环境变量

env:- name: NODE_NAMEvalueFrom:fieldRef:fieldPath: spec.nodeName # 根据配置 "层级.引用" 类似key-value

2.通过配置文件

volumes:  # 使用volume挂载到Pod- name: podinfodownwardAPI: # 使用该API,支持Pod和Container的信息items:- path: "labels"fieldRef:fieldPath: metadata.labels

Pod健康检查

有三类探针:

  • LivenessProbe: 判断是否存活,kubelet默认会重启不是存活的Pod
  • ReadinessProbe:判断是否可用,service只有在readinessProbe为ready状态,对外提供服务
  • StartupProbe:有且仅有一次的超长启动延时(针对慢应用)

探针的实现方式:

  • ExeAction:容器内部执行运行命令,返回码为0,代表健康

livenessProbe:exec:command:- cat - /tmp/health
  • TCPSocketAction: 通过容器IP+端口,执行TCP检查,能够建立TCP连接,代表健康

livenessProbe:tcpSocket:port: 80
  • HTTPGetAction:HTTP Get响应状态码在200-400之间,代表健康

livenessProbe:httpGet:path: /healthport: 80initialDelaySeconds: 30  # 容器首次健康服务检查等待时间timeoutSeconds: 1  # 等待健康检查相应的时间

Pod资源控制

资源控制范围包括:CPU,Memory和扩展资源如GPU(扩展资源只能获取整数个资源)

  • Containers下面resource中进行资源的request和limits配置

apiVersion: v1
kind: Pod
metadata:name: test
spec:containers:- name: testimage: busyboxresources: # 机器上至少有这么多的资源才能被创建request:memory: "64Mi"cpu: "250m"ephemeral-storage: "2Gi"limits:  # 机器上至多有这么多的资源能被使用memory: "128Mi"cpu: "500m"ephemeral-storage: "4Gi"
  • 资源Quota

限制每个Namespace资源用量,超出限制时,用户无法提交新建

apiVersion: v1
kind: ResourceQuota
metadata:name: demonamespace: demo
spec:hard:cpu: "1000"  #这个namespace下面的所有Pod使用的资源总量不超过1000memory: 200Gipods: "10"

Pod Qos服务质量

就是说我们有多个Pod,每一个Pod重要程度不一样,比如某些Pod就算是在资源不足的时候我们也不希望他们会被驱逐。

所以可以对Pod的服务质量进行一个分类,分别是Guranteed,Bursable和BestEffort

Guranteed:Pod里面每个容器都会有内存和CPU的request声明和limit声明,且request和limit必须是一致的,以此告诉K8S这些Pod很重要,一定要保证Pod正常运行。

Bursable: 至少有一个容器存在内存和CPU的一个request,优先级比Guranteed低

BestEffort:request和limit都不填,意味着这个Pod可有可无

系统用request进行调度的,对CPU资源而言,系统会对Guranteed的Pod单独划分CPU资源,Bursable和BestEffort共用CPU资源(按照权重来使用不同的时间片),内存对资源而说,会对Pod划分OOMScore,score越高越优先被杀掉,Guranteed固定为-998,BestEffort固定为1000,Bursable则是按照内存大小和节点关系会根据算法计算出2~999范围内的值 ,资源不足发生驱逐时,优先驱逐BestEffort定义的容器。

Pod的调度

当我们希望Pod能够在指定的机器上运行的时候,或者定义那两个Pod在同一个机器上,或者定义那两个Pod不在同一个机器上,就要用到亲和度。

Pod亲和调度

1.PodAffinity

  • requiredDuringSchedulingIgnoredDuringExecution:强制亲和(调度时,执行亲和校验;运行时,忽略标签内发生的变化带来的影响)
  • preferredDuringSchedulingIgnoredDuringExecution:优先亲和
affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: securityoperator: In #操作符 In NotIn Exist DoesNotExist Gt Ltvalues:- S1topogyKey: kubernetes.io/hostname #设置拓扑键,默认的设置topology.kubernetes.io/region topology.kubernetes.io/zone

2.podAntAffinity

  • requiredDuringSchedulingIgnoredDuringExecution:强制反亲和
  • preferredDuringSchedulingIgnoredDuringExecution:优先反亲和

Node亲和调度

1.NodeSelector: 强制调度到指定节点(强制调度Pod在指定的机器上创建)

2.NodeAffinity

  • requiredDuringSchedulingIgnoredDuringExecution:强制反亲和
  • preferredDuringSchedulingIgnoredDuringExecution:优先反亲和

3.Taint:一个Node可以有多个Taints

​ 1.行为模式有:

  • PreferNoSchedule: 尽量不要调度过来

  • NoSchedule:禁止Pod调度来

  • NoExecute: 驱逐没有tolerantion的Pod,并禁止调度新的(如果有的Pod已经在运行了,而且没有tolerantion,就会被杀掉并调度到新的机器上)

    apiVersion: v1
    kind: Node
    metadata:name: demo
    spec:taints:- key: "k1"value: "v1"effect: "NoSchedule"
    

    2.Pod的tolernation,只有设置对应的tolernation才能调度到有Taint的Node上

apiVersion: v1
kind: Pod
metadata:namespace: demoname: demo
spec:containers:- image: busyboxname: demotolerations:- key: "k1"operator: "Equal"value: "v1"  # 当op=Exist 可以为空 key和value和effect必须匹配上面的taints,这样Pod才能被调度到打了taint的Node上effect: "NodSechedule"  # 可以为空,匹配所有tolerationsSeconds: 3600   #taint添加后,pod还能在node上运行的时间

优先级调度

很多Pod同时创建时,有的优先级高,有的优先级低。这时kubelet会根据Pod配置priority,得分高的会对得分低的进行资源抢占

1.使用PriorityClass创建节点,Pod中通过PriorityClassName引用相应优先级

apiVersion: v1
kind: PriortyClass
metadata:name: high
value: 1000
globalDefault: false

2.系统默认优先级

​ 1.没有设置均为0

​ 2.用户可配置最大优先级为10亿,系统级别优先级为20亿

​ 3.内置系统优先级:system-cluster-critical,system-node-critical

Pod调度过程

用户调教Yaml文件,webhook controller 会先对文件进行校验,校验成功后,Api-Server会创建Pod对象,这个对象会保存到ETCD里面。此时Pod的Node名称为空(这个Pod已经有了,但是还没有落实到相应的节点上),Kube Scheduler (Kube Scheduler 会不断查看资源对象,发现某个Pod刚创建,但Node是空的,就会创建)会watch到Pod的创建,同时发现Node名称为空,会找到合适的Node,并修改Pod名称为相应的Node名,相应节点上的kubelet watch(这个进程会不断的请求Api-Server去发现他的节点上有个Pod需不需要创建) 到Pod需要创建,会在Node节点上创建容器和网络。

其他

InitContainer

比普通容器先启动,执行成功后普通容器才能启动,且是按照顺序执行,执行完之后会关闭。普通容器可以并发启动。

Sidecar 容器设计模式

用一个辅助容器做辅助工作,如日志收集,debug,前置操作等。好处:对应业务代码没有侵入:功能解耦,共享,模式包括:

代理模式:代理网络等

适配器模型:适配不同外观需求

Pod容灾

让Pod在不同的区域内分布,实现Pod容灾

topologySpreadConstraints:- topogyKey: addressmaxSkew: 1  # 用于指明Pod在各个zone中容忍的最大不均匀数,值越小每个zone中Pod分布越均匀whenUnsatisfiable: DoesNotSchedulelabelSelector:matchLabels:app: myapp

Pod容灾

让Pod在不同的区域内分布,实现Pod容灾

topologySpreadConstraints:- topogyKey: addressmaxSkew: 1  # 用于指明Pod在各个zone中容忍的最大不均匀数,值越小每个zone中Pod分布越均匀whenUnsatisfiable: DoesNotSchedulelabelSelector:matchLabels:app: myapp

【K8S】整体原理-什么是K8S的Pod相关推荐

  1. 【K8S】整体原理-什么是K8S K8S能做什么

    什么是K8S K8S(kubernetes)简称K8s,是基于容器实现的资源自动化管理平台,分布式系统支撑平台,Google开源的容器集群管理系统. K8S能干什么 可以为容器化的应用提供部署运行,资 ...

  2. 深入理解K8S网络原理下

    承接上文深入理解K8S网络原理上 Service 应用是K8s集群内部可见的而我们发布的应用需要外网甚至公网可以访问K8s如何将内部服务暴露出去? 四层网络只有Node节点网络可以对外通讯现在问题是第 ...

  3. 【k8s权威指南】第三章 k8s核心原理

    k8s 核心原理分析 本文内容 API Server 原理分析 Controller Manager原理分析 Scheduler 调度器原理分析 kubelet 运行机制分析 一. k8s API S ...

  4. 【博客497】k8s cgroup原理完整剖析

    k8s cgroup原理 k8s cgroup设计层级: k8s完整的cgroup hierarchy root| +- kube-reserved| || +- kubelet (kubelet p ...

  5. 玩转k8s(四)—— 通过Service访问Pod

    我们不应该期望k8s Pod是健壮的,而是要假设Pod中的容器很可能因为各种原因发生故障而死掉.Deployment等Controller会通过动态的创建和销毁Pod来保证应用整体的健壮性.换句话说, ...

  6. [大伽交流] 不见不散!8月23日k8s第7期直播:《K8S存储原理剖析与实践》

    [大伽交流] 不见不散!8月23日k8s第7期直播:<K8S存储原理剖析与实践> 往期回顾+材料下载:https://bbs.huaweicloud.com/forum/thread-95 ...

  7. k8s调度之node的亲和性以及pod的亲和性/反亲和性

    k8s调度之node的亲和性以及pod的亲和性/反亲和性 通常情况下,使用的都是k8s默认的调度调度方式,但是在有些情况下,我们需要将pod运行在具有特定的标签的node上才能都运行,这个时候,pod ...

  8. k8s gc原理详解

    1. K8s 的垃圾回收策略 2 gc 源码分析 2.1 初始化 garbageCollector 对象 2.1.1 garbageCollector包含的结构体对象 2.1.2 NewGarbage ...

  9. Kubernetes(k8s)常用资源的使用、Pod的常用操作

    1.K8s是如何运行容器的. 答:k8s是通过定义一个Pod的资源,然后在Pod里面运行容器的.K8s最小的资源单位Pod. 2.如何创建一个Pod资源呢? 答:在K8s中,所有的资源单位都可以使用一 ...

最新文章

  1. 交互式计算机图形学总结:第三章 几何对象和变换
  2. JSP中getParameter和getAttribute区别
  3. 双11特刊 | 全面云原生化,数据库实例独共享混部 最高降低30%成本
  4. PHP中常见的提示对照表
  5. 文件服务器监控用户修改信息,文件服务器监控日志软件
  6. Eclipse快捷键以及设置
  7. 数据结构和算法练习网站_视频和练习介绍了10种常见数据结构
  8. 数据挖掘竞赛,算法刷题网址汇总
  9. SpringBoot+FreeMarker实现单据打印功能
  10. 24合1芯片RK628D替代龙讯LT6911C/东芝TC358749XBG/HDMI TO MIPI...
  11. iOS 5.1实现旋转屏幕
  12. PopupWindow需要设置边距
  13. spring框架_IOC_DI_AOP_MVC
  14. 倒角距离(Chamfer distance)
  15. anaconda打不开怎么办
  16. 【PCB专题】PCB板卡上的UL标识是什么?
  17. AdmExpress 国际仓储转运系统/海淘转运系统 1.0 正式版发布
  18. Opencv识别车牌
  19. GlusterFS扩展操作及性能测试工具
  20. 批量 汉字 转 拼音方法

热门文章

  1. Maya多版本下载和安装
  2. 基于物联网技术的智慧病房管理系统(三)——定时开关灯与信息获取
  3. Python学习入门基础 -- 第四章 列表、元组、字典、字符串变量使用、变量进阶
  4. 让你的win10流畅起来,只需几个优化小技巧
  5. 在线编辑word文档,weboffice在线操作word文档
  6. 企业定制CRM系统的流程
  7. 关键信息基础设施保护必须以等级保护制度为基础
  8. 大电流导电滑环应用在行业的综合评估测试结果
  9. JavaScript 库(框架)
  10. 凡是现实的都是合乎理性的,凡是合乎理性的都是现实的