k8s之Pod及Probe 探针机制(健康检查机制)

news2024/12/24 8:14:32

文章目录

    • 1、Pod
      • 1.1、定义
      • 1.2、Pod的形式
      • 1.2、Pod的使用
      • 1.3、 Pod生命周期
      • 1.4、生命周期钩子
      • 1.5、临时容器
        • 1.5.1、定义
        • 1.5.2、使用临时容器的步骤
      • 1.6、静态Pod
    • 2、Probe 探针机制(健康检查机制)
      • 2.1、探针分类
      • 2.2、Probe配置项
      • 2.3、编写yaml测试探针机制

1、Pod

1.1、定义

  • Pod 是一组(一个或多个) 容器(docker容器)的集合 (就像在豌豆荚中);这些容器共享存储、网络、以及怎样运行这些容器的声明
    -在这里插入图片描述
  • 我们一般不直接创建Pod,而是创建一些工作负载由他们来创建Pod

1.2、Pod的形式

  • Pod对容器有自恢复能力(Pod自动重启失败的容器)
  • Pod自己不能恢复自己,Pod如果被删除就真的没了,还是希望k8s集群能自己在其他地方再启动这个Pod
  • 单容器Pod
  • 多容器协同Pod。我们可以把另外的容器称为 SideCar(为应用赋能)
  • Pod 天生地为其成员容器提供了两种共享资源:网络存储

一个Pod由一个Pause容器设置好整个Pod里面所有容器的网络、名称空间等信息
systemctl status可以观测到,Pod和容器进程关系
kubelet启动一个Pod,准备两个容器,一个是Pod声明的应用容器(nginx),另外一个是
Pause,Pause给当前应用容器设置好网络空间

在这里插入图片描述

1.2、Pod的使用

  • 可以编写deploy等各种工作负载的yaml文件,最终创建出pod,也可以直接创建
  • Pod的模板如下
#这里是 Pod 模版
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: hello
    image: busybox
    command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
  restartPolicy: OnFailure
#以上为 Pod 模版

1.3、 Pod生命周期

在这里插入图片描述

  • Pod启动,会先依次执行所有初始化容器,有一个失败,则Pod不能启动
  • 接下来启动所有的应用容器(每一个应用容器都必须能一直运行起来),Pod开始正式工作,一个启动失败就会尝试重启Pod内的这个容器,Pod只要是NotReady,Pod就不对外提供服务了

1.4、生命周期钩子

apiVersion: v1
kind: Pod
metadata:
  name: "pod-life-02"
  namespace: default
  labels:
    app: "pod-life-02"
spec:
  volumes:
  - name: content-vol
    emptyDir: {}
  initContainers:  ## Pod在启动containers之前,先要【运行完】initContainers的所有容器,所以这些容器必须有终结,不能一直运行
  - name: init-c-01
    image: alpine  ### 必须有终结的那个时刻,一般不要用一直启动的镜像
    command: ["/bin/sh","-c","echo 12222222 > /app/index.html;sleep 30;"]
    volumeMounts: 
     - name: content-vol
       mountPath: /app
  # - name: init-c-02
  #   image: alpine  ### 必须有终结的那个时刻,一般不要用一直启动的镜像
  #   command: ["/bin/sh","-c","echo 12222222 > /app/index.html;sleep 30;"]
  #   volumeMounts: 
  #    - name: content-vol
  #      mountPath: /app
  containers:
  ### docker run alpine 没有在后台一直启动的程序
  - name: pod-life-01
    image: "nginx" #默认的启动命令是启动nginx。nginx启动在后台一直有了
    volumeMounts: 
     - name: content-vol
       mountPath: /usr/share/nginx/html
  - name: pod-life-02
    image: "alpine"  #pod里面的containers都必须能启动起来,Pod会不断的重启这个容器
    command: ["/bin/sh","-c","sleep 30"]

在这里插入图片描述

1.5、临时容器

1.5.1、定义

临时容器:线上排错
有些容器基础镜像。线上没法排错。使用临时容器进入这个Pod。临时容器共享了Pod的所有。临时容器有Debug的一些命令,拍错完成以后,只要exit退出容器,临时容器自动删除

临时容器需要开启特性门控 --feature-gates=“EphemeralContainers=true”
在所有组件,api-server、kubelet、scheduler、controller-manager都得配置

1.5.2、使用临时容器的步骤

# 1、声明一个临时容器。准备好json文件
{
	"apiVersion": "v1",
	"kind": "EphemeralContainers",
	"metadata": {
		"name": "my-nginx666" //指定Pod的名字
	},
	"ephemeralContainers": [{
	"command": [
		"sh"
	],
	"image": "busybox", //jre的需要jdk来调试
	"imagePullPolicy": "IfNotPresent",
	"name": "debugger",
	"stdin": true,
	"tty": true,
	"terminationMessagePolicy": "File"
	}]
}

# 2、使用临时容器,应用一下即可
kubectl replace --raw /api/v1/namespaces/default/pods/my-nginx666【pod
名】/ephemeralcontainers -f ec.json

1.6、静态Pod

在 /etc/kubernetes/manifests 位置放的所有Pod.yaml文件,机器启动kubelet自己就把他启动起来,静态Pod一直守护在他的这个机器上

2、Probe 探针机制(健康检查机制)

2.1、探针分类

  • 每个容器三种探针(Probe)
    • 启动探针**(后来才加的)** 一次性成功探针。 只要启动成功了
      • kubelet 使用启动探针,来检测应用是否已经启动。如果启动就可以进行后续的探测检
        查。慢容器一定指定启动探针。一直在等待启动
      • 启动探针 成功以后就不用了,剩下存活探针和就绪探针持续运行
    • 存活探针
      • kubelet 使用存活探针,来检测容器是否正常存活。(有些容器可能产生死锁【应用程序在运行,但是无法继续执行后面的步骤】), 如果检测失败就会**重新启动这个容器 **
      • initialDelaySeconds: 3600(长了导致可能应用一段时间不可用) 5(短了陷入无限启
        动循环)
    • 就绪探针
      • kubelet 使用就绪探针,来检测容器是否准备好了可以接收流量。当一个 Pod 内的所有
        容器都准备好了,才能把这个 Pod 看作就绪了。用途就是:Service后端负载均衡多个
        Pod,如果某个Pod还没就绪,就会从service负载均衡里面剔除
    • 谁利用这些探针探测
      • kubelet会主动按照配置给Pod里面的所有容器发送响应的探测请求

2.2、Probe配置项

- initialDelaySeconds :容器启动后要等待多少秒后存活和就绪探测器才被初始化,默认
是 0 秒,最小值是 0。这是针对以前没有
- periodSeconds :执行探测的时间间隔(单位是秒)。默认是 10 秒。最小值是 1。
- successThreshold :探测器在失败后,被视为成功的最小连续成功数。默认值是 1。
    - 存活和启动探针的这个值必须是 1。最小值是 1。
- failureThreshold :当探测失败时,Kubernetes 的重试次数。 存活探测情况下的放弃就
意味着重新启动容器。 就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最
小值是 1。
- timeoutSeconds :探测的超时后等待多少秒。默认值是 1 秒。最小值是 1

2.3、编写yaml测试探针机制

apiVersion: v1
kind: Pod
metadata:
  name: "nginx-start-probe02"
  namespace: default
  labels:
    app: "nginx-start-probe02"
spec:
  volumes:
  - name: nginx-vol
    hostPath:
      path: /app
  - name: nginx-html
    hostPath:
      path: /html
containers:
- name: nginx
  image: "nginx"
  ports:
  - containerPort: 80
  startupProbe:
    exec:
      command: ["/bin/sh","-c","cat /app/abc"] ## 返回不是0,那就是探测失败
    # initialDelaySeconds: 20 ## 指定的这个秒以后才执行探测
    periodSeconds: 5 ## 每隔几秒来运行这个
    timeoutSeconds: 5 ##探测超时,到了超时时间探测还没返回结果说明失败
    successThreshold: 1 ## 成功阈值,连续几次成才算成功
    failureThreshold: 3 ## 失败阈值,连续几次失败才算真失败
  volumeMounts:
  - name: nginx-vol
    mountPath: /app
  - name: nginx-html
    mountPath: /usr/share/nginx/html
  livenessProbe: ## nginx容器有没有 /abc.html,就绪探针
    # httpGet:
    # host: 127.0.0.1
    # path: /abc.html
    # port: 80
    # scheme: HTTP
    # periodSeconds: 5 ## 每隔几秒来运行这个
    # successThreshold: 1 ## 成功阈值,连续几次成才算成功
    # failureThreshold: 5 ## 失败阈值,连续几次失败才算真失败
    exec:
      command: ["/bin/sh","-c","cat /usr/share/nginx/html/abc.html"] ## 返回
不是0,那就是探测失败
    # initialDelaySeconds: 20 ## 指定的这个秒以后才执行探测
    periodSeconds: 5 ## 每隔几秒来运行这个
    timeoutSeconds: 5 ##探测超时,到了超时时间探测还没返回结果说明失败
    successThreshold: 1 ## 成功阈值,连续几次成才算成功
    failureThreshold: 3 ## 失败阈值,连续几次失败才算真失败
    readinessProbe: ##就绪检测,都是http
      httpGet:
      # host: 127.0.0.1 ###不行
      path: /abc.html ## 给容器发请求
      port: 80
      scheme: HTTP ## 返回不是0,那就是探测失败
    initialDelaySeconds: 2 ## 指定的这个秒以后才执行探测
    periodSeconds: 5 ## 每隔几秒来运行这个
    timeoutSeconds: 5 ##探测超时,到了超时时间探测还没返回结果说明失败
    successThreshold: 3 ## 成功阈值,连续几次成才算成功
    failureThreshold: 5 ## 失败阈值,连续几次失败才算真失败
  # livenessProbe:
  # exec: ["/bin/sh","-c","sleep 30;abc "] ## 返回不是0,那就是探测失败
  # initialDelaySeconds: 20 ## 指定的这个秒以后才执行探测
  # periodSeconds: 5 ## 每隔几秒来运行这个
  # timeoutSeconds: 5 ##探测超时,到了超时时间探测还没返回结果说明失败
  # successThreshold: 5 ## 成功阈值,连续几次成才算成功
  # failureThreshold: 5 ## 失败阈值,连续几次失败才算真失败

健康检查+优雅停机 = 0宕机
start完成以后,liveness和readness并存。 liveness失败导致重启。readness失败导致不给Service负载均衡网络中加,不接受流量。 kubectl exec -it 就进不去。Kubectl describe 看看咋了。

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

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

相关文章

初阶c语言:实战项目三子棋

前言 大家已经和博主学习有一段时间了,今天讲一个有趣的实战项目——三子棋 目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程 初始化棋盘 打印棋盘 玩家下棋 电脑下棋 时间戳:推荐一篇 C语言生成随机数的方法_c语言随机数_杯浅…

成为创作者的第512天——创作纪念日

​ 📚文章目录 📨官方致信 🎯我的第一篇文章 🧩机缘 🧩收获 🧩成就 🧩憧憬与目标 📨官方致信 ​ 🎯我的第一篇文章 2022 年 03 月 26 日,那一天我在C…

【网络安全】防火墙知识点全面图解(一)

防火墙知识点全面图解(一) 1、什么是防火墙? 防火墙(Firewall)是防止火灾发生时,火势烧到其它区域,使用由防火材料砌的墙。 后来这个词语引入到了网络中,把从外向内的网络入侵行为看…

nodejs使用PassThrough流进行数据传递合并

在Node.js中,流(stream)是处理数据的强大工具,它们允许我们以流式方式处理大量数据,而不必一次性将所有数据加载到内存中。PassThrough是Node.js中的一个流类型,它在数据流传递过程中起到 无操作 的中间层&…

LeetCode 周赛上分之旅 #41 结合离散化的线性 DP 问题

⭐️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问。 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度…

设计模式——里氏替换原则

文章目录 里氏替换原则OO 中的继承性的思考和说明基本介绍一个程序引出的问题和思考解决方法 里氏替换原则 OO 中的继承性的思考和说明 继承包含这样一层含义:父类中凡是已经实现好的方法,实际上是在设定规范和契约,虽然它不强制要求所有的…

Web会话技术

会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应 会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,…

线性代数的学习和整理6:向量和矩阵详细,什么是矩阵?(草稿-----未完成)

43 矩阵 4.1 矩阵 4 整理网上总结一些 关于直击线性代数本质的 观点 矩阵的本质是旋转和缩放 矩阵里的数字0矩阵里的数字1,表示不进行缩放矩阵里的数字2等,表示缩放矩阵里的数字-3 表示缩放-3倍,并且反向矩阵里的数字的位置矩阵拆分为列向量…

学C的第三十四天【程序环境和预处理】

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 学C的第三十三天【C语言文件操作】_高高的胖子的博客-CSDN博客 1 . 程序的翻译环境和执行环境 在ANSI C(C语言标准)的任何一种实现中,存在两个不同的环境。 &#xff0…

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK设置相机的Bufferlist序列(C) Baumer工业相机Baumer工业相机的Bufferlist序列功能的技术背景CameraExplorer如何查看相机Bufferlist功能在BGAPI SDK里通过函数设置相机Bufferlist参数 Baumer工业相机通过BGAP…

第9步---MySQL的索引和存储引擎

第9步---MySQL的索引和存储引擎 1.索引 1.1分类 索引可以快速的找出具有特定值的行。不用从头开始进行寻找了。 类别 hash和btree hash 根据字段值生生成一个hash的值 快速的进行定位到对应的行的值 可能会出现相同的值,找到对应的空间会出现对应的值 btree树…

深度学习|自监督学习、MAE学习策略、消融实验

前言:最近在阅读论文,发现太多机器学习的知识不懂,把最近看的一篇论文有关的知识点汇总了一下。 自监督学习、MAE学习策略、消融实验 自监督学习MAE学习策略消融实验 自监督学习 Pretrain-Finetune(预训练精调)模式&…

从LeakCanary看如何判断对象被回收

前面已经了解了Service,Fragment,ViewModel对象的销毁时机,那么在触发销毁时机后,我们怎么判断这些对象有没有回收呢? 大家都知道在Java中有强引用,弱引用,软引用,虚引用四种引用方…

2、手写模拟Spring底层原理

创建BeanDefinition bean定义 设置BeanDefinition 的类信息,作用域信息 创建beanDefinitionMap scope为原型: scope为单例: 总结: 扫描ComponentScan注解上的包扫描路径,将Component注解修饰的类,生成Bea…

数据结构之并查集

并查集 1. 并查集原理2. 并查集实现3. 并查集应用3.1 省份数量3.2 等式方程的可满足性 4. 并查集的优缺点及时间复杂度 1. 并查集原理 并查表原理是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题。并查集的思想是用一个数组表示了整片森林&#xff0…

Apache Doris 极简运维之BE扩缩容(1)

Apache Doris 极简运维之BE扩缩容(1) 一、环境信息硬件信息软件信息 二、缩容2.1 DROP BACKEND缩容2.2 DECOMMISSION BACKEND缩容2.2.1 缩容前2.2.2 缩容中2.2.3 缩容后 三、扩容3.1 扩容前3.2 扩容中3.3 扩容后 四、总结 一、环境信息 已部署三个BE节点…

十二、Linux如何修改文件/文件夹所属用户or用户组?chown命令

目录 1、基础语法 2、修改目标用户: 3、修改用户组: 4、使用-R命令,并同时修改用户/用户组 1、基础语法 chown [-R] [目标用户][:][目标用户组] 被修改文件/文件夹 (1)选项-R:同chmod,对文…

Yellowbrick新手入门简介:用于Python机器学习模型可视化的工具库

Yellowbrick 是一个新的 Python 库,它扩展了 Scikit-Learn API,将可视化合并到机器学习工作流程中。 Yellowbrick需要依赖诸多第三方库,包括Scikit-Learn,Matplotlib,Numpy等等。 Yellowbrick 是一个开源的纯 Python…

resource doesn‘t have a corresponding Go package.

resource doesnt have a corresponding Go package. GO这个鬼东西不能直接放src下。 ************ Building Go project: ProjectGoTest ************with GOPATH: D:\Go;D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\ProjectGoTest >> Running: D:\Go\bin\go.exe …

项目管理实战笔记1:项目管理常识

序 看了下极客时间的《项目管理实战》,觉得跟之前学习PMP的标准资料还是有所侧重。重新整理下,相比书上繁杂的知识,这个更通俗易懂。 1 角色转换:三大误区 误区1:事必躬亲 自己做事情是可控的,做项目依赖…