三、POD详解

news2024/11/14 11:30:39

目录

一、Pod创建过程:

二、Pod的终止

三、pod配置详解

四、查看每种资源的可配置项

五、Pod状态

六、Pod调度

七、Pod探针

1、Pod 探针的检测方式: 


一、Pod创建过程:

  1. 用户提交创建pod请求
  2. API Server处理用户请求,存储Pod数据到Etcd
  3. Schedule通过和API Server的监听机制,查看到新的Pod,尝试为Pod绑定node
  4. 过滤主机:调度器用一组规则过滤不符合要求的主机,比如:Pod指定了所需要的资源,那么就要过滤掉资源不够的主机、或者pod标签指定调度到那个主机上、或者某个节点上存在污点,而此pod能否容忍这个污点,也会被过滤,
  5. 主机打分:对第一步筛选出来的符合要求的主机进行打分,在此阶段,调度器会考虑一些整体优化策略。
  6. 选择主机:选择得分最高的主机,进行binding,并把结果存储到Etcd中。
  7. kubelet根据调度结果执行Pod的创建操作,绑定成功后,会启动container、docker run,scheduler会掉用API Server在etcd中创建一个bound pod 对象,描述在一个工作节点上绑定运行的所有pod 信息。运行在每个工作节点上的kubelet也会定期与etcd同步bound pod 信息,一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用 Docker API 创建并启动pod 内的容器
  8. POD 创建完成

二、Pod的终止

  1. api server收到删除pod的请求,将 pod 标记为“Terminating”状态
  2. 同时会在Endpoint删除Pod的IP地址
  3. 容器运行时给所有容器的1号进程发送TERM
  4. 如果定义了preStop,则会执行preStop
  5. 容器开始graceful关闭
  6. 如果超过grace-period,pod还没有被关闭,则会执行强制关闭pod流程,容器运行时向所有的container发送 SIGKILL;之后kubelet强制删除pod

如图:如果执行了删除pod 的指令,pod状态变更的同时在Endpoint中pod 的IP也会被删除

三、pod配置详解

#必选,api版本
apiVersion: v1
#必选,定义什么就写什么,比如定义一个pod就写pod,要定义server就写server
kind: Pod
#必选,元数据
metadata:
  #必选,pod名称
  name: string
  #pod的命名空间,如果不填,默认是default,或者使用-n 参数来指定命名空间
  namespace: string
  #对应kind,是pod的标签列表,可以填写多个labels
  labels:
      #对应kind,自定义标签列表,
    - name: string
  #对应kind,自定义注解列表,
  annotations:
    - name: string
#必选,pod中容器的详细定义
spec:
  initContainers: # 初始化容器,在容器启动之前执行的一些初始化操作
  - command:
    - sh
    - -c
    - echo "初始化"
  #必选,容器列表
  containers:
    #必选,容器名字
  - name: string
    #必选,容器的镜像名称
    image: string
    #拉取镜像的策略,Always:总是拉取镜像库的镜像,Never:使用本地镜像,IfNotPresent:本地有镜像就不拉取镜像库镜像,没有就拉取
    imagePullPolicy: [Always | Never | IfNotPresent]
    #容器的启动命令,如果不指定,则使用镜像打包时使用的启动命令
    command: [string]
    #容器的启动命令参数列表
    args: [string]
    #容器的工作目录
    workingDir: string
    # workingDir: /k8s/kubernetes/
    #挂载到容器内部的存储卷配置
    volumeMounts:
      #引用pod定义的共享存储卷的名称,
    - name: string
      #存储卷在容器内挂在的绝对路径,赢小于512个字符
      mountsPath: string
      #是否为只读模式,默认是读写
      readOnly: boolean
    #容器需要暴露的端口号列表
    ports:
      #端口名称
    - name: string
      #容器需要监听的端口号
      containerPort: int
      hostPort: int
      #端口协议,支持TCP和UDP  默认TCP
      protocol: string
    #容器运行前设置的环境变量列表
    env:
      #环境变量名称
    - name: string
      #值
      value: string
    #资源限制和请求设置
    resource:
      #资源限制设置
      limits:
        #cpu限制,单位为core数,将用于docker run  --cpu-shares参数
        cpu: string
        #内存限制,单位为MiB、GiB等,将用于docker run --momory参数
        memory: string
      #资源请求设置
      requests:
        #cpu请求,容器启动的初始可用数量
        cpu: string
        #内存请求,容器启动的初始可用数量
        memory: string
    #对pod内各容器健康检查设置当探针无响应几次之后,系统将自动重启该容器,可以设置的方法包括:exec、httpGet、tcpSocket。对一个容器仅需设置一种方法
    livenessProbe:
      #执行容器命令检测方式
      exec:
        command: [string]
      #httpGet检查方式
      httpGet:
        path: string # http服务器上的访问URL
        port: string # 容器上要访问端口号或名称
        host: string # 要连接的主机名,默认POD ip
        scheme: string # 用于连接host的协议,默认HTTP
        httpHeaders: # 自定义HTTP请求headers,HTTP允许重复headers
        - name: string
          values: string
      tcpSocket: # 端口检测方式
        port: 端口号
      initialDelaySeconds: 60 #在容器启动后多少秒进行探测,单位为S
      timeoutSeconds: 2 #探针执行检测请求后,等待响应的超时时间,默认1S,若超过该时间,则认为不健康,就会重启
      periodSeconds: 5 #执行探测的时间间隔,默认 10 s 一次
      successThreshold: 2 # 检查成功两次表示就绪
      failureThreshold: 1 # 检查失败1次表示未就绪
    Lifecycle:
      postStart: # 容容器创建成功后,运行前的任务,用于资源部署、环境准备等 可以使exec、httpGet、TCPSocket
        exec:
          command:
          - sh
          - -c
          - "mkdir /data/"
      PreStop: #在容器被终止前的任务,用于优雅关闭应用程序、通知其他系统等等。
        httpGet:
          host: monitor.com
          psth: /waring
          port: 8080
          scheme: HTTP          
    securityContext:
      privileged: false
  # restartPolicy pod的重启策略,默认为 Always。
  1、Always:POD一旦终止运行,无论容器是如何终止的,kubelet都将重启它,
  2、OnFailure:只有pod以非0退出码终止时,kubelet才会重启该容器,如果容器正常结束(退出码为0)则不会重启
  3、Never :无论什么状态,都不会重启
  restartPolicy: [Always | Never | OnFailure]
  #设置NodeName表示将该Pod调度到指定到名称的node节点上
  nodeName: k8s-node-2
  #用于将pod调度到添加了指定标签的node节点上,指定node 节点,先打一个标签。
  nodeSelector: object
    hostname: k8s-node-1
  imagePullSecrets:
  - name: string
  hostNetwork: false/true  默认为false
  # dnsPolicy 设置pod的DNS策略:
  1、default:继承Pod所在宿主机的域名解析设置
  2、clusterFirst:优先是用kubernetes环境的DNS服务,
  3、clusterFirstWithHostNet:适用于以hostNetwork模式运行的pod,此时hostNetwork 必须为true
  4、None:忽略kubernetes集群的DNS配置,需要手工通过dnsConfig自定义DNS配置
  dnsPolicy: default
  Volumes: # 共享存储卷列表
  - name: string #名称,
    emptyDir: {} # 挂载目录
    hostPath: #挂载本机目录
      path: string
    secret:
      secretName: string
      items:
      - key:string
        path: string
    configMap:
      name: string
      items:
      - key: string
        path: string

四、查看每种资源的可配置项

kubelet explain 资源类型

#   kubectl explain 资源类型         查看某种资源可以配置的一级属性
#    kubectl explain 资源类型.属性     查看属性的子属性
[root@k8s-master-1 logs]# kubectl explain pod
[root@k8s-master-1 logs]# kubectl explain pod.metadata

五、Pod状态

1、Pending:挂起。我们在请求创建pod时,天剑不满足,调度没有完成,没有任何一个节点能满足调度条件,已经创建了但是没有适合它运行的节点叫做挂起。

2、Running:Pod内多有容器都已经被创建,且至少一个容器正处于运行状态,正在启动状态或者重启状态。

3、Succeeded:Pod中所有容器都执行成功后退出,并且没有处于重启的容器

4、Failed:Pod中所有容器都已退出,但是至少还有一个容器退出时为失败状态

5、Unknown:位置状态,所谓pod是什么状态是apiserver和运行在节点的kubelet进行通信获取状态信息的,如果节点之上的kubelet本身出故障,那么apiserver就连不上kubelet,得不到信息 了,就会看到Unknown。

六、Pod调度

        在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
  • 定向调度:NodeName、NodeSelector
  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
  • 污点(容忍)调度:Taints、Toleration

七、Pod探针

        StartupProbe:k8s1.16版本后新加的探测方式,用于判断容器内应用程序是否启动。如果配置了StartupProbe,就会先禁止其他的探测,直到他成功为止,成功后将不在进行探测。

        LivenessProbe 存活性探针:用于探测容器是否运行,如果探测失败,kubelet 会根据配置的重启策略,进行相应的处理,若没有配置该探针,默认就是success

        ReadinessProbe 就绪性探针:一般用于探测容器内的程序是否健康,它的返回值如果为success ,那么就代表这个容器已经完全启动,并且程序已经是可以接受流量的状态

区别:探测方式相同,只是对Pod的处置方式不同

        readinessProbe:当检测到失败后,将POD的IP:PORT从对应的EndPoint列表中删除

        LicenessProbe:当检测到失败后,将杀死容器并根据pod的重启策略来决定作出对应的措施

1、Pod 探针的检测方式: 

Exec:在容器内执行一个命令,如果返回值为0,则认为容器健康

TCPSocket:通过容器的IP地址和端口号执行TCP检查,如果是通的就认为容器健康,

HTTPGet:通过应用程序暴露的API地址来检测程序是否是正常的,如果状态码为200-400之间,则认为容器健康

探针检查参数配置:

initialDelaySeconds: 60 #在容器启动后多少秒进行探测,单位为S

timeoutSeconds: 2 #响应的超时时间,默认1S,若超过该时间,则认为不健康,就会重启

periodSeconds: 5 #执行探测的时间间隔,默认 10 s 一次

successThreshold: 2 # 检查成功2次表示就绪

failureThreshold: 1 # 检查失败1次表示未就绪

探针探测结果有以下值

Success:表示通过检测。

Failure:表示未通过检测。

Unknown:表示检测没有正常进行。

1.2 探针使用用例

(1)通过exec 方式做健康检查

apiVersion: v1
kind: Pod
metadata:
  name: liveness-exec
  labels:
    app: liveness
spec:
  containers:
  - name: liveness
    image: busybox
    args:                       #创建测试探针探测的文件
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      initialDelaySeconds: 10   #延迟检测时间
      periodSeconds: 5          #检测时间间隔
      exec:                     #使用命令检查
        command:                #指令,类似于运行命令sh
        - cat                   #sh 后的第一个内容,直到需要输入空格,变成下一行
        - /tmp/healthy          #由于不能输入空格,需要另外声明,结果为sh cat"空格"/tmp/healthy

解释:

        容器在初始化后,执行(/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600")首先创建一个 /tmp/healthy 文件,然后执行睡眠命令,睡眠 30 秒,到时间后执行删除 /tmp/healthy 文件命令。而设置的存活探针检检测方式为执行 shell 命令,用 cat 命令输出 healthy 文件的内容,如果能成功执行这条命令一次(默认successThreshold:1),存活探针就认为探测成功,由于没有配置(failureThreshold、timeoutSeconds),所以执行(cat /tmp/healthy)并只等待1s,如果1s内执行后返回失败,探测失败。在前 30 秒内,由于文件存在,所以存活探针探测时执行 cat /tmp/healthy 命令成功执行。30 秒后 healthy 文件被删除,所以执行命令失败,Kubernetes 会根据 Pod 设置的重启策略来判断,是否重启 Pod。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1370229.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【心得】SSRF攻击面利用个人笔记

SSRF的利用面 目录 1 任意文件读取 前提是知道要读取的文件名 2 探测内网资源 3 使用gopher协议扩展攻击面 4 php原生类进行ssrf 5 ssrf绕过 1 任意文件读取 前提是知道要读取的文件名 2 探测内网资源 127.0.0.1 mysql服务端监听了127.0.0.1这个地址,也就表示…

Linux 网络设置与基础服务

一 配置网络设置 主机名 hostname IP地址/netmask ifconfig ; ip a 路由:默认网关 route -n DNS服务器 cat /etc/resolv.conf 网络连接状态 ss netstat 域名解析 ns…

前端炫酷动画特效分享(附在线预览)

分享7款非常有趣的前端特效源码 其中包含css动画特效、js原生特效、svg特效以及小游戏等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 canvas鼠标粒子跟随动画 canvas鼠标粒子跟随动画 当鼠标移入背景区域时 粒子动画会…

Node.js和npm

目录 01_Node.js01.什么是 Node.js目标讲解小结 02.fs模块-读写文件目标讲解小结 03.path模块-路径处理目标讲解小结 04.案例-压缩前端html目标讲解小结 05.认识URL中的端口号目标讲解小结 06.http模块-创建Web服务目标讲解小结 07.案例-浏览时钟目标讲解小结 02_Node.js模块化…

解决vscode无法运行npm和node.js命令的问题

第一次安装npm和node.js想要在vscode中直接输入控制台命令会因为权限问题无法执行。 这里可以修改本机权限来解决。 搜索powershell并且以管理员权限运行 打开之后输入下面的命令即可 PS C:\Users\Administrator> Get-ExecutionPolicy Restricted PS C:\Users\Administra…

electron自定义窗口和右键菜单样式

前言 electron默认沿用系统UI,并没有提供很多接口供使用者定制样式,如果想要完全自定义的样式,目前我能想到的方案只能是通过前端自定义样式,然后通过进程通信来实现系统基础功能:最大/小化、关闭、拖动窗口等。 效果…

canvas绘制路径之 beginPath() 和 closePath()

查看专栏目录 canvas示例教程100专栏,提供canvas的基础知识,高级动画,相关应用扩展等信息。canvas作为html的一部分,是图像图标地图可视化的一个重要的基础,学好了canvas,在其他的一些应用上将会起到非常重…

权威mcc mnc 列表网址

MCC-MNC.net 链接: MCC-MNC.net 这个网站提供的mcc mnc 比下面itu文档中更全。 itu.int 2023年发布的mcc mnc分配信息: 链接: PDF T-SP-E.212B-2023 若想获取最新的可以参考如下截图查询:

linux开发板静态IP无法ping通外网

硬件平台:韦东山的6ull开发板 问题: 使用网线直连路由器,动态获取IP时能ping通外网; 改为静态IP时,能ping通局域网,但无法ping通外网。 改为静态IP:修改/etc/network/interfaces 测试&#…

论文阅读 Attention is all u need - transformer

文章目录 1 摘要1.1 核心 2 模型架构2.1 概览2.2 理解encoder-decoder架构2.2.1 对比seq2seq,RNN2.2.2 我的理解 3. Sublayer3.1 多头注意力 multi-head self-attention3.1.1 缩放点乘注意力 Scaled Dot-Product Attention3.1.2 QKV3.1.3 multi-head3.1.4 masked 3.…

EDA期末突击

。数模 1.1 进制转换 八位补码计算 1.2 化简函数 卡诺图 卡诺图另类的化简 1.3 逻辑图 看逻辑图 写表达式 列真值表,写出标准与或式 画逻辑图 ———————————————— 1.4 加法器 半加器 全加器 1.5 触发器 —————————————— …

(一)Spring Cloud 直击微服务作用、架构应用、hystrix降级

直击微服务作用 微服务架构: 遇到了什么问题? 将单体架构拆分成微服务架构后,如果保证多个服务(项目)正常运行? 哪个技术可以解决这个问题? 微服务技术 服务治理: 服务管理,维护服务与服务之间的关系 这个技术如何使用? netflix/网…

python 队列

队列常用方法 Python中的队列是一种数据结构,遵循先进先出(FIFO)的原则。在Python中,你可以使用内置模块queue提供的Queue类来实现队列数据结构。队列是一种常见的数据结构,用于按照特定顺序处理数据项,例…

AcWing 203. 同余方程(扩展欧几里得算法)

题目链接 203. 同余方程 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/205/ 题解 本题中的同余方程可以转化为ax by 1的形式&#xff0c;利用扩展欧几里得算法可以求得特解为&#xff0c;则通解为。 代码 #include <cstring> #include <…

1878_emacs company backend的选择尝试

Grey 全部学习内容汇总&#xff1a; GitHub - GreyZhang/editors_skills: Summary for some common editor skills I used. 1872_emacs company backend的选择尝试 从C语言开发的使用场景角度&#xff0c;通过测试尝试看看这个company的backend应该来如何配置。 主题由来介…

[AutoSar]基础部分 RTE 07 VFB虚拟功能总线

目录 关键词平台说明一、VFB1.1VFB是什么1.1VFB的好处1.2VFB的坏处 二、VFB在ECU内部的描述2.1Components2.2 Port-Interfaces2.3 Port2.4 Compositions 关键词 嵌入式、C语言、autosar、VFB 平台说明 项目ValueOSautosar OSautosar厂商vector芯片厂商TI编程语言C&#xff0…

python第三方模块之yaml模块

安装: pip install PyYamlPyYaml 5.1之后,通过禁止默认加载程序(FullLoader)执行任意功能,该load函数也变得更加安全。 使用: config.yaml - 10 - 20 - 30 - 40 - 50 --- name: cc age:<

【2024系统架构设计】 系统架构设计师第二版-嵌入式系统架构设计理论与实践

目录 一 嵌入式系统软件架构的原理 二 嵌入式系统软件架构的设计方法 三 案例分析 一 嵌入式系统软件架构的原理 🚀嵌入式系统的典型架构可以分为

126.(leaflet篇)leaflet松散型arcgis缓存切片加载

地图之家总目录(订阅之前必须详细了解该博客) arcgis缓存切片数据格式如下: 完整代码工程包下载,运行如有问题,可“私信”博主。效果如下所示: leaflet松散型arcgis缓存切片加载 下面献上完整代码,代码重要位置会做相应解释 <!DOCTYP

2024年中国杭州|网络安全技能大赛(CTF)正式开启竞赛报名

前言 一、CTF简介 CTF&#xff08;Capture The Flag&#xff09;中文一般译作夺旗赛&#xff0c;在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会&#xff0c;以代替之前黑客们通过互相发起真实攻击进行技术比拼的…