kubernetes--Pod进阶

news2024/11/19 3:46:44

目录

一、资源限制:

 1. 资源限制的两种规范:

 2. Pod 和 容器 的资源请求和限制:

 3. CPU 资源单位:

 4. 内存资源单位 :

 5. 资源限制示例:

二、健康检查:探针(Probe)

 1. 探针的三种规则:

 2. 探针健康检查机制的优势:

 3. Probe支持三种检查方法:

  每次探测都将获得以下三种结果之一:

 3. 探针探测参数:

 4. 示例:

  4.1 livenessProbe(exec):

  4.2 livenessProbe(httpGet方式):

  4.3 tcpSocket方式:

三、启动、退出动作:


一、资源限制:

当定义 Pod 时可以选择性地为每个容器设定所需要的资源数量。 最常见的可设定资源是 CPU 和内存大小,以及其他类型的资源。

 1. 资源限制的两种规范:

  • requests :用于设置预留资源,指定了 request 资源时,调度器就使用该信息来决定将 Pod 调度到哪个节点上。    设置Pod容器创建时需要预留的资源量
  • limits: 用于限制运行时容器的最大占用资源,当容器占用资源超过limits时会被终止,并进行重启     设置Pod容器能够使用的最大资源量

如果给容器设置了内存的 limit 值,但未设置内存的 request 值,Kubernetes 会自动为其设置与内存 limit 相匹配的 request 值。 类似的,如果给容器设置了 CPU 的 limit 值但未设置 CPU 的 request 值,则 Kubernetes 自动为其设置 CPU 的 request 值 并使之与 CPU 的 limit 值匹配。

 2. Pod 和 容器 的资源请求和限制:

spec.containers[].resources.requests.cpu               //定义创建容器时预分配的CPU资源
spec.containers[].resources.requests.memory        //定义创建容器时预分配的内存资源
spec.containers[].resources.limits.cpu                    //定义 cpu 的资源上限 
spec.containers[].resources.limits.memory            //定义内存的资源上限

 3. CPU 资源单位:

  • CPU 资源的 request 和 limit 以 cpu 为单位。Kubernetes 中的一个 cpu 相当于1个 vCPU(1个超线程)。
  • Kubernetes 也支持带小数 CPU 的请求。spec.containers[].resources.requests.cpu 为 0.5 的容器能够获得一个 cpu 的一半 CPU 资源(类似于Cgroup对CPU资源的时间分片)。表达式 0.1 等价于表达式 100m(毫核),表示每 1000 毫秒内容器可以使用的 CPU 时间总量为 0.1*1000 毫秒。
  • Kubernetes 不允许设置精度小于 1m 的 CPU 资源。 

 4. 内存资源单位 :

内存的 request 和 limit 以字节为单位。可以以整数表示,或者以10为底数的指数的单位(E、P、T、G、M、K)来表示, 或者以2为底数的指数的单位(Ei、Pi、Ti、Gi、Mi、Ki)来表示。
如:1KB=10^3=1000,1MB=10^6=1000000=1000KB,1GB=10^9=1000000000=1000MB
1KiB=2^10=1024,1MiB=2^20=1048576=1024KiB

  • PS:在买硬盘的时候,操作系统报的数量要比产品标出或商家号称的小一些,主要原因是标出的是以 MB、GB为单位的,1GB 就是1,000,000,000Byte,而操作系统是以2进制为处理单位的,因此检查硬盘容量时是以MiB、GiB为单位,1GiB=2^30=1,073,741,824,相比较而言,1GiB要比1GB多出1,073,741,824-1,000,000,000=73,741,824Byte,所以检测实际结果要比标出的少一些。

 5. 资源限制示例:

apiVersion: v1
kind: Pod
metadata:
  creationTimestamp: null
  labels:
    run: nginx01
  name: nginx01
spec:
  containers:
  - image: nginx
    name: nginx01
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"
  - name: db
    image: mysql
    env:
    - name: MYSQL_ROOT_PASSWORD
      value: "abc123"
    resources:
      requests:
        memory: "512Mi"
        cpu: "0.5"
      limits:
        memory: "1Gi"
        cpu: "1"

kubectl describe pod nginx01   #查看pod资源
kubectl describe node node01   #查看node资源

    特殊容器,资源限制不能太低,例如mysql 内存不能低于512,否则会报OOM

二、健康检查:探针(Probe)

               yaml文件配置中与image同 

 1. 探针的三种规则:

  • livenessProbe :判断容器是否正在运行。如果探测失败,则kubelet会杀死容器,并且容器将根据 restartPolicy 来设置 Pod 状态。 如果容器不提供存活探针,则默认状态为Success。
  • readinessProbe :判断容器是否准备好接受请求。如果探测失败,端点控制器将从与 Pod 匹配的所有 service endpoints 中剔除删除该Pod的IP地址。 初始延迟之前的就绪状态默认为Failure。如果容器不提供就绪探针,则默认状态为Success。
  • startupProbe(这个1.17版本增加的):判断容器内的应用程序是否已启动,主要针对于不能确定具体启动时间的应用。如果配置了 startupProbe 探测,则在 startupProbe 状态为 Success 之前,其他所有探针都处于无效状态,直到它成功后其他探针才起作用。 如果 startupProbe 失败,kubelet 将杀死容器,容器将根据 restartPolicy 来重启。如果容器没有配置 startupProbe, 则默认状态为 Success。

#注:以上规则可以同时定义。在readinessProbe检测成功之前,Pod的running状态是不会变成ready状态的。

 2. 探针健康检查机制的优势:

  1. 精确控制健康状态: 探针允许你以更细粒度的方式定义容器的健康状态。通过定义自定义的检查逻辑,你可以确保容器的健康状态与你的应用程序的实际需求相匹配。
  2. 动态调整: 探针的配置允许你动态地调整健康检查的频率、超时和失败阈值等参数。这使得你可以根据应用程序的特性和环境的变化来优化健康检查的性能和准确性。
  3. 更好的故障处理: 使用探针可以帮助 Kubernetes 更快速、可靠地检测到容器的故障。这对于自动缩放、滚动升级和故障转移等场景非常重要,因为它能够更迅速地发现并替换不健康的容器。
  4. 避免不必要的流量: 控制器(如 Deployment)默认会在 Pod 启动后立即将其标记为 "就绪"。如果没有 readinessProbe,可能会导致流量被引导到尚未完全启动或初始化的容器。通过设置 readinessProbe,你可以确保只有在容器真正就绪时才将其加入服务负载均衡。

总的来说,使用探针提供了更大的灵活性和控制,使你能够根据应用程序的需求和特性进行定制,从而提高容器的可靠性和性能。

 3. Probe支持三种检查方法:

  1. exec :在容器内执行指定命令。如果命令退出时返回码为0则认为诊断成功。
  2. tcpSocket :对指定端口上的容器的IP地址进行TCP检查(三次握手)。如果端口打开,则诊断被认为是成功的。
  3. httpGet :对指定的端口和uri路径上的容器的IP地址执行HTTPGet请求。如果响应的状态码大于等于200且小于400,则诊断被认为是成功的

  每次探测都将获得以下三种结果之一:

  • 成功(Success):表示容器通过了检测。
  • 失败(Failure):表示容器未通过检测。
  • 未知(Unknown):表示检测没有正常进行。

 3. 探针探测参数:

  1. initialDelaySeconds:指定容器启动后延迟探测的秒数
  2. periodSeconds:指定每次探测间隔的秒数
  3. failureThreshold:探测连续失败判断整体探测失败的次数
  4. timeoutSeconds:指定探测超时等待的秒数

 4. 示例:

  4.1 livenessProbe(exec):

apiVersion: v1
kind: Pod
metadata:
  name: wzw01
spec:
  containers:
  - image: busybox
    name: busybox01
    ports:
    - containerPort: 80
    args:
    - /bin/sh
    - -c
    - touch /tmp/test.txt; sleep 30; rm -rf /tmp/test.txt; sleep 60;
    livenessProbe:
      exec:
        command:
        - /bin/sh
        - cat
        - /tmp/test.txt
      failureThreshold: 1     连续探测失败一次则下线容器
      initialDelaySeconds: 5  第一次探测的开始时间
      periodSeconds: 5        每次探测的间隔时间

  4.2 livenessProbe(httpGet方式):

apiVersion: v1
kind: Pod
metadata:
  name: wzw02
spec:
  containers:
  - image: nginx
    name: wzw-nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    livenessProbe:
      httpGet:
        port: 80
        path: /wzw.html   #/index.html
      failureThreshold: 2
      initialDelaySeconds: 5
      periodSeconds: 5

  4.3 tcpSocket方式:

apiVersion: v1
kind: Pod
metadata:
  name: wzw02
spec:
  containers:
  - image: nginx
    name: wzw-nginx
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    readinessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 5
    livenessProbe:
      tcpSocket:
        port: 80
      initialDelaySeconds: 20
      periodSeconds: 5

这个例子同时使用 readinessProbe 和 livenessProbe 探测。kubelet 会在容器启动 5 秒后发送第一个 readinessProbe 探测。这会尝试连接 nginx 容器的 80 端口。如果探测成功,kubelet 将继续每隔 5 秒运行一次检测。除了 readinessProbe 探测,这个配置包括了一个 livenessProbe 探测。kubelet 会在容器启动 20 秒后进行第一次 livenessProbe 探测。就像 readinessProbe 探测一样,会尝试连接 nginx 容器的 80 端口。如果 livenessProbe 探测失败,这个容器会被重新启动。

readinessProbe探测失败,无法进入READY状态

三、启动、退出动作:

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: soscscs/myapp:v1
    lifecycle:                 #此为关键字段
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler >> /var/log/nginx/message"]      
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the poststop handler >> /var/log/nginx/message"]
    volumeMounts:
    - name: message-log
      mountPath: /var/log/nginx/
      readOnly: false
  initContainers:
  - name: init-myservice
    image: soscscs/myapp:v1
    command: ["/bin/sh", "-c", "echo 'Hello initContainers'   >> /var/log/nginx/message"]
    volumeMounts:
    - name: message-log
      mountPath: /var/log/nginx/
      readOnly: false
  volumes:
  - name: message-log
    hostPath:
      path: /data/volumes/nginx/log/
      type: DirectoryOrCreate
kubectl get pods -o wide    #在node02节点

kubectl exec -it lifecycle-demo -- cat /var/log/nginx/message

##进入pod查看文件

 cat /data/volumes/nginx/log/message

由上可知,init Container先执行,然后当一个主容器启动后,Kubernetes 将立即发送 postStart 事件。

  •   删除 pod 后,再在 node02 节点上查看
kubectl delete pod lifecycle-demo

cat /data/volumes/nginx/log/message 

由此可知,当在容器被终结之前, Kubernetes 将发送一个 preStop 事件。

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

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

相关文章

深入理解强化学习——马尔可夫决策过程:马尔可夫过程和马尔科夫链

分类目录:《深入理解强化学习》总目录 马尔可夫过程是一组具有马尔可夫性质的随机变量序列 S 1 , S 2 , ⋯ , S t S_1, S_2, \cdots, S_t S1​,S2​,⋯,St​,其中下一个时刻的状态 S t 1 S_{t1} St1​只取决于当前状态 S t S_t St​ 。我们设状态的历史…

JVM:如果是你,你如何解决跨代引用的问题?(记忆集和卡集)

这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果对这部分内容感到枯燥或者疑惑,可以先放下看,等后续遇到要使用它们的实际场景、实际问题时再结合问题,再回来阅读和理解。 记忆集和卡集 前面在分代收集理论那…

第十六章,反射与注解例题

package 例题; import java.lang.reflect.Constructor;class 例题1Demo {//变量String s;int i, i2, i3;private 例题1Demo() {//无参构造方法}protected 例题1Demo(String s, int i) {//有参构造方法this.s s;this.i i;}public 例题1Demo(String... strings) throws NumberF…

jupyter lab常用插件集合

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

032-从零搭建微服务-定时服务(一)

写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…

【Git】第二篇:基本操作(创建本地仓库)

我们知道,git是一个版本控制器,可以帮我们控制管理电脑上所有格式的文档。 而我们需要使用git管理文件的时候,我们必须将这些文件放到git仓库中,只有在git仓库中的文件才可以被我们的git追踪管理 创建本地仓库 创建本地仓库是需…

【BMC】jsnbd介绍

jsnbd介绍 本文主要介绍一个名为jsnbd的开源项目,位于GitHub - openbmc/jsnbd,它实现了一个前端(包含HTML和JS文件)页面,作为存储服务器,可以指定存储内容;还包含一个后端的代理,这…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

【C++】类和对象(1)--初识

目录 一 类的引入 二 类的定义 1 类的两种定义方式: (1) 声明和定义全部放在类体中 (2) 类声明放在.h文件中&#xff0c;成员函数定义放在.cpp文件中 2 成员变量命名规则的建议 三 类的访问限定符及封装 1 访问限定符 2 封装 四 类的作用域 五 类的实例化 六 类对象…

图的表示与基础--Java

1.图的基础知识 该图片来自于&#xff1a; https://b23.tv/KHCF2m6 2.稀疏图与稠密图 G(V,E)&#xff1a;V顶点个数&#xff0c;E边的个数 稀疏图&#xff1a;E<<V 一般用邻接表表示(数组链表) 稠密图&#xff1a;E接近V 一般用邻接矩阵表示&#xf…

Java-多线程基础篇

前言&#xff1a; 以下是看马老师的视频以及自己阅读《Java多线程编程实战指南》所总结的基础内容&#xff0c;只是个人理解&#xff0c;如有不对还请大家指正。 1.线程的概念&#xff1a; 来自于百度百科&#xff1a;线程是独立调度和分派的基本单位。在Unix System V及Sun…

测试行业爬了7年,从功能测试到高级测试,工资也翻了好几倍

我在测试行业爬了7年。从功能测试到现在成为高级测试&#xff0c;我的工资也翻了好几倍。 入门阶段&#xff08;功能测试&#xff09; 个人认为&#xff0c;测试的前景还不错&#xff0c;只要你肯努力&#xff1b;刚出来的时候在鹅厂做外包功能测试。每天都很悠闲。点了两年&a…

Java16新增特性

前言 前面的文章&#xff0c;我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15 的特性进行了介绍&#xff0c;对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 今天我们来一起看一下…

【深圳1024开发者城市聚会】主理人视角的聚会现场,一起来看看有啥不一样的东西

【深圳1024开发者城市聚会】主理人视角的聚会现场&#xff0c;一起来看看有啥不一样的东西 今年的1024&#xff0c;我们在深圳&#xff0c;玩点不一样的… 文章目录 1 活动背景2 活动宣传3 活动准备4 活动现场布置会场会场引导签到深圳站视频展播前半程议题分分享简单茶歇后半场…

轻量封装WebGPU渲染系统示例<28>- MRT纹理(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/MRT.ts 当前示例运行效果: 此示例基于此渲染系统实现&#xff0c;当前示例TypeScript源码如下: export class MRT {private mRscene new RendererScene();initial…

错误:FUNCTION simple_notebook.count does not exist.解决方法

0 引入问题 小王&#xff1a;你这个数据有问题啊&#xff0c;有时候还会报错 小腾&#xff1a;怎么会有问题呢&#xff0c;代码写的一点毛病也没有 小王&#xff1a;没问题怎么会报错&#xff0c;你赶紧看看&#xff0c;项目上线甲方看到了报给老板咱俩就寄了 小腾&#xff1a…

【LeetCode刷题笔记】二叉树(一)

102. 二叉树的层序遍历 解题思路: 1. BFS广度优先遍历 ,使用队列,按层访问 解题思路: 2. 前序遍历 , 递归 ,在递归方法参数中,将 层索引

对于联邦政府来说,零信任只是一个开始

今年早些时候&#xff0c;美国空军国民警卫队的一名拥有绝密安全许可的成员向社交媒体平台 Discord 泄露了国家安全文件。 据报道&#xff0c;这些文件迅速传播到其他平台&#xff0c;其中包含有关美国和北约在俄罗斯军事行动的敏感信息&#xff0c;包括有关预期武器交付的详细…

Python 如何实现 Strategy 策略设计模式?什么是 Strategy 策略设计模式?

策略模式&#xff08;Strategy Design Pattern&#xff09;是一种对象行为型设计模式&#xff0c;它定义了一系列算法&#xff0c;并使得这些算法可以相互替换&#xff0c;使得客户端代码可以独立于算法的变化而变化。策略模式属于对象行为模式。 主要角色&#xff1a; 策略接口…