Kubelet 核心指标监控

news2024/11/15 12:58:00

How to Monitor the Kubelet | Sysdig

Kubernetes / Kubelet | Grafana Labs

https://github.com/flashcatcloud/categraf/blob/main/inputs/kubelet/dashboard-by-ident.json

在生产环境中运行 Kubernetes 时,监控 Kubelet 至关重要。Kubelet 是 Kubernetes 集群中非常重要的服务。

此 Kubernetes 组件负责确保 Pod 中定义的容器正常运行。一旦调度程序指定一个节点来运行 Pod,Kubelet 就会接受分配并运行 Pod 及其工作负载。

如何监控 Kubelet 特色图片

如果遇到 Kubernetes Kubelet 的问题,那么采取行动并尽快解决问题非常重要,否则 Kubernetes 节点将进入一种NotReady状态。借助其开箱即用的指标工具,您可以监控 Kubelet,但有大量指标!您应该查看其中哪些?

如果您想了解有关如何监控 Kubelet 以及最重要的 Kubelet 指标的更多信息,请继续阅读并了解如何做好准备以避免中断。

什么是 Kubelet?

Kubernetes Kubelet 在控制平面和工作节点中运行,作为所有节点的主节点代理。

在此图中,您可以轻松找到 Kubelet 的运行位置。它是在控制平面和工作节点中运行的组件。

Kubelet 以声明方式工作,接收 PodSpecs 并确保其中定义的容器当前正在运行且处于健康状态。就其本质而言,它是在操作系统本身中作为服务运行的代理,与集群中作为 Kubernetes 实体运行的其他组件非常不同。

Kubelet 服务需要永久启动并运行。这样一旦 Pod 被安排在特定节点中运行,它就能够从 Kubernetes API 获取任何新的 PodSpec 定义。如果 Kubelet 无法正常工作、崩溃或因任何原因关闭,Kubernetes 节点将进入一种NotReady状态,并且不会在该节点上创建新的 Pod。

当 Kubelet 宕机或无法正常工作时,需要考虑的另一件重要事情是:无论是探测Liveness还是Readiness执行都不会被执行,因此如果在 Kubelet 宕机时 Pod 上已经运行的工作负载开始出现故障或无法正常工作,它将不会重新启动,从而对此类应用程序的稳定性、可用性和性能造成影响。

如何监控 Kubelet

Prometheus节点角色为每个集群节点发现一个目标,其地址默认为 Kubelet 的 HTTP 端口,因此您仍然可以依赖此 Prometheus 角色从您的 Prometheus 实例中抓取 Kubelet 指标。

Kubelet 已进行检测,并默认通过端口 10250 公开 /metrics 端点,提供有关 Pod 卷和内部操作的信息。该端点很容易被抓取,您只需使用所需的证书通过 HTTPS 协议访问该端点即可。

为了获取 Kubelet 指标、访问节点本身或通过 ssh 进入 Pod,此服务正在监听0.0.0.0地址,因此在连接方面没有任何限制。如果 Pod 可以访问主机网络,您localhost也可以使用它来访问它。

<span style="background-color:var(--wp--preset--color--gray-70)"><span style="color:var(--wp--preset--color--white)"><code class="language-perl">$ curl -k -H <span style="color:#ffffff">"Authorization: Bearer $(cat /var/run/secrets/kubernetes.io/serviceaccount/token)"</span> https:<span style="color:#bc6060">//</span><span style="color:#880000">192.168</span>.<span style="color:#880000">119.30</span>:<span style="color:#880000">10250</span>/metrics
<span style="color:#77b755"># HELP apiserver_audit_event_total [ALPHA] Counter of audit events generated and sent to the audit backend.</span>
<span style="color:#77b755"># TYPE apiserver_audit_event_total counter</span>
apiserver_audit_event_total <span style="color:#880000">0</span>
<span style="color:#77b755"># HELP apiserver_audit_requests_rejected_total [ALPHA] Counter of apiserver requests rejected due to an error in audit logging backend.</span>
<span style="color:#77b755"># TYPE apiserver_audit_requests_rejected_total counter</span>
apiserver_audit_requests_rejected_total <span style="color:#880000">0</span>
<span style="color:#77b755"># HELP apiserver_client_certificate_expiration_seconds [ALPHA] Distribution of the remaining lifetime on the certificate used to authenticate a request.</span>
<span style="color:#77b755"># TYPE apiserver_client_certificate_expiration_seconds histogram</span>
apiserver_client_certificate_expiration_seconds_bucket{le=<span style="color:#ffffff">"0"</span>} <span style="color:#880000">0</span>
apiserver_client_certificate_expiration_seconds_bucket{le=<span style="color:#ffffff">"1800"</span>} <span style="color:#880000">0</span>

(output truncated)</code>代码语言: Perl  (perl )</span></span>

如果您希望 Prometheus 实例抓取 Kubelet 指标端点,您只需将以下配置添加到配置文件scrape_configs中的部分prometheus.yml

    - bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
      job_name: kubernetes-nodes
      kubernetes_sd_configs:
      - role: node
      relabel_configs:
      - action: labelmap
        regex: __meta_kubernetes_node_label_(.+)
      - replacement: kubernetes.default.svc:443
        target_label: __address__
      - regex: (.+)
        replacement: /api/v1/nodes/$1/proxy/metrics
        source_labels:
        - __meta_kubernetes_node_name
        target_label: __metrics_path__
      scheme: https
      tls_config:
        ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        insecure_skip_verify: true

然后应用新的配置并重新创建prometheus-serverPod。

$ kubectl replace -f prometheus-server.yaml -n monitoring
$ kubectl delete pod prometheus-server-5df7b6d9bb-m2d27 -n monitoring

现在,您将看到 Prometheus 实例中可用的 Kubelet 指标。

监控 Kubelet:您应该检查哪些指标?

您已启动并运行 Prometheus 实例,并已配置为抓取 Kubelet 指标。那么,下一步是什么?

让我们来讨论一下您应该监控的关键 Kubelet 指标。免责声明:不同 Kubernetes 版本之间的Kubelet 指标可能有所不同。这里我们使用了 Kubernetes 1.25。您可以在Kubernetes GitHub repo中查看 Kubelet 的最新可用指标。

  • Number of Kubelet instances:在这里,您将找到一种轻松计算 Kubernetes 集群中运行的 Kubelet 实例数量的方法。只需对kubelet_node_name指标求和即可。此 PromQL 查询的预期值是集群的节点数。
    sum(kubelet_node_name)

    计算节点数量的另一种方法Ready是:注意:如果要获取未就绪节点的数量,请按 进行过滤status="false"

    sum(kube_node_status_condition{condition="Ready", status="true"})
  • kubelet_running_pods:Kubelet 可让您了解节点中运行的 Pod 数量。定期检查此值并测量是否达到每个节点的 Pod 限制,或者这些数字是否在 Kubernetes 集群的预期范围内。
# HELP kubelet_running_pods [ALPHA] Number of pods that have a running pod sandbox
# TYPE kubelet_running_pods gauge
kubelet_running_pods 12
  •  kubelet_running_containers:此指标与上一个指标非常相似,但它计算每个节点中的容器数量。信息分为三个不同的部分container_state:已创建、已退出和正在运行。使用此指标可以更好地了解每个节点中运行的容器数量,并根据您的设置衡量容器数量是否符合您的预期。
# HELP kubelet_running_containers [ALPHA] Number of containers currently running
# TYPE kubelet_running_containers gauge
kubelet_running_containers{container_state="created"} 1
kubelet_running_containers{container_state="exited"} 18
kubelet_running_containers{container_state="running"} 14
  •  volume_manager_total_volumes:Kubelet 会挂载控制器指示的卷,因此它可以提供有关它们的信息。此指标可用于识别和诊断创建 Pod 时未挂载的卷的问题。每个 plugin_name 提供两个不同的状态字段:desired_state_of_world 和 actual_state_of_world。这样,如果您混合使用这两个值,就可以轻松查找差异。
# HELP volume_manager_total_volumes [ALPHA] 卷管理器中的卷数
# 类型volume_manager_total_volumes 仪表
volume_manager_total_volumes{plugin_name="kubernetes.io/configmap",state="actual_state_of_world"} 5
volume_manager_total_volumes{plugin_name="kubernetes.io/configmap",state="desired_state_of_world"} 5
volume_manager_total_volumes{plugin_name="kubernetes.io/downward-api",state="actual_state_of_world"} 1
volume_manager_total_volumes{plugin_name="kubernetes.io/downward-api",state="desired_state_of_world"} 1
volume_manager_total_volumes{plugin_name="kubernetes.io/empty-dir",state="actual_state_of_world"} 2
volume_manager_total_volumes{plugin_name="kubernetes.io/empty-dir",state="desired_state_of_world"} 2
volume_manager_total_volumes{plugin_name="kubernetes.io/host-path",state="actual_state_of_world"} 45
volume_manager_total_volumes{plugin_name="kubernetes.io/host-path",state="desired_state_of_world"} 45
volume_manager_total_volumes{plugin_name="kubernetes.io/projected",state="actual_state_of_world"} 8
volume_manager_total_volumes{plugin_name="kubernetes.io/projected",state="desired_state_of_world"} 8
volume_manager_total_volumes{plugin_name="kubernetes.io/secret",state="actual_state_of_world"} 3
volume_manager_total_volumes{plugin_name="kubernetes.io/secret",state="desired_state_of_world"} 3

Actual Volume Count:

sum(volume_manager_total_volumes{cluster="$cluster", job="k8s-kubelet", instance=~"$instance", state="actual_state_of_world"}) 

Desired Volume Count:

sum(volume_manager_total_volumes{cluster="$cluster", job="k8s-kubelet", instance=~"$instance",state="desired_state_of_world"})

接下来,您将看到Kubelet 执行的每个操作的黄金信号指标kubelet_runtime_operations_total, kubelet_runtime_operations_errors_total( 、 和kubelet_runtime_operations_duration_seconds_bucket)。另一方面,可以使用一些可用的系统指标来衡量 Kubelet 的饱和度。

kubelet_runtime_operations_total:此指标提供每种类型(container_status、create_container、exec、exec_sync、image_status、list_containers、list_images、list_podsandbox、remove_container 等)运行时操作总数。

<span style="color:#1e1e22"># HELP kubelet_runtime_operations_total [ALPHA] 按操作类型累计的运行时操作数。
# 类型 kubelet_runtime_operations_total 计数器
kubelet_runtime_operations_total{operation_type="container_status"} 744
kubelet_runtime_operations_total{operation_type="create_container"} 33
kubelet_runtime_operations_total{operation_type="exec"} 3
kubelet_runtime_operations_total{operation_type="exec_sync"} 1816
kubelet_runtime_operations_total{operation_type="image_status"} 97
kubelet_runtime_operations_total{operation_type="list_containers"} 16929
kubelet_runtime_operations_total{operation_type="list_images"} 334
kubelet_runtime_operations_total{operation_type="list_podsandbox"} 16777
kubelet_runtime_operations_total{operation_type="podsandbox_status"} 308
kubelet_runtime_operations_total{operation_type="remove_container"} 57
kubelet_runtime_operations_total{operation_type="remove_podsandbox"} 18
kubelet_runtime_operations_total{operation_type="start_container"} 33
kubelet_runtime_operations_total{operation_type="status"} 1816
kubelet_runtime_operations_total{operation_type="stop_container"} 11
kubelet_runtime_operations_total{operation_type="stop_podsandbox"} 36
kubelet_runtime_operations_total{operation_type="update_runtime_config"} 1
kubelet_runtime_operations_total{operation_type="version"} 892</span>

这是一个计数器指标,您可以使用 rate 函数来计算 Kubelet 运行时操作的平均增长率。 

sum(rate(kubelet_runtime_operations_total{job="kubernetes-nodes"}[5m])) by (operation_type, instance)

  • kubelet_runtime_operations_errors_total运行时级别的操作错误数。它可以很好地指示节点中的低级问题,例如容器运行时的问题。与上一个指标一样,kubelet_runtime_operation_errors_total它是一个计数器,您可以使用速率函数来测量错误随时间的平均增长。
  • kubelet_runtime_operations_duration_seconds_bucket:该指标测量每个操作的时间。它对于计算百分位数很有用。
# HELP kubelet_runtime_operations_duration_seconds [ALPHA] Duration in seconds of runtime operations. Broken down by operation type.
# TYPE kubelet_runtime_operations_duration_seconds histogram
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.005"} 837
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.0125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.03125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.078125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.1953125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="0.48828125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="1.220703125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="3.0517578125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="7.62939453125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="19.073486328125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="47.6837158203125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="119.20928955078125"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="298.0232238769531"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="745.0580596923828"} 840
kubelet_runtime_operations_duration_seconds_bucket{operation_type="container_status",le="+Inf"} 840
kubelet_runtime_operations_duration_seconds_sum{operation_type="container_status"} 0.4227565899999999

您可能希望按实例和操作类型计算 Kubelet 运行时操作持续时间的第 99 个百分位数。

histogram_quantile(0.99, sum(rate(kubelet_runtime_operations_duration_seconds_bucket{instance=~".*"}[5m])) by (instance, operation_type, le))

以下指标提供有关Pod 启动率及其持续时间的信息。这些指标可以很好地指示容器运行时的问题。

# HELP kubelet_pod_start_duration_seconds [ALPHA] Duration in seconds for a single pod to go from pending to running.
# TYPE kubelet_pod_start_duration_seconds histogram
pod启动时间(从pending到running)分布, kubelet watch到pod时到pod中contianer都running后, watch各种source channel的pod变更

# HELP kubelet_pod_worker_duration_seconds [ALPHA] Duration in seconds to sync a single pod. Broken down by operation type: create, update, or sync
# TYPE kubelet_pod_worker_duration_seconds histogram
pod状态变化的时间分布, 按照操作类型(create update sync)统计, worker就是kubelet中处理一个pod的逻辑工作单位

# HELP kubelet_pod_worker_start_duration_seconds [ALPHA] Duration in seconds from seeing a pod to starting a worker.
# TYPE kubelet_pod_worker_start_duration_seconds histogram
kubelet watch到pod到worker启动的时间分布

kubelet_pod_start_duration_seconds_count:该指标为您提供了Pod 启动操作的数量

# HELP kubelet_pod_start_duration_seconds [ALPHA] 从 kubelet 首次发现 pod 到 pod 开始运行所用的时长(以秒为单位)

# 类型 kubelet_pod_start_duration_seconds 直方图
kubelet_pod_start_duration_seconds_count 14

 kubelet_pod_worker_duration_seconds_count:单个 Pod 的 创建、同步、更新操作的数量。

# HELP kubelet_pod_worker_duration_seconds [ALPHA] 同步单个 pod 的持续时间(秒)。按操作类型细分:创建、更新或同步

# 类型 kubelet_pod_worker_duration_seconds 直方图
kubelet_pod_worker_duration_seconds_count{operation_type="create"} 21
kubelet_pod_worker_duration_seconds_count{operation_type="sync"} 2424
kubelet_pod_worker_duration_seconds_count{operation_type="update"} 3

kubelet_pod_start_duration_seconds_bucket:该指标为您提供了从 Kubelet 第一次看到 Pod 到 Pod 开始运行所用时间(以秒为单位)的直方图。

# HELP kubelet_pod_start_duration_seconds [ALPHA] 从 kubelet 首次发现 pod 到 pod 开始运行所用的时长(以秒为单位)
# 类型 kubelet_pod_start_duration_seconds 直方图
kubelet_pod_start_duration_seconds_bucket{le="0.005"} 6
kubelet_pod_start_duration_seconds_bucket{le="0.01"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.025"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.05"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.1"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.25"} 8
kubelet_pod_start_duration_seconds_bucket{le="0.5"} 8
kubelet_pod_start_duration_seconds_bucket{le="1"} 12
kubelet_pod_start_duration_seconds_bucket{le="2.5"} 14
kubelet_pod_start_duration_seconds_bucket{le="5"} 14
kubelet_pod_start_duration_seconds_bucket{le="10"} 14
kubelet_pod_start_duration_seconds_bucket{le="+Inf"} 14
kubelet_pod_start_duration_seconds_sum 7.106590537999999
kubelet_pod_start_duration_seconds_count 14

您可以按节点获取 Pod 启动持续时间的第 95 百分位数(秒数)。

histogram_quantile(0.95,sum(rate(kubelet_pod_start_duration_seconds_bucket{instance=~".*"}[5m])) by (instance, le))

kubelet_pod_worker_duration_seconds_bucket:此指标提供同步 Pod 所需的时间(以秒为单位)。信息分为三种不同类型:创建、更新和同步。

# HELP kubelet_pod_worker_duration_seconds [ALPHA] 同步单个 pod 的持续时间(秒)。按操作类型细分:创建、更新或同步
# 类型 kubelet_pod_worker_duration_seconds 直方图
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.005"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.01"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.025"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.05"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.1"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.25"} 0
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="0.5"} 4
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="1"} 8
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="2.5"} 9
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="5"} 9
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="10"} 21
kubelet_pod_worker_duration_seconds_bucket{operation_type="create",le="+Inf"} 21
kubelet_pod_worker_duration_seconds_sum{operation_type="create"} 80.867455331
kubelet_pod_worker_duration_seconds_count{operation_type="create"} 21

检查 Kubelet Pod 工作器持续时间指标的百分位数也是值得的,这样您将更好地了解不同操作在所有节点上的执行情况。

histogram_quantile(0.99, sum(rate(kubelet_pod_worker_duration_seconds_bucket{instance=~".*"}[5m])) by (instance, operation_type, le))

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

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

相关文章

自制网络连接工具(支持tcpudp,客户端服务端)

自制网络连接工具&#xff08;支持tcp/udp,客户端/服务端&#xff09; 将网络连接工具制作成共享库 network.h #ifndef NETWORK_H #define NETWORK_H#include<netinet/in.h> #include<sys/socket.h> #include<stdbool.h> typedef struct Network {int type…

AI是否会带来一场认知革命?Reid Hoffman 的独特见解

随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;关于AI对人类社会及认知的影响&#xff0c;已经成为了学术界和业界热议的话题。硅谷著名投资人、LinkedIn联合创始人Reid Hoffman&#xff0c;在斯坦福大学的演讲中分享了他对AI的深刻看法。他认为&#xff0…

系统优化工具 | Windows Manager v2.0.5 便携版

Windows Manager 是一款专为Microsoft Windows 10/11设计的系统优化和管理软件。它集成了多种实用程序&#xff0c;旨在帮助用户更好地管理和优化Windows操作系统。该软件的功能包括系统清理、系统优化、系统修复、硬件信息查看和系统设置调整等。 系统清理&#xff1a;Window…

队列基础概念

文章目录 &#x1f34a;自我介绍&#x1f34a;现实生活中的例子&#x1f34a;队列的介绍&#x1f34a;循环队列&#x1f34a;小结 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我介…

简明linux系统编程--互斥锁--TCP--UDP初识

目录 1.互斥锁 2.信号 2.1介绍 2.2信号的内核机制 3.linux网络编程概述 3.1一览七层协议 3.2一览数据传输过程 3.3四层网络模型 3.4服务端和客户端的数据交互 4.TCP服务端编程 5.TCP客户端编程 6.UDP服务端编程 7.UDP客户端编程 1.互斥锁 互斥锁也是和信号量一样&a…

我与Linux的爱恋:命令行参数|环境变量

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;Linux的学习 文章目录 一.命令行参数二.环境变量1.环境变量的基本概念2.查看环境变量的方法3.环境变量相关命令 一.命令行参数 【示例1】main函数也是函数&#xff0c;main函数可以带参…

Paragon NTFS for Mac和Tuxera NTFS for Mac,那么两种工具有什么区别呢?

我们在使用Mac系统读取U盘的过程中往往会遇到一个问题&#xff0c;那就是U盘插进电脑无法显示&#xff0c;或者只能读取不能编辑。出现这种情况的原因就一般是格式错误。 很多小伙伴在解决这种问题的时候会选择使用U盘读写工具&#xff0c;那么哪一种读写工具比较好呢&#xf…

Windows下利用MSYS2和VS的nmake编译nginx源码

目录 一、使用说明 二、安装软件 2.1 下载依赖库 2.3 下载并安装 StrawberryPerl 2.4 下载并安装 MSYS 2 2.5 nginx源代码下载 三、编译配置 3.1 设置NGX_MSVC_VER 3.2 配置 Makefile 3.3 编译代码 3.4 整理Nginx发布环境 四、错误处理 一、使用说明 本文章主要记…

Hash入门

unordered_set void test_unordered_set() {unordered_set<int> us;us.insert(4);us.insert(2);us.insert(1);us.insert(5);us.insert(6);us.insert(2);us.insert(2);//去重unordered_set<int>::iterator it us.begin();while (it ! us.end()){cout << *it…

​OpenAI最强模型o1系列:开启人工智能推理新时代

前不久OpenAI发布全新模型——o1模型&#xff0c;也就是业界说的“草莓模型”&#xff0c;包含三款型号&#xff1a;OpenAI o1、OpenAI o1-preview和OpenAI o1-mini。 其中&#xff0c;OpenAI o1-mini和 o1-preview已经对用户开放使用&#xff1a; OpenAI o1&#xff1a;高级推…

mysql笔记—sql性能分析

1.查看数据库各个语句的执行频次 show global/session status like ‘com__’ 2.慢查询 默认没有开启&#xff0c;需要手动开启&#xff08;在/etc/my.cnf中开启&#xff09; 开启后在localhost-slow.log中可以查询到慢查询的语句的相关信息&#xff1a; 3.explain 用法&…

<<编码>> 第 16 章 存储器组织(1)--比特锁存器 示例电路

1 比特锁存器 info::操作说明 鼠标单击逻辑输入切换 0|1 状态 就是前面的电平触发的 D 型锁存器. 写入(Write) 就是时钟信号 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch16…

2025年最新大数据毕业设计选题-Hadoop综合项目

选题思路 回忆学过的知识(Python、Java、Hadoop、Hive、Sqoop、Spark、算法等等。。。) 结合学过的知识确定大的方向 a. 确定技术方向&#xff0c;比如基于Hadoop、基于Hive、基于Spark 等等。。。 b. 确定业务方向&#xff0c;比如民宿分析、电商行为分析、天气分析等等。。。…

OpenCV特征检测(6)对初步检测到的角点位置进行亚像素级别的精炼函数cornerSubPix()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 细化角点的位置。 该函数迭代以找到角点或径向鞍点的亚像素级准确位置&#xff0c;如 93中所述&#xff0c;并如下图所示。 亚像素级准确的角点…

TryHackMe 第2天 | Pre Security (上)

该学习路径讲解了网络安全入门的必备技术知识&#xff0c;比如计算机网络、网络协议、Linux命令、Windows设置等内容。本篇博客将记录第一项&#xff1a;计算机网络。 Network Fundamentals What is networking? 网络就是相互连接的事物&#xff0c;我们的人际关系也可以抽…

Liveweb视频汇聚平台支持GB28181转RTMP、HLS、RTSP、FLV格式播放方案

GB28181协议凭借其在安防流媒体行业独有的大统一地位&#xff0c;目前已经在各种安防项目上使用。雪亮工程、幼儿园监控、智慧工地、物流监控等等项目上目前都需要接入安防摄像头或平台进行直播、回放。而GB28181协议作为国家推荐标准&#xff0c;目前基本所有厂家的安防摄像头…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第六集:制作小骑士完整的跳跃落地行为

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、制作一个完整的小骑士跳跃落地行为 1.制作动画以及UNITY编辑器编辑2.使用代码实现完整的跳跃落地行为控制3.更多要考虑到的点总结 前言 大家好久不见&…

【CSS Tricks】如何做一个粒子效果的logo

效果展示 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>粒子效果Logo</title>…

VUE面试题(单页应用及其首屏加载速度慢的问题)

目录 一、单页应用 1.概念 2.单页面应用的优缺点 二、多页面应用&#xff1a; 1.概念 2.区别 三、SPA的实现 1.原理 2.方式&#xff1a; 3.Hash与History模式有什么区别 四、首屏加载速度慢如何优化 1.什么是首屏加载&#xff1f; 2.首屏加载慢的原因 3.如何解决…

OpenCV特征检测(2)边缘检测函数Canny()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 使用 Canny 算法 48在图像中查找边缘。 该函数使用 Canny 算法在输入图像中查找边缘&#xff0c;并在输出地图 edges 中标记它们。在 threshold1…