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

文章目录

    • 1、Pod
      • 1.1、定义
      • 1.2、Pod的形式
      • 1.3、Pod的使用
      • 1.4、 Pod生命周期
      • 1.5、初始化容器
      • 1.6、临时容器
        • 1.6.1、定义
        • 1.6.2、使用临时容器的步骤
      • 1.7、静态Pod
      • 1.8、创建带标签的pod
      • 1.9、容器生命周期回调
      • 1.10、容器镜像使用秘钥从私有仓库下载
      • 1.11、多容器协同工作
    • 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.3、Pod的使用

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

1.4、 Pod生命周期

在这里插入图片描述

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

1.5、初始化容器

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

在这里插入图片描述

1.6、临时容器

1.6.1、定义

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

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

1.6.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.7、静态Pod

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

apiVersion: v1
kind: Pod
metadata:name: "static-pod"namespace: defaultlabels:app: "MYAPP"
spec:containers:- name: nginximage: "nginx"

最终效果:
在这里插入图片描述

1.8、创建带标签的pod

apiVersion: v1
kind: Pod
metadata:name: "my-nginx-labels"namespace: hello666labels:aa: "bb"cc: "dd"app: "my-nginx"
spec:containers:- name: my-nginximage: "nginx"

查看pod携带的标签属性:kubectl get pod --show-labels
在这里插入图片描述

1.9、容器生命周期回调

postStart:这个回调在容器被创建之后立即被执行。 但是,不能保证回调会在容器入口点(ENTRYPOINT)之前执行,没有参数传递给处理程序
preStop:在容器因 API 请求或者管理事件(诸如存活态探针、启动探针失败、资源抢占、资源竞争等) 而被终止之前,此回调会被调用。 如果容器已经处于已终止或者已完成状态,则对 preStop 回调的调用将失败。 在用来停止容器的 TERM 信号被发出之前,回调必须执行结束。 Pod 的终止宽限周期在 PreStop 回调被执行之前即开始计数, 所以无论回调函数的执行结果如何,容器最终都会在 Pod 的终止宽限期内被终止。 没有参数会被传递给处理程序

apiVersion: v1
kind: Pod
metadata:name: "pod-lifecycle"namespace: hello666labels:aa: "bb"cc: "dd"app: "v1"
spec:containers:- name: nginximage: "nginx"lifecycle:postStart:# exec:httpGet:host: "10.244.85.196"  # 容器启动了立即向这个地址发送"/"请求,启动以后的自动回调path: "/"port: 80scheme: "HTTP"preStop:httpGet:host: "10.244.85.196"  # 容器删除了立即向这个地址发送"/preStop"请求,删除容器后的自动回调path: "/preStop"port: 80scheme: "HTTP"

1.10、容器镜像使用秘钥从私有仓库下载

1. 使用 Docker Config 创建 Secret(前提:需要知道用于向仓库进行身份验证的用户名、密码和客户端电子邮件地址,以及它的主机名)
kubectl create secret -n <名称空间> docker-registry <生成的密钥名字> \--docker-server=DOCKER_REGISTRY_SERVER \--docker-username=DOCKER_USER \--docker-password=DOCKER_PASSWORD \--docker-email=DOCKER_EMAIL  # 邮箱可以不指定2. 查看生成的密钥信息: kubectl get secret -n hello666 (-n 后面写你的名称空间)3. 在 Pod 中引用 ImagePullSecrets 
apiVersion: v1
kind: Pod
metadata:name: "pod-secret-nginx"namespace: hello666labels:aa: bbcc: ddapp: "nginx-secret"
spec:imagePullSecrets:- name: 密钥名字(这个就是填第一步里生成的密钥名字,多个容器可以配置多个密钥名字,k8s可以自己判断启动不同的容器去使用不同的密钥)containers:# 第一组容器(私有的)- name: pod-secret-nginximage: "这里写你的私有镜像地址"imagePullPolicy: Always  # 拉取策略 # 第二组容器(官方下载的,k8s知道官方的镜像不需要用密钥下载,通过镜像名称的前缀区分)- name: my-tomcatimage: tomcat4. 最终这个pod里面会生成两个容器

1.11、多容器协同工作

实现效果:
准备两个容器,一个是alpine,一个是nginx,利用卷挂载出nginx的index.html页面,然后使用alpine一直往这个index.html页面里打印当前时间,访问这个容器就显示最新的时间信息

apiVersion: v1
kind: Pod
metadata:name: "multicontainer-pod"namespace: hello666labels:app: "multicontainer-pod"
spec:volumes: - emptyDir: {}    # 类似于docker的匿名挂载, 外部创建一个位置name: "nginx-vol"containers:- name: nginx-containerimage: "nginx"volumeMounts: - name: "nginx-vol"mountPath: "/usr/share/nginx/html"- name: "content-container"image: "alpine"command: ["/bin/sh","-c","while true;do sleep 1; date > /app/index.html;done;"]volumeMounts:- name: "nginx-vol"mountPath: "/app"

最终效果:
在这里插入图片描述

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-probe"namespace: defaultlabels:app: "nginx-start-probe"
spec:volumes:- name: nginx-volhostPath: path: /app- name: nginx-htmlhostPath: path: /htmlcontainers:- name: nginximage: "nginx"ports:- containerPort: 80startupProbe:exec:command:  ["/bin/sh","-c","cat /app/abc"]  ## 返回不是0,那就是探测失败# initialDelaySeconds: 20 ## 指定的这个秒以后才执行探测periodSeconds: 5  ## 每隔几秒来运行这个timeoutSeconds: 5  ## 探测超时,到了超时时间探测还没返回结果说明失败successThreshold: 1 ## 成功阈值,连续几次成才算成功failureThreshold: 3 ## 失败阈值,连续几次失败才算真失败volumeMounts:- name: nginx-volmountPath: /app- name: nginx-htmlmountPath: /usr/share/nginx/htmllivenessProbe:   ## 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: ## 就绪检测,都是httphttpGet:  # host: 127.0.0.1  ## 不用指定hostpath: /abc.html  ## 给容器发请求port: 80scheme: 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.mzph.cn/news/53274.shtml

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

相关文章

GAN原理 代码解读

模型架构 代码 数据准备 import os import time import matplotlib.pyplot as plt import numpy as np import torchvision.transforms as transforms from torch.utils.data import DataLoader from torchvision import datasets import torch.nn as nn import torch# 创建文…

搭建 Qt6 开发环境

作者&#xff1a; 一去、二三里 个人微信号&#xff1a; iwaleon 微信公众号&#xff1a; 高效程序员 Qt 是一个跨平台的 C 应用程序开发框架&#xff0c;它提供了丰富的组件库和工具&#xff0c;使得开发人员可以在各种平台上轻松地开发 GUI 应用程序。 由于我们的教程 《细说…

CnetSDK .NET OCR SDK Crack

CnetSDK .NET OCR SDK Crack CnetSDK.NET OCR库SDK是一款高度准确的.NET OCR扫描仪软件&#xff0c;用于使用手写、文本和其他符号等图像进行字符识别。它是一款.NET OCR库软件&#xff0c;使用Tesseract OCR引擎技术&#xff0c;可将字符识别准确率提高99%。通过将此.NET OCR扫…

Rancher使用cert-manager安装报错解决

报错&#xff1a; rancher-rke-01:~/rke/rancher-helm/rancher # helm install rancher rancher-stable/rancher --namespace cattle-system --set hostnamewww.rancher.local Error: INSTALLATION FAILED: Internal error occurred: failed calling webhook "webhook…

sentinel的基本使用

在一些互联网项目中高并发的场景很多&#xff0c;瞬间流量很大&#xff0c;会导致我们服务不可用。 sentinel则可以保证我们服务的正常运行&#xff0c;提供限流、熔断、降级等方法来实现 一.限流&#xff1a; 1.导入坐标 <dependency><groupId>com.alibaba.c…

快速排序三种思路详解!

一、快速排序的介绍 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff0c;其基本思想为&#xff1a;任取待排序元素序列中 的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;…

激活函数总结(十九):激活函数补充(ISRU、ISRLU)

激活函数总结&#xff08;十九&#xff09;&#xff1a;激活函数补充 1 引言2 激活函数2.1 Inverse Square Root Unit &#xff08;ISRU&#xff09;激活函数2.2 Inverse Square Root Linear Unit (ISRLU)激活函数 3. 总结 1 引言 在前面的文章中已经介绍了介绍了一系列激活函…

python AI绘图教程

前提 1.安装python 2.安装git 步骤 下载stable-diffusion-webui项目&#xff08;链接&#xff1a;GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI&#xff09; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 安装st…

商城-学习整理-高级-消息队列(十七)

目录 一、RabbitMQ简介(消息中间件)1、RabbitMQ简介&#xff1a;2、核心概念1、Message2、Publisher3、Exchange4、Queue5、Binding6、Connection7、Channel8、Consumer9、Virtual Host10、Broker 二、一些概念1、异步处理2、应用解耦3、流量控制5、概述 三、Docker安装RabbitM…

【C++ 学习 ⑰】- 继承(下)

目录 一、派生类的默认成员函数 二、继承与友元 三、继承与静态成员 四、复杂的菱形继承及菱形虚拟继承 五、继承和组合 一、派生类的默认成员函数 派生类的构造函数必须调用基类的构造函数初始化基类的那一部分成员。如果基类没有默认构造函数&#xff0c;那么必须在派生…

报错sql_mode=only_full_group_by

首发博客地址 https://blog.zysicyj.top/ 报错内容 ### The error may exist in file[D:\code\cppCode20221025\leader-system\target\classes\mapper\system\TJsonDataMapper.xml] ### The error may involve defaultParameterMap ### The error occurred while…

如何使用LLM实现文本自动生成视频

推荐&#xff1a;使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 介绍 基于扩散的图像生成模型代表了计算机视觉领域的革命性突破。这些进步由Imagen&#xff0c;DallE和MidJourney等模型开创&#xff0c;展示了文本条件图像生成的卓越功能。有关这些模型内部工作的…

【C++】UDP通信,实现文件的传输

目录 1 TCP与UDP比较 2 UDP 3 通信流程 4 实践 5 运行结果 1 TCP与UDP比较 2 UDP简介 UDP通信是无连接的,因此不需要

Spring与Mybatis集成且Aop整合(放飞双手,迅速完成CRUD及分页)

目录 一、概述 二、集成 ( 1 ) 为什么 ( 2 ) 优点 ( 3 ) 实例 三、整合 3.1 讲述 3.2 整合进行分页 带我们带来的收获 一、概述 集成是指将不同的组件、系统或框架整合在一起&#xff0c;使它们能够协同工作&#xff0c;共同完成某个功能或提供某种服务。在软件开发中&…

C语言之三子棋游戏实现篇

目录 主函数test.c 菜单函数 选择实现 游戏函数 &#xff08;函数调用&#xff09; 打印棋盘数据 打印展示棋盘 玩家下棋 电脑下棋 判断输赢 循环 test.c总代码 头文件&函数声明game.h 头文件的包含 游戏符号声明 游戏函数声明 game.h总代码 游戏函数ga…

服务器中了mkp勒索病毒该怎么办?勒索病毒解密,数据恢复

mkp勒索病毒算的上是一种比较常见的勒索病毒类型了。它的感染数量上也常年排在前几名的位置。所以接下来就由云天数据恢复中心的技术工程师来对mkp勒索病毒做一个分析&#xff0c;以及中招以后应该怎么办。 一&#xff0c;中了mkp勒索病毒的表现 桌面以及多个文件夹当中都有一封…

Linux:shell脚本:基础使用(6)《正则表达式-awk工具》

简介 awk是行处理器: 相比较屏幕处理的优点&#xff0c;在处理庞大文件时不会出现内存溢出或是处理缓慢的问题&#xff0c;通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理&#xff0c;然后输出 1&#xff09;awk命令会逐行读取文件的内容进行处理 2&#xff09;a…

Neo4j实现表字段级血缘关系

需求背景 需要在前端页面展示当前表字段的所有上下游血缘关系&#xff0c;以进一步做数据诊断治理。大致效果图如下&#xff1a; 首先这里解释什么是表字段血缘关系&#xff0c;SQL 示例&#xff1a; CREATE TABLE IF NOT EXISTS table_b AS SELECT order_id, order_status F…

PB4引脚作GPIO上电高电平问题

问题说明 给旧项目debug&#xff0c;芯片是国民技术 N32G452VEL7 &#xff08;用起来跟32没多大差 包括PB4在内有多个引脚作为输出&#xff0c;默认低电平&#xff0c;在状态机内先输出高电平再回到低电平&#xff0c;来模拟按键的状态&#xff08;相当于按键按下松开后按键功…

计算机竞赛 基于大数据的时间序列股价预测分析与可视化 - lstm

文章目录 1 前言2 时间序列的由来2.1 四种模型的名称&#xff1a; 3 数据预览4 理论公式4.1 协方差4.2 相关系数4.3 scikit-learn计算相关性 5 金融数据的时序分析5.1 数据概况5.2 序列变化情况计算 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &…