当前位置: 首页 > news >正文

k8s-Pod

文章目录

  • k8s-Pod
    • pod 配置文件详解
    • pod 生命周期
    • pod 探针
      • StartupProbe
      • LivenessProbe
      • ReadinessProbe
      • 探针使用建议
    • 初始化容器
    • 钩子函数

k8s-Pod

pod 是k8s 中可以调度的最小单位

在这里插入图片描述

每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类:

  • 用户程序所在的容器,数量可多可少

  • Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个:

    • 可以以它为依据,评估整个Pod的健康状态

    • 可以在根容器上设置Ip地址,其它容器都此Ip(Pod IP),以实现Pod内部的网路通信

pod 配置文件详解

yaml 格式

apiVersion: v1 # api 文档版本
kind: Pod  # 资源对象类型,也可以配置为像Deployment、StatefulSet这一类的对象
metadata: # Pod 相关的元数据,用于描述 Pod 的数据name: nginx-demo # Pod 的名称labels: # 定义 Pod 的标签type: app # 自定义 label 标签,名字为 type,值为 apptest: 1.0.0 # 自定义 label 标签,描述 Pod 版本号namespace: 'default' # 命名空间的配置
spec: # 期望 Pod 按照这里面的描述进行创建containers: # 对于 Pod 中的容器描述- name: nginx # 容器的名称image: nginx:1.7.9 # 指定容器的镜像imagePullPolicy: IfNotPresent # 镜像拉取策略,指定如果本地有就用本地的,如果没有就拉取远程的command: # 指定容器启动时执行的命令- nginx- -g- 'daemon off;' # nginx -g 'daemon off;'workingDir: /usr/share/nginx/html # 定义容器启动后的工作目录ports:- name: http # 端口名称containerPort: 80 # 描述容器内要暴露什么端口protocol: TCP # 描述该端口是基于哪种协议通信的env: # 环境变量- name: JVM_OPTS # 环境变量名称value: '-Xms128m -Xmx128m' # 环境变量的值resources:requests: # 最少需要多少资源cpu: 100m # 限制 cpu 最少使用 0.1 个核心memory: 128Mi # 限制内存最少使用 128兆limits: # 最多可以用多少资源cpu: 200m # 限制 cpu 最多使用 0.2 个核心memory: 256Mi # 限制 最多使用 256兆restartPolicy: OnFailure # 重启策略,只有失败的情况才会重启

pod 生命周期

在这里插入图片描述

在整个生命周期中,Pod会出现5种状态(相位),分别如下:

  • 挂起(Pending):apiserver已经创建了pod资源对象,但它尚未被调度完成或者仍处于下载镜像的过程中
  • 运行中(Running):pod已经被调度至某节点,并且所有容器都已经被kubelet创建完成
  • 成功(Succeeded):pod中的所有容器都已经成功终止并且不会被重启
  • 失败(Failed):所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态
  • 未知(Unknown):apiserver无法正常获取到pod对象的状态信息,通常由网络通信失败所导致

pod 探针

探针是容器内应用的监测机制,根据不同的探针来判断容器应用当前的状态,根据生命周期图可以看出探针目前存在三种类型

类型描述作用阶段
StartupProbe1.16 版本新增的探针,用于判断应用程序是否已经启动了。容器启动阶段
LivenessProbe用于探测容器中的应用是否运行,如果探测失败,kubelet 会根据配置的重启策略进行重启,若没有配置,默认就认为容器启动成功,不会执行重启策略。容器运行过程中
ReadinessProbe用于探测容器内的程序是否健康,它的返回值如果返回 success,那么就认为该容器已经完全启动,并且该容器是可以接收外部流量的容器启动之后检测

注:

当配置了 startupProbe 后,会先禁用其他探针,直到 startupProbe 成功后,其他探针才会继续。

三种探针的探测方式都是支持,httpGet tcpSocket 和 exec 三种方式。按需使用

StartupProbe

  • 使用场景:用于指示容器中的应用是否已经启动。在容器启动初期,某些长时间运行的任务(如加载大型数据集)可能会导致容器在应用实际可用之前无法响应其他探针。在这种情况下,StartupProbe可以用来避免误判容器为失败状态。
  • 配置示例:对于需要执行长时间初始化任务的容器,我们可以配置一个StartupProbe,在容器启动初期禁用其他探针,直到初始化任务完成并且容器可以响应其他探针检查为止。
startupProbe:httpGet:path: /api/startupport: 80host: 127.0.0.1 #主机地址scheme: HTTP #支持的协议,http或者httpsinitialDelaySeconds: 60 # 初始化时间timeoutSeconds: 2 # 超时时间successThreshold: 1 # 检查 1 次成功就表示成功failureThreshold: 2 # 监测失败 2 次就表示失败

LivenessProbe

  • 使用场景:用于检测容器是否仍在运行。如果容器不再响应探针,Kubernetes将重新启动该容器。
  • 配置示例:对于Web应用程序容器,我们可以配置一个HTTP GET请求的LivenessProbe,定期向容器的某个健康检查端点发送请求。如果容器无法响应这些请求,Kubernetes将认为容器已经死亡,并尝试重新启动它。
livenessProbe:  httpGet:  path: /health  port: 8080  initialDelaySeconds: 30  # 容器启动后等待30秒再开始执行探针检查  periodSeconds: 10  # 每10秒执行一次探针检查

ReadinessProbe

  • 使用场景:用于检测容器是否已准备好接收请求。如果容器未就绪,Kubernetes将不会将其添加到Service的后端Endpoint中,从而确保不会向未就绪的容器发送流量。
  • 配置示例:对于数据库容器,我们可以配置一个TCP连接的ReadinessProbe,检查数据库是否已启动并可以接受连接。只有当数据库容器就绪时,Web应用程序容器才能开始与其交互。
readinessProbe:  exec:command:- sh- init.sh   # 用来检查数据库是否初始化

探针使用建议

为容器配置探针(LivenessProbe、ReadinessProbe 和 StartupProbe)时,需要根据应用程序的特性和需求来合理设置参数。以下是一些建议,帮助您配置这些探针的参数:

  1. initialDelaySeconds(初始延迟秒数)
    • LivenessProbe:设置为应用程序启动并初始化所需的时间。例如,如果应用程序需要加载大量数据或执行长时间的初始化操作,应相应增加这个值。
    • ReadinessProbe:同样考虑应用程序的启动和初始化时间,但还要考虑到它是否准备好接收流量。通常,这个值可能会稍大于 LivenessProbe 的初始延迟。
    • StartupProbe:如果应用程序在启动初期需要执行长时间的任务,StartupProbe 的初始延迟应设置为足够长的时间,以确保这些任务完成。
  2. periodSeconds(执行探测的频率)
    • 根据应用程序的健康检查需求和资源消耗来设置。较短的周期可以更快速地检测到问题,但也会增加 Kubernetes API 服务器的负载和容器的资源消耗。
    • 对于关键服务,可能需要更频繁的探测以确保其可用性。
    • 考虑到集群规模和资源限制,避免设置过短的周期。
  3. timeoutSeconds(超时时间)
    • 设置为探针等待响应的合理时间。如果应用程序的响应时间较长,应相应增加这个值。
    • 避免设置过短的超时时间,以免因为网络延迟或短暂的负载高峰而导致不必要的探针失败。
  4. failureThreshold(连续探测失败的次数)
    • 根据应用程序的稳定性和容错能力来设置。对于更稳定的服务,可以设置较高的失败阈值。
    • 如果应用程序偶尔出现短暂的不稳定状态,增加失败阈值可以减少不必要的重启或流量移除。
  5. successThreshold(连续探测成功的次数)
    • 对于 ReadinessProbe 和 StartupProbe,这个参数决定了容器在多少次连续成功探测后才能被标记为就绪或启动完成。
    • 根据应用程序的特性和需求来设置。如果应用程序需要多次成功的健康检查来确保稳定性,可以增加这个值。
  6. 其他注意事项
    • 在生产环境中,建议通过实际测试和观察来调整这些参数,以确保它们与应用程序的实际行为相匹配。
    • 考虑到集群的整体性能和资源消耗,避免为所有容器设置过于严格的探针参数。
    • 根据应用程序的日志和监控数据来分析和优化探针配置。

总之,合理配置探针参数需要综合考虑应用程序的特性、集群规模、资源限制以及业务需求等多个因素。通过不断测试和调整,您可以找到最适合您应用程序的探针配置。

初始化容器

初始化容器是在pod的主容器启动之前要运行的容器,主要是做一些主容器的前置工作,它具有两大特征:

  1. 初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么kubernetes需要重启它直到成功完成
  2. 初始化容器必须按照定义的顺序执行,当且仅当前一个成功之后,后面的一个才能运行

初始化容器有很多的应用场景,下面列出的是最常见的几个:

  • 提供主容器镜像中不具备的工具程序或自定义代码
  • 初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足
apiVersion: v1
kind: Pod
metadata:name: pod-initcontainernamespace: dev
spec:containers:- name: main-containerimage: nginx:1.7.9imagePullPolicy: IfNotPresentports:- name: nginx-portcontainerPort: 80initContainers:      # 初始化容器执行操作 执行完之后才会启动主容器- name: test-mysqlimage: busybox:1.30command: ['sh', '-c', 'until ping 172.26.25.71 -c 1 ; do echo waiting for mysql...; sleep 2; done;']- name: test-redisimage: busybox:1.30command: ['sh', '-c', 'until ping 172.26.25.71 -c 1 ; do echo waiting for reids...; sleep 2; done;']

钩子函数

pod 生命周期中,有两个钩子函数,PreStart 和 PreStop,

  • PreStart 在主容器创建之后执行,如果失败,就会重启容器(PreStart使用频率少,因为与有init 和 startupprobe 都处于容器启动前阶段,并且使用不当会与startupprobe 冲突)

  • PreStop 在主容器销毁之前执行,执行完成之后终止容器(用来在容销毁前,在注册中心下线,清理/销毁 数据)

同样钩子处理器支持 exec tcpScoke httpGet 三种方式.下面以PreStop 为例, 配置在containers: 下

lifecycle:preStop:exec:command:- sh- -c- 'sleep 20; kill pgrep java'

执行preStop 时,pod 会处于Termination 状态挂起
但是需要注意,由于 k8s 默认给 pod 的停止宽限时间为 30s,如果我们停止操作会超过 30s 时,不要光设置 sleep 50,还要将 terminationGracePeriodSeconds: 30 也更新成更长的时间,否则 k8s 最多只会在这个时间的基础上再宽限几秒,不会真正等待 50s

相关文章:

k8s-Pod

文章目录 k8s-Podpod 配置文件详解pod 生命周期pod 探针StartupProbeLivenessProbeReadinessProbe探针使用建议 初始化容器钩子函数 k8s-Pod pod 是k8s 中可以调度的最小单位 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的…...

智能网络新纪元:机器学习赋能未来计算机网络高速发展

🧑 作者简介:阿里巴巴嵌入式技术专家,深耕嵌入式人工智能领域,具备多年的嵌入式硬件产品研发管理经验。 📒 博客介绍:分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…...

大数据之kafka应用

大数据之kafka应用 2024启kafkakafka常见命令生产上重放信息jmxjmx的配置和开启jmx的使用jmx例子一 jmx例子二jmx例子三jmx例子四(special) 2024启kafka kafka常见命令 指定jmx端口启动kafka lsof -i :9999 JMX_PORT9999 /opt/kafka_2.12-3.1.0/bin/kaf…...

嵌入式操作教程_数字信号处理_音频编解码:3-6 AAC音频解码实验

一、实验目的 了解AAC音频格式,掌握AAC音频解码的原理,并实现将AAC格式的音频解码为PCM 二、实验原理 音频编解码的主要对象是音乐和语音,音频的编解码格式可分为无压缩的格式、无损压缩格式、有损音乐压缩格式、有损语音压缩格式和合成算…...

【从浅学到熟知Linux】冯诺依曼体系结构及进程概念详谈!

🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 🎯每天努力一点点,技术变化看得见 文章目录 冯诺依曼体系结构操作系统如何理解管理操作系统概念设计操作系统目的系统调用和库函数概念 进程基本概念描…...

word转pdf(前后端最全保姆级别)

word转pdf vue2java 文章目录 word转pdf vue2java一、前端 vue-pdf1、下载依赖2、封装的组件 二、java使用aspose(付费)1.引入库2.封装的工具类3、付费密钥文件 总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、前端 vue…...

深度学习简介

深度学习简介 一、引言:深度学习的兴起 简短介绍深度学习的历史背景 深度学习,作为人工智能领域的一颗冉冉升起的新星,其根源可以追溯到上世纪的感知机学习算法。这种算法模拟人类的神经元行为,是最早期的尝试之一。然而&#x…...

深入探索:使用C++构建顶级性能的网络服务器

在数字化浪潮的推动下,网络服务器作为信息交互的核心枢纽,其性能与稳定性直接决定了互联网应用的服务质量和用户体验。C++,作为一种兼具高效性与灵活性的编程语言,已然成为构建高性能网络服务器的首选工具。本文旨在深入剖析C++在构建顶级性能网络服务器中的关键技术、最佳…...

SpringBoot学习笔记四

SpringBoot学习笔记四-监听机制 1. SpringBoot监听器1.1 无需配置1.1.1 CommandLineRunner使用1.1.2 ApplicationRunner的使用1.1.3 CommandLineRunner与ApplicationRunner的区别 1.2 需要创建META-INF文件,并在其中创建spring.factories,配置相关的信息…...

雄安建博会:中矿雄安新区的总部开工建设

中矿落位雄安:助力国家战略与新区发展 雄安新区,作为中国未来发展的重要战略支点,正迎来一系列央企总部的疏解与建设。最近,中国矿产资源集团有限公司(简称“中矿”)在雄安新区的总部项目正式开工建设&…...

蒙特卡洛方法【强化学习】

强化学习笔记 主要基于b站西湖大学赵世钰老师的【强化学习的数学原理】课程,个人觉得赵老师的课件深入浅出,很适合入门. 第一章 强化学习基本概念 第二章 贝尔曼方程 第三章 贝尔曼最优方程 第四章 值迭代和策略迭代 第五章 强化学习实践—GridWorld 第…...

构建第一个ArkTS之声明式UI描述

ArkTS以声明方式组合和扩展组件来描述应用程序的UI,同时还提供了基本的属性、事件和子组件配置方法,帮助开发者实现应用交互逻辑。 创建组件 根据组件构造方法的不同,创建组件包含有参数和无参数两种方式。 说明 创建组件时不需要new运算…...

pytest教程-25-生成覆盖率报告插件-pytest-cov

领取资料,咨询答疑,请➕wei: June__Go 上一小节我们学习了pytest多重断言插件pytest-assume,本小节我们讲解一下pytest生成覆盖率报告插件pytest-cov。 测量代码覆盖率的工具在测试套件运行时观察你的代码,并跟踪哪些行被运行,…...

特征工程总结

后期总结 Reference [1] 特征工程总结 - 知乎...

JUC并发编程2(高并发,AQS)

JUC AQS核心 当有线程想获取锁时,其中一个线程使用CAS的将state变为1,将加锁线程设为自己。当其他线程来竞争锁时会,判断state是不是0,不是自己就把自己放入阻塞队列种(这个阻塞队列是用双向链表实现)&am…...

Golang 为什么需要用反射

本质上是可以动态获取程序运行时的变量(类型) 比如现在我想实现一个通用的db插入函数,支持我传入所有类型的struct,每一种类型的struct是一个单独的表,以struct的名称作为表名,然后插入到不同的表中。 pa…...

【Linux的进程篇章 - 进程终止和进程等待的理解】

Linux学习笔记---008 Linux之fork函数、进程终止和等待的理解1、fork函数1.1、什么是fork?1.2、fork的功能介绍1.3、fork函数返回值的理解1.4、fork函数的总结 2、进程的终止2.1、终止是在做什么?2.2、进程终止的3种情况 3、进程的终止3.1、进程终止的三种情况3.2、…...

《策略模式(极简c++)》

本文章属于专栏- 概述 - 《设计模式(极简c版)》-CSDN博客 本章简要说明适配器模式。本文分为模式说明、本质思想、实践建议、代码示例四个部分。 模式说明 方案:策略模式是一种行为设计模式,它定义了一系列算法,将每…...

Python向文件里写入数据

直接上代码 name "测试" data name.encode("utf-8")# w特点:文件不存在则创建文件并在打开前清空 f open("db.txt", mode"wb")f.write(data)f.close()可以在 db.txt 文件里看到一句话 测试name "Testing" …...

【网站项目】校园订餐小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…...

微信小程序之bind和catch

这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来,实在找不到,希望有大佬教一下我。 还有就会议时间,我感觉不是图片时间,因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...