【kubernetes】pod的生命周期

news2024/11/25 16:46:05

文章目录

  • 1、概述
  • 2、pod的生命期
  • 3、pod阶段
  • 4、容器状态
  • 5、容器重启策略
  • 6、pod状况
    • 6.1 Pod就绪态
    • 6.2 Pod就绪态的状态
    • 6.3 Pod网络就绪
  • 7、容器探针
    • 7.1 检查机制
    • 7.2 探测结果
    • 7.3 探测类型
  • 8、Pod的终止
    • 8.1 强制终止Pod
    • 8.2 Pod的垃圾收集

1、概述

pod遵循预定义的生命周期,起始于Pending阶段,如果至少其中一个主要容器正常启动,则进入Running状态,之后取决于pod中是否有容器以失败状态结束而进入SucceededFailed阶段

在pod运行期间,kubelet能够重启容器以处理一些失效场景。在pod内部,kubernetes跟踪 不同容器的状态并确定pod重新变得健康所需要采取的动作。

在kubernetes API 中,Pod包含规约部分和实际状态部分,Pod对象的状态包含了一组pod状况(Conditions),如果应用需要的话,也可以向其中注入自定义的就绪态信息

pod在其生命周期中 只会被调度一次, 一旦pod被调度(分配)到某个节点,pod会一直在该节点运行,直到pod停止或者被终止。

2、pod的生命期

和一个个独立的应用容器一样, pod也被认为是相对临时性的实体,pod会被创建。赋予一个唯一的id(UID),并被调度到节点,并在终止或删除之前一直运行在该节点。

如果一个节点挂掉了,调度到该节点的pod也会在给定超时期限结束后删除。

pod自身不具有自愈能力。如果pod被调度到某个节点,而该节点之后失效,pod会被删除;类似的,pod无法在 因节点资源耗尽或者节点维护而被驱逐期间继续存活

kubernetes使用一种高级抽象来管理这些相对而言随时可丢弃的pod实例,称作控制器

任何给定的pod(由UID定义)从不会被重新调度到不同的节点;相反,这一pod可以被一个新的、几乎完全相同的pod替换掉,如果有需要,新pod的名字可以不变,但其UID会不同。

如果某物声称其生命周期某pod相同,如存储卷。这就意味着:该对象在此pod存在期间也一直存在,如果pod因为任何原因被删除,甚至某完全相同的替代pod被创建时,这个相关的对象也会被删除和重建

  • pod结构图例
    一个包含多个容器的pod中包含一个用来拉取文件的程序和一个web服务器,均使用持久卷作为容器间共享的存储。
    在这里插入图片描述

3、pod阶段

pod的status字段是一个PodStatus对象,其中包含一个phase字段。

pod的阶段(Phase)是pod在其生命周期中所处位置的简单宏观概述。该阶段并不是对容器或pod状态的综合汇总,也不是为了完成完整的状态机。

pod阶段的数量含义是严格定义的。除了以下的值之外,不应该再假定pod由其他的phase值

下面是phase可能的值:

取值状态描述
Pending(悬决)Pod已经被kuberbetes系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待Pod被调度的时间和通过网络下载镜像的时间
Running(运行)Pod已经绑定到了某个节点,Pod中所有的容器从都已经被创建。至少有一个容器仍在运行,或者正处于启动或重启状态
Succeeded(成功)Pod中所有容器都已经成功终止,并且不会再重启
Failed(失败)Pod中所有的容器都已经终止,并且至少有一个容器是因为失败终止。也就是说,容器以非0状态退出或被系统终止
Unknown(未知)因为某些原因,无法获取到pod的状态。这种情况通常是因为与Pod所在主机通信失败

说明:

  • 当一个pod被删除时,执行一些kubectl命令会展示这个pod的状态为Terminating(终止)。这个Terminating状态并不是Pod的状态之一。Pod被赋予一个可以体面终止的期限,默认时间为30秒,可以使用 --force参数来强制终止pod
  • 从kubernetes 1.27开始,除了静态Pod没有Finalizer的强制终止Pod 之外,kubelet会将已经删除的Pod转换到终止阶段(Failed或者Succeeded,具体取决于Pod容器的退出状态),然后再从API服务器中删除。
  • 如果某些节点死掉或者与集群中的其他节点失联,kubernetes会实施一种策略,将失去的节点上运行的所有Pod的phase设置为Failed

4、容器状态

kubernetes亏跟踪Pod中每个容器的状态,就像它跟踪Pod总体上的阶段一样。我们可以使用容器生命周期回调来在容器生命周期中的特定时间点触发事件。

一旦调度器将Pod分配给某个节点,kubelet就通过容器运行时开始为Pod创建容器。容器的状态有三种,分别是:Waiting(等待),Running(运行中)和Terminated(已终止)。

要检查Pod中容器的状态,可以使用以下命令:

kubectl describe pod <pod 名称> -n namespace

这个输出的信息中包含Pod中每个容器的状态

每种状态的-含义:

  • Waiting(等待)
    如果容器并不处在Running或者Terminated状态之一,他就处在Waiting状态,处于Waiting状态的容器仍在运行它完成启动所需要的操作。例如:从某个容器镜像仓库拉取容器镜像,或者向容器应用Secret数据等。使用kubectl来查询包含Wating状态的容器的Pod时,会得到一个Reason字段,其中给出了容器处于等待状态的原因。
  • Running(运行中)
    Running状态表明容器正在执行状态并且没有发生什么意外。如果配置了postStart回调,那么该回调已经执行完毕。使用kubectl来查询包含Running状态的容器的Pod时,也可以看到关于容器进入Running状态的信息。
  • Terminated(已终止)
    处于Terminated状态的容器已经开始执行并且正常结束或因为某些原因失败。使用kubectl查询包含Terminated状态的容器的Pod时,可以看到容器进入此状态的原因,推出代码以及容器执行期间的起止时间。
    如果容器配置了preStop回调,则该回调会在容器进入Terminated状态之前执行完毕。

5、容器重启策略

Pod的spec中包含一个restartPolicy字段,其可能取值包括Always, Onfailure, Never,默认值是Always

restartPlociy适用于Pod中所有的容器。restartPolicy仅针对同一节点上kubelet的 容器重启动作,当Pod中容器退出时,kubelet会按照指数回退方式计算重启的延时(10s, 20s, 40s…),最长时延为5min。一旦某容器执行了10min并且没有出现问题,kubelet对该容器的重启回退计时器执行重置操作。

6、pod状况

Pod有一个PodStatus对象,其中包括一个PodConditions数组。
kubelet管理以下PodCondition:

  • PodScheduled:Pod已经被调度到某节点
  • PodReadyToStartContainers:Pod沙箱被成功创建并且配置了网络(Alpha特性,必须被显式启用)
  • ContainersReady:Pod中所有容器已经就绪
  • Initialized:所有的init容器都已成功完成
  • Ready:Pod可以为请求提供服务,并且应该被添加到对应服务的负载均衡池
字段名称描述
typePod状况的名称
lastProbeTime上次探测Pod状况时的时间戳
lastTransitionTimePod上次从一种状态转换到另一种状态时的时间戳
reason机器可读的、驼峰编码的文字,表述上次状况变化的原因
message人可读的消息,给出上次状态转换的详细信息

6.1 Pod就绪态

可以向PodStatus中注入额外的反或者信号:PodReadiness(Pod就绪态),要使用这一特性,可以设置pod规约中的readinessGates列表,为kubelet提供一组额外的状况供其评估Pod就绪态时使用

就绪态门控基于Pod的status.conditions字段的当前值来做决定。如果kubernetes无法在status.conditions字段中找到某状况,则该状况的状态值默认为False

e.g

kind: Pod
...
spec:
  readinessGates:
    - conditionType: "www.example.com/feature-1"
status:
  conditions:
    - type: Ready                              # 内置的 Pod 状况
      status: "False"
      lastProbeTime: null
      lastTransitionTime: 2018-01-01T00:00:00Z
    - type: "www.example.com/feature-1"        # 额外的 Pod 状况
      status: "False"
      lastProbeTime: null
      lastTransitionTime: 2018-01-01T00:00:00Z
  containerStatuses:
    - containerID: docker://abcd...
      ready: true
...

6.2 Pod就绪态的状态

命令 kubectl patch不支持修改对象的状态。如果需要设置Pod的status.conditions, 应用或操作者需要使用PATCH操作,可以使用kubernetes客户端库之一来编写代码,针对Pod就绪态设置定制的Pod状况。

对于使用定制状况的Pod而言,只有当下面所说的都适用时,该Pod才会被评估为就绪:

  • Pod中所有容器都已就绪
  • readinessGates中的所有状况都为True值

当Pod的容器都已就绪,但至少一个定制状况没有取值或者取值为False,kubelet将Pod的状况设置为ContainersReady

6.3 Pod网络就绪

在Pod被调度到某节点之后,他需要被kubelet接受并且挂载所需要的卷。一旦这些阶段完成,kubelet将与容器进行时(使用容器进行时接口【Container Runtime Interface; CRI】)一起为Pod生成运行时沙箱并配置网络。

如果启用了PodReadyToStartContainersCondition特性门控,kubelet会通过Pod的status.conditions字段中的PodReadyToStartContainers状况来报告Pod是否达到了初始化里程碑。

当kubelet 监测到Pod不具备配置了网络的运行时沙箱时,PodReadyToStartContainers状况将被设置为False,在以下场景中将会发生这种情况:

  • 在Pod生命周期的早期阶段,kubelet还没有开始使用容器运行时为Pod设置沙箱
  • 在Pod生命周期的末期阶段,Pod的沙箱由于某些原因被销毁时:
      节点重启时Pod没有被驱逐
      对于使用虚拟机进行隔离的 容器进行时,Pod沙箱虚拟机重启时,需要创建一个新的沙箱和全新的容器网络配置。

在运行时插件成功完成Pod的沙箱创建和网络配置后,kubelet会将PodReadyToStartContainers状况设置为True,此时kubelet可以开始拉取容器镜像和创建容器。

对于带有init容器的Pod,kubelet会在init容器成功完成后将 Initialized状况设置为True(这发生在运行时成功创建沙箱和网络配置之后),对于没有Init容器的Pod,kubelet会在创建沙箱和网络配置之前Initialized状况设置为True

7、容器探针

probe是由kubelet对容器执行的定期诊断。要执行诊断,kubelet既可以在容器内执行代码,也可以发出一个网络请求

7.1 检查机制

使用探针来检查容器有四种不同的方法。每个探针都必须定义为这四种机制中的一种:

  • exec
    在容器内执行指定的命令。如果命令退出时返回码为0则认为诊断成功。
  • grpc
    使用gRPC执行一个远程过程调用。目标应该实现gRPC健康检查。如果响应状态是SERVING,则认为诊断成功
  • httpGet
    对容器的IP地址上指定端口和路径执行HTTP GET 请求,如果响应的状态码大于等于200且小于400,则诊断被认为是成功的。
  • tcpSocket
    对容器的IP地址上的指定端口执行TCP检查。如果端口打开,则诊断被认为是成功的。如果远程系统(容器)在打开连接后立即将其关闭,这算做是健康的。

注意:

  • 和其他机制不同,exec探针的实现涉及每次执行时创建/复制多个进程。因此在集群中具有较高的Pod密度、较低的initialDelaySecondsperiodSeconds时长的时候,配置任何使用exec机制的探针可能会增加节点的CPU负载。在这种场景下,优先考虑使用其他探针机制以避免额外的开销

7.2 探测结果

每次的探测结果都是下面其中之一

  • Success(成功):容器通过了诊断
  • Failure(失败):容器未通过诊断
  • Unknown(未知):诊断失败,因此不会采取任何行动

7.3 探测类型

针对运行中的容器,kubelet可以选择是否执行以下三种探针,以及如何针对探测结果做出反应。

  1. livenessProbe
    指示容器是否在正运行。如果存活态探测失败,则kubelet会杀死容器,并且容器会根据其重启策略决定接下来的动作。如果容器不提供存活探针,则默认状态为Success
  2. readinessProbe
    指示容器是否准备好为请求提供服务。如果就绪态探测失败,端点控制器将从Pod匹配的所有服务的端点列表中删除该Pod的IP地址。初始延迟之前的就绪态的状态值默认为Failure。如果容器不提供就绪态探针,则默认状态为Success
  3. startupProbe
    指示容器中的应用是否已经启动。如果提供了启动探针,则所有其他探针都会被禁用,直到此探针成功为止。如果启动探测失败,kubelet将杀死容器,而容器依照其重启策略进行重启,如果容器没有提供启动探测,则默认状态为Success
  • 何时使用存活态探针
    如果容器中的进程能够在遇到问题或不健康的情况下自行崩溃,不一定需要存活态探针,kubelet将根据Pod的restartPolicy自动执行修复操作
    如果希望 容器在探测失败时被杀死并且重新启动那么可以指定一个存活态探针,并指定restartPolicyAlways或者OnFailure

  • 何时使用就绪态探针
    1、如果要仅在 探测成功时 才开始向Pod发送 请求流量,此时使用就绪态探针。在这种情况下,就绪态探针可能和存活态探针相同,但是规约中就绪态探针的存在意味着Pod将在启动阶段不接收任何数据,并且只有在探针探测成功后才开始接收数据。
    2、如果希望容器能自动进入维护状态,也可以指定一个就绪态探针,检查某个特定于就绪态的因此不同于存活态的端点。
    3、如果应用程序对后端服务有严格的依赖性,可以同时实现存活态和就绪态探针当应用程序本身是健康的,存活态探针检测通过后,就绪态探针会额外检查每个所需的后端服务是否可用。这可以帮助我们避免将流量导向只能返回错误信息的Pod。
    4、如果只是想在Pod被删除时能够排空请求,则不一定需要使用就绪态探针;在删除Pod时,Pod会自动将自身置于未就绪状态,无论就绪态探针是否存在。等待Pod中的容器停止期间,Pod会一直处于未就绪状态。

  • 何时使用启动探针
    对于所包含的容器需要较长时间才能启动就绪的Pod而言,启动探针是有用的。我们不再需要配置一个较长的存活态探测时间间隔,只需要设置另一个独立的配置选定,对启动期间的容器执行探测,从而允许使用远远超出存活态时间间隔所允许的时长。
    通常来说,如果一个容器的启动时间超过 initialDelaySeconds + failureThreshold * periodSeconds总值,那么就应该设置一个启动探测,对存活态探针所使用的同一端点进行检查。periodSeconds的默认时间是10秒,我们应该将failureThreshold设置的足够高,以便容器有充足的时间完成启动,并且避免更改存活态探针所使用的的默认值。这一设置有助于减少死锁状况的发生。

8、Pod的终止

由于Pod所代表的的是 在集群中节点上运行的进程。当不再需要这些进程时,体面的终止是很有必要的。一般不应该武断的使用kill信号终止他们,导致这些进程没有机会完成清理工作

设计的目标是让我们能够请求删除进程,并且知道进程何时被终止,同时也能够确保删除工作终将能完成。当我们请求删除某个 Pod时,集群会记录并跟踪Pod的体面终止周期,而不是直接强制的杀死Pod。

通常Pod体面终止的过程为:

  1. kubelet先发送一个带有体面超时期限的TERM(又名SIGTERM)信号到每个容器的主进程,将请求发送到容器运行时来尝试停止Pod中的容器。
  2. 停止容器的这些请求由容器运行时以异步方式处理,这些请求的处理顺序无法被保证
  3. 许多容器运行时遵循**容器镜像内定义的STOPSIGNAL**值,如果不同,则发送容器镜像中配置的STOPSIGNAL而不是TERM信号。
  4. 一旦超出了体面终止期限,容器运行时会向所有剩余进程发送KILL信号,之后Pod就会被从API服务器上移除
  5. 如果kubelet或容器运行时的管理服务在等待进程终止期间被重启,集群会从头开始重试,赋予Pod完整的体面终止期限。

下面是一个例子:

  1. 使用kubectl工具手动的删除某个Pod,该Pod的体面终止期限默认值是30秒。
  2. API服务器中的Pod对象被更新,记录涵盖体面终止期限在内的Pod的最终死期,超出所计算的时间点则认为Pod已死(dead),如果使用kubectl describe来检查正在删除的Pod,该Pod会显示为Terminating(正在终止)。在Pod所运行的节点上,kubelet 一旦看到Pod被标记为正在终止(已经设置了体面终止期限),kubelet即开始本地的Pod关闭流程。
      1、如果Pod中的容器之一定义了preStop回调,kubelet开始在容器内运行该回调逻辑。如果在超出体面终止期限时,preStop回调逻辑仍在运行,kubelet会请求给与该Pod的宽限期,一次性增加两秒钟。
       如果 preStop 回调所需要的时间长于默认的体面终止限期,你必须修改 terminationGracePeriodSeconds 属性值来使其正常工作。
      2、kubelet 接下来触发容器运行时发送 TERM 信号给每个容器中的进程 1;Pod 中的容器会在不同时刻收到 TERM 信号,接收顺序也是不确定的。如果关闭的顺序很重要,可以考虑使用 preStop 回调逻辑来协调。
  3. 在kubelet启动Pod的体面关闭逻辑的同时,控制平面会评估是否将关闭的Pod从对应的EndpointSlice对象中移除,过滤条件是:Pod被对应的服务以某选择算符选定。ReplicaSet和其他工作负载资源不再将关闭进程中的Pod视为合法的、能够提供服务的副本。

  关闭动作很慢的Pod不应继续处理常规服务请求,而应该开始终止并完成对打开的连接的处理。一些应用程序不仅需要完成对打开的连接的处理,还需要更进一步的体面终止逻辑,比如:排空和完成会话

  任何正在终止的Pod所对应的端点都不会立即从EndpointSlice中被删除,EndpointSlice API(以及传统的 Endpoints API)会公开一个状态来指示其处于 终止状态。 正在终止的端点始终将其 ready 状态设置为 false(为了向后兼容 1.26 之前的版本), 因此负载均衡器不会将其用于常规流量。

8.1 强制终止Pod

默认情况下,所有的删除操作都会附有 30 秒钟的宽限期限。 kubectl delete 命令支持 --grace-period=<seconds> 选项,允许你重载默认值, 设定自己希望的期限值。

将宽限期限强制设置为 0 意味着立即从 API 服务器删除 Pod。 如果 Pod 仍然运行于某节点上,强制删除操作会触发 kubelet 立即执行清理操作。

注意:

  • 必须在设置 --grace-period=0 的同时额外设置 --force 参数才能发起强制删除请求。

执行强制删除操作时,API 服务器不再等待来自 kubelet 的、关于 Pod 已经在原来运行的节点上终止执行的确认消息。 API 服务器直接删除 Pod 对象,这样新的与之同名的 Pod 即可以被创建。 在节点侧,被设置为立即终止的 Pod 仍然会在被强行杀死之前获得一点点的宽限时间

8.2 Pod的垃圾收集

对于已失败的 Pod 而言,对应的 API 对象仍然会保留在集群的 API 服务器上, 直到用户或者控制器进程显式地将其删除。

Pod 的垃圾收集器(PodGC)是控制平面的控制器,它会在 Pod 个数超出所配置的阈值 (根据 kube-controller-managerterminated-pod-gc-threshold 设置)时删除已终止的 Pod(阶段值为 Succeeded 或 Failed)。 这一行为会避免随着时间演进不断创建和终止 Pod 而引起的资源泄露问题。

此外,PodGC 会清理满足以下任一条件的所有 Pod:

  • 孤儿 Pod - 绑定到不再存在的节点,
  • 计划外终止的 Pod
  • 终止过程中的 Pod,当启用 NodeOutOfServiceVolumeDetach 特性门控时, 绑定到有 node.kubernetes.io/out-of-service 污点的未就绪节点。

若启用 PodDisruptionConditions 特性门控,在清理 Pod 的同时, 如果它们处于非终止状态阶段,PodGC 也会将它们标记为失败。 此外,PodGC 在清理孤儿 Pod 时会添加 Pod 干扰状况

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

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

相关文章

matlab中的mapminmax函数初步理解和应用

matlab中的mapminmax函数初步认识 一、mapminmax 顾名思义&#xff1a;映射最大最小 二、语法及举例 2.1 语法1 [Y,PS] mapminmax(X) 将矩阵X映射形成矩阵Y, Y中每行中的最小值对应-1&#xff0c;最大值对应1。PS是一个包含映射信息的结构体。 举例&#xff1a; clc cle…

4.第一个Java程序的讲解—Hello World

本文将写一个程序输出 Hello World &#xff0c;然后逐句讲解 ~ 文章目录 一、输出 Hello World二、代码讲解2.1 package com.goole.demo;2.1.1 .idea、out、src2.1.2 解释 2.2 public class Main2.2.1 解释2.2.2 创建新类 2.3 public static void main(String[] args)2.3.1 解…

测试用例的设计方法(全):判定表驱动分析方法

目录 判定表驱动分析方法 一. 方法简介 二. 实战演习 判定表驱动分析方法 一. 方法简介 1.定义&#xff1a;判定表是分析和表达多逻辑条件下执行不同操作的情况的工具。 2.判定表的优点 能够将复杂的问题按照各种可能的情况全部列举出来&#xff0c;简明并避免遗漏。因此…

找不到d3dx9_43.dll如何修复?d3dx9_43.dll丢失的解决办法分享

在电脑使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是“找不到d3dx9_43.dll”。这个错误通常出现在运行某些游戏或应用程序时&#xff0c;它会导致程序无法正常运行。那么&#xff0c;如何解决找不到d3dx9_43.dll的问题呢&#xff1f;下面我将分享…

贰[2],QT异常处理

1&#xff0c;异常&#xff1a;QT编译警告 warning LNK4042: 对象被多次指定&#xff1b;已忽略多余的指定 处理办法&#xff0c;检查.pri文件&#xff0c;是否关联了多个相同的文件(头文件.h/源文件.cpp) 2&#xff0c;异常&#xff1a;C4819: 该文件包含不能在当前代码页(936…

FreeRTOS_任务通知

目录 1. 任务通知简介 2. 发送任务通知 2.1 函数 xTaskNotify() 2.2 函数 xTaskNotifyFromISR() 2.3 函数 xTaskNotifyGive() 2.4 函数 vTaskNotifyGiveFromISR() 2.5 函数 xTaskNotifyAndQuery() 2.6 函数 xTaskNotifyAndQueryFromISR() 3. 任务通知通用发送函数 3.…

85.x的平方根(力扣)

目录 问题描述 代码解决以及思想 知识点 问题描述 代码解决以及思想 class Solution { public:int mySqrt(int x) {int left 0; // 定义左边界int right x; // 定义右边界&#xff0c;初始值取 xwhile (left < right) { // 当左边界小于或等于…

CC1101 一款低功耗sub- 1ghz收发器芯片 适用于无线遥控智能家居

产品描述 CC1101是一个低成本的sub- 1ghz收发器,专为极低功耗的无线应用而设计。 该电路主要用于工业、科学和医学)和SRD (Short Range Device)频带,在315,433,868和915兆赫&#xff0c;但可以轻松可编程用于其他操作频率在300-348 MHz、387-464 MHz,以及779-928 MHz频段。射…

【网络管理——操作系统与安全】

文章目录 一、安装WindowsServer操作系统1、新建虚拟机2、进入Windows虚拟机进行相关配置 二、Windows用户账户管理与配置1、创建用户账户2、创建用户组 三、Windows操作系统的本地安全策略设置1、配置用户账户密码策略2、配置用户账户锁定策略3、配置组策略安全选项4、配置审核…

CSDN每日一题学习训练——Java版(两数相加、二叉树的锯齿形层序遍历、解数独)

版本说明 当前版本号[20231106]。 版本修改说明20231106初版 目录 文章目录 版本说明目录两数相加题目解题思路代码思路补充说明参考代码 二叉树的锯齿形层序遍历题目解题思路代码思路参考代码 解数独题目解题思路代码思路补充说明参考代码 两数相加 题目 给你两个 非空 的…

代码随想录算法训练营第四十四天丨 动态规划part07

70. 爬楼梯 思路 这次讲到了背包问题 这道题目 我们在动态规划&#xff1a;爬楼梯 (opens new window)中已经讲过一次了&#xff0c;原题其实是一道简单动规的题目。 既然这么简单为什么还要讲呢&#xff0c;其实本题稍加改动就是一道面试好题。 改为&#xff1a;一步一个…

如果你们团队想提升剪辑效率,这个批量剪辑神器不可错过

实话实说&#xff0c;现在市场上批量剪辑视频的软件真的特别多&#xff0c;但是其实仔细了解下&#xff0c;会发现功能都是大差不差&#xff0c;但又有一些细微的差别&#xff0c;让人难以抉择。 今天给大家推荐一款个人觉得性价比很高的软件——超级编导。 首先&#xff0c;…

基于MSF控制同一热点(局域网)下的其他设备

主要是基于Metasploit&#xff0c;利于msfvenom生成的恶意软件获取目标shell。 我想各位都很熟悉的一个操作&#xff0c;那就是使用虚拟机当攻击机&#xff0c;本地物理机作为靶机&#xff0c;但这样其实并不能很好的反应出现实情况&#xff0c;有点自己攻击自己的感觉。 因此…

【C/C++笔试练习】内联函数、哪些运算符不能重载、拷贝构造函数、const类型、函数重载、构造函数、空类的大小、井字棋、密码强度等级

文章目录 C/C笔试练习选择部分&#xff08;1&#xff09;内联函数&#xff08;2&#xff09;哪些运算符不能重载&#xff08;3&#xff09;拷贝构造函数&#xff08;4&#xff09;const类型&#xff08;5&#xff09;函数重载&#xff08;6&#xff09;构造函数&#xff08;7&a…

第八章:security testing

文章目录 Security Testingbuffer overflow 的例子Fuzzing 测试Random Testing好处坏处Mutation-based Fuzzing好处坏处Generation-based Fuzzing好处坏处Memory DebuggerUndefined Behaviors (未定义行为)Security Testing 渗透测试(或称为pentesting)是指攻击软件以寻找安…

047_第三代软件开发-日志分离

第三代软件开发-日志分离 文章目录 第三代软件开发-日志分离项目介绍日志分离用法 关键字&#xff1a; Qt、 Qml、 log、 日志、 分离 项目介绍 欢迎来到我们的 QML & C 项目&#xff01;这个项目结合了 QML&#xff08;Qt Meta-Object Language&#xff09;和 C 的强…

uniapp使用技巧及例子

前言 uniapp&#xff08;Universal Application&#xff09;是一种基于Vue.js的全端解决方案&#xff0c;允许开发者使用一套代码构建多个平台的应用程序。这些平台包括iOS、Android、H5、微信小程序、支付宝小程序等。uniapp的出现解决了跨平台开发的痛点&#xff0c;大大减少…

祝贺璞华大数据产品入选中国信通院“铸基计划”

武汉璞华大数据技术有限公司HawkEye设备数字化管理平台产品&#xff0c;凭借优秀的产品技术能力&#xff0c;通过评估后&#xff0c;入选中国信通院“铸基计划”《高质量数字化转型产品及服务全景图(2023&#xff09;》的工业数字化领域。 “铸基计划”是中国信通院推出的高质量…

轻量封装WebGPU渲染系统示例<20>- 美化一下元胞自动机(源码)

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/rendering/src/voxgpu/sample/GameOfLifePretty.ts 系统特性: 1. 用户态与系统态隔离。 2. 高频调用与低频调用隔离。 3. 面向用户的易用性封装。 4. 渲染数据(内外部相关资源)和渲染机制分离…