6.3 k8s的事件event和kube-scheduler中的事件广播器
什么是k8s的events
- k8s的events是向您展示集群内部发生的事情的对象
- 例如调度程序做出了哪些决定
- 或者为什么某些 Pod 从节点中被逐出
哪些组件可以产生events
- 所有核心组件和扩展(操作符)都可以通过 API Server 创建事件
- k8s 多个组件均会产生 event
如何获取event 数据
get events直接获取
[root@k8s-master01 k8s-leaderelection]# kubectl get events -A
NAMESPACE LAST SEEN TYPE REASON OBJECT MESSAGE
injection 3m21s Warning FailedMount pod/alpine01 MountVolume.SetUp failed for volume "nginx-conf" : configmap "nginx-configmap" not found
nginx-injection 32m Normal Pulled pod/test-alpine-inject-01 Container image "alpine" already present on machine
nginx-injection 32m Normal Created pod/test-alpine-inject-01 Created container alpine
nginx-injection 32m Normal Started pod/test-alpine-inject-01 Started container alpine
nginx-injection 27m Normal Pulled pod/test-alpine-inject-02 Container image "alpine" already present on machine
nginx-injection 27m Normal Created pod/test-alpine-inject-02 Created container alpine
nginx-injection 27m Normal Started pod/test-alpine-inject-02 Started container alpine
describe 资源获取
- 比如创建pod时故意将容器的image 仓库名字写错
apiVersion: v1
kind: Pod
metadata:name: nginx-pod-test
spec:containers:- name: nginximage: nginxa:1.8
- 创建之后就可以describe 这个pod获取events,可以看到拉取镜像失败的events
[root@k8s-master01 app]# kubectl describe pod nginx-pod-test
Name: nginx-pod-test
Namespace: default
Priority: 0
Node: k8s-node01/172.20.70.215
Start Time: Wed, 15 Sep 2021 19:13:20 +0800
Labels: <none>
Annotations: cni.projectcalico.org/podIP: 10.100.85.220/32cni.projectcalico.org/podIPs: 10.100.85.220/32
Status: Pending
IP: 10.100.85.220
IPs:IP: 10.100.85.220
Containers:nginx:Container ID: Image: nginxa:1.8Image ID: Port: <none>Host Port: <none>State: WaitingReason: ImagePullBackOffReady: FalseRestart Count: 0Environment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from default-token-k46nh (ro)
Conditions:Type StatusInitialized True Ready False ContainersReady False PodScheduled True
Volumes:default-token-k46nh:Type: Secret (a volume populated by a Secret)SecretName: default-token-k46nhOptional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300snode.kubernetes.io/unreachable:NoExecute op=Exists for 300s
Events:Type Reason Age From Message---- ------ ---- ---- -------Normal Scheduled 2m57s default-scheduler Successfully assigned default/nginx-pod-test to k8s-node01Normal Pulling 67s (x4 over 2m57s) kubelet Pulling image "nginxa:1.8"Warning Failed 63s (x4 over 2m49s) kubelet Failed to pull image "nginxa:1.8": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginxa:1.8": failed to resolve reference "docker.io/library/nginxa:1.8": pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failedWarning Failed 63s (x4 over 2m49s) kubelet Error: ErrImagePullNormal BackOff 50s (x6 over 2m49s) kubelet Back-off pulling image "nginxa:1.8"Warning Failed 39s (x7 over 2m49s) kubelet Error: ImagePullBackOff
Event事件管理机制要有三部分组成
- EventRecorder:是事件生成者,k8s组件通过调用它的方法来生成事件;
- EventBroadcaster:事件广播器,负责消费EventRecorder产生的事件,然后分发给broadcasterWatcher;
- broadcasterWatcher:用于定义事件的处理方式,如上报apiserver;
events保存问题
- Events 量非常大,只能存在一个很短的时间
- Event 一般会通过apiserver暂存在etcd集群中 (最好是单独的etcd集群存储events,和集群业务数据的etcd分开)
- 为避免磁盘空间被填满,故强制执行保留策略:在最后一次的事件发生后,删除1小时之前发生的事件。
event有什么作用
- 可以基于event对k8s集群监控,下面图片来自网络
kube-scheduler中的event解读
EventBroadcaster的初始化
- 在初始化配置的Config中 ,位置 D:\go_path\src\github.com\kubernetes\kubernetes\cmd\kube-scheduler\app\options\options.go
c.EventBroadcaster = events.NewEventBroadcasterAdapter(eventClient)
- new
// NewEventBroadcasterAdapter creates a wrapper around new and legacy broadcasters to simplify
// migration of individual components to the new Event API.
func NewEventBroadcasterAdapter(client clientset.Interface) EventBroadcasterAdapter {eventClient := &eventBroadcasterAdapterImpl{}if _, err := client.Discovery().ServerResourcesForGroupVersion(eventsv1.SchemeGroupVersion.String()); err == nil {eventClient.eventsv1Client = client.EventsV1()eventClient.eventsv1Broadcaster = NewBroadcaster(&EventSinkImpl{Interface: eventClient.eventsv1Client})}// Even though there can soon exist cases when coreBroadcaster won't really be needed,// we create it unconditionally because its overhead is minor and will simplify using usage// patterns of this library in all components.eventClient.coreClient = client.CoreV1()eventClient.coreBroadcaster = record.NewBroadcaster()return eventClient
}
- 底层使用client-go中的eventBroadcasterImpl,位置 D:\go_path\src\github.com\kubernetes\kubernetes\staging\src\k8s.io\client-go\tools\record\event.go
type eventBroadcasterImpl struct {*watch.BroadcastersleepDuration time.Durationoptions CorrelatorOptions
}
eventRecorder初始化
- 初始化scheduler的Setup函数中, 位置 D:\go_path\src\github.com\kubernetes\kubernetes\cmd\kube-scheduler\app\server.go
recorderFactory := getRecorderFactory(&cc)
- recorderFactory代表生成eventRecorder的工厂函数
- 最终使用的是client-go中的recorderImpl ,位置 D:\go_path\src\github.com\kubernetes\kubernetes\staging\src\k8s.io\client-go\tools\events\event_recorder.go
type recorderImpl struct {scheme *runtime.SchemereportingController stringreportingInstance string*watch.Broadcasterclock clock.Clock
}
开启event 事件广播器
- 在scheduler的run中,位置在D:\go_path\src\github.com\kubernetes\kubernetes\cmd\kube-scheduler\app\server.go
// Prepare the event broadcaster.cc.EventBroadcaster.StartRecordingToSink(ctx.Done())
client-go中的StartRecordingToSink解读
// StartRecordingToSink starts sending events received from the specified eventBroadcaster to the given sink.
func (e *eventBroadcasterImpl) StartRecordingToSink(stopCh <-chan struct{}) {go wait.Until(e.refreshExistingEventSeries, refreshTime, stopCh)go wait.Until(e.finishSeries, finishTime, stopCh)e.startRecordingEvents(stopCh)
}
startRecordingEvents解读
- 位置D:\go_path\src\github.com\kubernetes\kubernetes\staging\src\k8s.io\client-go\tools\events\event_broadcaster.go
func (e *eventBroadcasterImpl) startRecordingEvents(stopCh <-chan struct{}) {eventHandler := func(obj runtime.Object) {event, ok := obj.(*eventsv1.Event)if !ok {klog.Errorf("unexpected type, expected eventsv1.Event")return}e.recordToSink(event, clock.RealClock{})}stopWatcher := e.StartEventWatcher(eventHandler)go func() {<-stopChstopWatcher()}()
}
- 启动一个eventHandler,执行recordToSink写入后端存储
- 在StartEventWatcher消费ResultChan队列中的event,传递给eventHandler处理
func (e *eventBroadcasterImpl) StartEventWatcher(eventHandler func(event runtime.Object)) func() {watcher := e.Watch()go func() {defer utilruntime.HandleCrash()for {watchEvent, ok := <-watcher.ResultChan()if !ok {return}eventHandler(watchEvent.Object)}}()return watcher.Stop
}
recordToSink发送逻辑
- 通过getKey生成event 的类型key,作为cache中的标识
func getKey(event *eventsv1.Event) eventKey {key := eventKey{action: event.Action,reason: event.Reason,reportingController: event.ReportingController,regarding: event.Regarding,}if event.Related != nil {key.related = *event.Related}return key
}
- Event.series中记录的是这个event的次数和最近一次的时间
- 用上面的key去eventCache中寻找,如果找到了同时series存在就更新下相关的次数和时间
isomorphicEvent, isIsomorphic := e.eventCache[eventKey]if isIsomorphic {if isomorphicEvent.Series != nil {isomorphicEvent.Series.Count++isomorphicEvent.Series.LastObservedTime = metav1.MicroTime{Time: clock.Now()}return nil}
- 不然的话创建新的并返回
isomorphicEvent.Series = &eventsv1.EventSeries{Count: 1,LastObservedTime: metav1.MicroTime{Time: clock.Now()},}return isomorphicEvent
- 然后用获取到的evToRecord 发送,并更新缓存
if evToRecord != nil {recordedEvent := e.attemptRecording(evToRecord)if recordedEvent != nil {recordedEventKey := getKey(recordedEvent)e.mu.Lock()defer e.mu.Unlock()e.eventCache[recordedEventKey] = recordedEvent}}
- attemptRecording代表带重试发送,底层调用的就是sink的方法,位置D:\go_path\src\github.com\kubernetes\kubernetes\staging\src\k8s.io\client-go\tools\events\interfaces.go
type EventSink interface {Create(event *eventsv1.Event) (*eventsv1.Event, error)Update(event *eventsv1.Event) (*eventsv1.Event, error)Patch(oldEvent *eventsv1.Event, data []byte) (*eventsv1.Event, error)
}
Event.series的作用
- 就像重复的连接不上mysql的错误日志会打很多条一样
- k8s的同一个event也会产生多条,那么去重降噪是有必要的
- 通过 event.Action类型 event.Reason原因 event.ReportingController产生的源等信息组成唯一的key
- 如果cache中有key的记录,那么更新这种event的发生的次数和最近的时间就可以了
- 没必要将全量重复的event发送到存储
kube-scheduler中的调用 eventRecorder产生的事件
eventRecorder对象
- 在scheduler的frameworkImpl中, 位置 D:\go_path\src\github.com\kubernetes\kubernetes\pkg\scheduler\framework\runtime\framework.go
// EventRecorder returns an event recorder.
func (f *frameworkImpl) EventRecorder() events.EventRecorder {return f.eventRecorder
}
scheduler记录调度pod失败的地方
- 位置 D:\go_path\src\github.com\kubernetes\kubernetes\pkg\scheduler\scheduler.go
// recordSchedulingFailure records an event for the pod that indicates the
// pod has failed to schedule. Also, update the pod condition and nominated node name if set.
func (sched *Scheduler) recordSchedulingFailure(fwk framework.Framework, podInfo *framework.QueuedPodInfo, err error, reason string, nominatedNode string) {sched.Error(podInfo, err)// Update the scheduling queue with the nominated pod information. Without// this, there would be a race condition between the next scheduling cycle// and the time the scheduler receives a Pod Update for the nominated pod.// Here we check for nil only for tests.if sched.SchedulingQueue != nil {sched.SchedulingQueue.AddNominatedPod(podInfo.PodInfo, nominatedNode)}pod := podInfo.Podmsg := truncateMessage(err.Error())fwk.EventRecorder().Eventf(pod, nil, v1.EventTypeWarning, "FailedScheduling", "Scheduling", msg)if err := updatePod(sched.client, pod, &v1.PodCondition{Type: v1.PodScheduled,Status: v1.ConditionFalse,Reason: reason,Message: err.Error(),}, nominatedNode); err != nil {klog.ErrorS(err, "Error updating pod", "pod", klog.KObj(pod))}
}
写一个pod的,故意让scheduler调度失败,查看相关的event
- 这里让pod要调度到 disktype=ssd的node上
cat <<EOF> nginx-pod-failed-to-scheduler.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-pod-failed-to-scheduler
spec:containers:- name: nginximage: nginx:1.8nodeSelector:disktype: ssd
EOF
- 创建后获取event ,可以看到调度失败的event
kubectl get event
LAST SEEN TYPE REASON OBJECT MESSAGE
11s Warning FailedScheduling pod/nginx-pod-failed-to-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
11s Warning FailedScheduling pod/nginx-pod-failed-to-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
- 分析下kube-scheduler 记录event的代码
fwk.EventRecorder().Eventf(pod, nil, v1.EventTypeWarning, "FailedScheduling", "Scheduling", msg)
Eventf(regarding runtime.Object, related runtime.Object, eventtype, reason, action, note string, args ...interface{})
- eventf参数和字段分析
- regarding 关注哪种资源的event 这里传入的是pod
- related 还关联哪些资源,这里传入的是nil
- eventtype 代表是warning的还是normal的,这里是v1.EventTypeWarning
- reason 原因 ,这里传入的是 FailedScheduling调度失败
- action 代表执行哪个动作,这里传入的是Scheduling
- note 代表详细信息,这里传入的是错误信息msg
最后给node节点打上 disktype=ssd的标签让pod正常调度
[root@k8s-master01 app]# kubectl get pod
NAME READY STATUS RESTARTS AGE
grafana-d5d85bcd6-f74ch 1/1 Running 0 26d
grafana-d5d85bcd6-l44mx 1/1 Running 0 26d
ink8s-pod-metrics-deployment-85d9795d6-95lsp 1/1 Running 0 23d
nginx-pod 1/1 Running 0 12d
nginx-pod-failed-to-scheduler 0/1 Pending 0 12m
nginx-pod-test 0/1 ImagePullBackOff 0 90m
prometheus-operator-54c4665c6b-7j9jr 1/1 Running 0 13d
sleep-557747455f-w79wf 1/1 Running 0 6d1h
[root@k8s-master01 app]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 162d v1.20.1
k8s-node01 Ready <none> 64d v1.20.1
[root@k8s-master01 app]# kubectl label nodes k8s-node01 disktype=ssd
node/k8s-node01 labeled
[root@k8s-master01 app]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master01 Ready control-plane,master 162d v1.20.1
k8s-node01 Ready <none> 64d v1.20.1
[root@k8s-master01 app]# kubectl get pod
NAME READY STATUS RESTARTS AGE
grafana-d5d85bcd6-f74ch 1/1 Running 0 26d
grafana-d5d85bcd6-l44mx 1/1 Running 0 26d
ink8s-pod-metrics-deployment-85d9795d6-95lsp 1/1 Running 0 23d
nginx-pod 1/1 Running 0 12d
nginx-pod-failed-to-scheduler 1/1 Running 0 13m
nginx-pod-test 0/1 ImagePullBackOff 0 91m
prometheus-operator-54c4665c6b-7j9jr 1/1 Running 0 13d
sleep-557747455f-w79wf 1/1 Running 0 6d1h
- 可以看到pod调度正常也会有相关的event
[root@k8s-master01 app]# kubectl get event
LAST SEEN TYPE REASON OBJECT MESSAGE
13m Warning FailedScheduling pod/nginx-pod-failed-to-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
12m Warning FailedScheduling pod/nginx-pod-failed-to-scheduler 0/2 nodes are available: 1 node(s) didn't match Pod's node affinity, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
13s Normal Scheduled pod/nginx-pod-failed-to-scheduler Successfully assigned default/nginx-pod-failed-to-scheduler to k8s-node01
13s Normal Pulled pod/nginx-pod-failed-to-scheduler Container image "nginx:1.8" already present on machine
13s Normal Created pod/nginx-pod-failed-to-scheduler Created container nginx
13s Normal Started pod/nginx-pod-failed-to-scheduler Started container nginx
96s Normal BackOff pod/nginx-pod-test Back-off pulling image "nginxa:1.8"
51m Warning Failed pod/nginx-pod-test Error: ImagePullBackOff
- 反查正常的eventf源码,位置 D:\go_path\src\github.com\kubernetes\kubernetes\pkg\scheduler\scheduler.go
func (sched *Scheduler) finishBinding(fwk framework.Framework, assumed *v1.Pod, targetNode string, err error) {if finErr := sched.SchedulerCache.FinishBinding(assumed); finErr != nil {klog.ErrorS(finErr, "Scheduler cache FinishBinding failed")}if err != nil {klog.V(1).InfoS("Failed to bind pod", "pod", klog.KObj(assumed))return}fwk.EventRecorder().Eventf(assumed, nil, v1.EventTypeNormal, "Scheduled", "Binding", "Successfully assigned %v/%v to %v", assumed.Namespace, assumed.Name, targetNode)
}
- 这里的 Successfully assigned default/nginx-pod-failed-to-scheduler to k8s-node01 对应的就是
"Successfully assigned %v/%v to %v", assumed.Namespace, assumed.Name, targetNode)
本节重点总结 :
- k8s的events是展示集群内部发生的事情的对象
- 很多组件都可以产生event,数据会上传到apiserver,临时存储在etcd中,因为量太大了,有删除策略
Event事件管理机制要有三部分组成
- EventRecorder:是事件生成者,k8s组件通过调用它的方法来生成事件;
- EventBroadcaster:事件广播器,负责消费EventRecorder产生的事件,然后分发给broadcasterWatcher;
- broadcasterWatcher:用于定义事件的处理方式,如上报apiserver;
可以给pod添加nodeSelector故意调度失败
cat <<EOF> nginx-pod-failed-to-scheduler.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx-pod-failed-to-scheduler
spec:containers:- name: nginximage: nginx:1.8nodeSelector:disktype: ssd
EOF
kube-scheduler中会对pod调度成功失败都记录event
- 成功的
13s Normal Scheduled pod/nginx-pod-failed-to-scheduler Successfully assigned default/nginx-pod-failed-to-scheduler to k8s-node01
fwk.EventRecorder().Eventf(assumed, nil, v1.EventTypeNormal, "Scheduled", "Binding", "Successfully assigned %v/%v to %v", assumed.Namespace, assumed.Name, targetNode)
- 失败的
fwk.EventRecorder().Eventf(pod, nil, v1.EventTypeWarning, "FailedScheduling", "Scheduling", msg)
Eventf(regarding runtime.Object, related runtime.Object, eventtype, reason, action, note string, args ...interface{})
相关文章:
6.3 k8s的事件event和kube-scheduler中的事件广播器
什么是k8s的events k8s的events是向您展示集群内部发生的事情的对象 例如调度程序做出了哪些决定或者为什么某些 Pod 从节点中被逐出 哪些组件可以产生events 所有核心组件和扩展(操作符)都可以通过 API Server 创建事件k8s 多个组件均会产生 event …...
OAI 平台 4G(LTE)基站 、终端、核心网 端到端部署实践(一)
本系列文章,基于OAI LTE代码搭建端到端运行环境,包含 eNB,EPC,UE三个网元。本小节先介绍系统总体架构,硬件平台及驱动安装方法。 1. Overview 系统总体架构如下图所示。 2 Machine setup 2.1 Machine specs Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS…...
t113修改串口
1 sys_config.fex [uart_para] uart_debug_port 0 uart_debug_tx port:PE02<6><1><default><default> uart_debug_rx port:PE03<6><1><default><default> 2 uboot修改启动参数 3 修改env.cfg启动地址和传输 #ear…...
「软件设计模式」桥接模式(Bridge Pattern)
深入解析桥接模式:解耦抽象与实现的艺术 一、模式思想:正交维度的优雅解耦 桥接模式(Bridge Pattern)通过分离抽象(Abstraction)与实现(Implementation),使二者可以独立…...
“地质环境体检”辅助智慧地质,服务工程建设、城市用地规划
随着社会经济的高速发展,各类工程建设也在加快筹建中。在工程项目的快速推进中,如何保障工作安全和工程建设的质量,是国家和社会普遍关注的一个问题。地质环境条件是影响工程建设、城市用地规划的重要因素,加强地质风险系统性研究…...
TMS320F28335二次bootloader在线IAP升级
F28335总共ABCDEFGH个区域,每个32K*16bits,即64K字节。 bootloader代码占用A区,地址0x338000~0x33FF7F,cmd文件中SECTIONS部分,需要添加Flash28_API相关信息,具体下载Flash28335_API_V210的demo࿰…...
java:用Guava的TypeToken优雅处理通配符类型(WildcardType): ? extends Number
在日常开发中我们经常会遇到泛型和通配符类型(WildcardType),比如当我们需要处理List<? extends Number>这样的类型时,如何优雅地创建这样的类型表示?本文将重点介绍如何通过Guava的TypeToken来实现通配符类型的…...
ROS-相机话题-获取图像-颜色目标识别与定位-目标跟随-人脸检测
文章目录 相机话题获取图像颜色目标识别与定位目标跟随人脸检测 相机话题 启动仿真 roslaunch wpr_simulation wpb_stage_robocup.launch rostopic hz /kinect2/qhd/image_color_rect/camera/image_raw:原始的、未经处理的图像数据。 /camera/image_rectÿ…...
Zabbix——Rocky9安装zabbix相关步骤记录
安装Zabbix 安装MariaDB 这里用MariaDB演示 https://mariadb.org/download/?trepo-config&dRedHatEnterpriseLinux9&v10.11&r_mneusoft 通过这个网址获得连接 选择对应的repo 根据系统版本和要安装的版本选择对应的repo 安装 新建一个repo文件,例…...
三轴云台之姿态测量篇
一、姿态测量的基本原理 三轴云台通过内置的传感器实时感知其姿态变化。这些传感器主要包括陀螺仪、加速度计和磁力计(在某些高级系统中)。 陀螺仪:用于检测云台的角速度变化,即绕三个轴的旋转速度。陀螺仪提供的数据是姿态测量的…...
Kotlin 2.1.0 入门教程(二十三)泛型、泛型约束、协变、逆变、不变
out(协变) out 关键字用于实现泛型的协变。协变意味着如果 B 是 A 的子类型,那么 Producer<B> 可以被视为 Producer<A> 的子类型。这里的 Producer 是一个使用泛型类型参数的类或接口,并且该泛型类型参数被标记为 ou…...
VSCode 中使用 Snippets 设置常用代码块
背景 在开发中,有很多代码片段是重复的,例如:vue文件中的模版,react 中的模版,打印的 log 等等,很多很多。对于这些重复性的工作,vscode 官方提供了解决方案-Snippets in Visual Studio Code&a…...
在conda虚拟环境中安装jupyter lab-----deepseek问答记录
在 Conda 虚拟环境中安装 Jupyter Lab 的步骤如下: 1. 创建并激活 Conda 虚拟环境 如果你还没有创建虚拟环境,可以使用以下命令创建一个新的虚拟环境并激活它: conda create -n myenv python3.x # 将 myenv 替换为你的环境名称࿰…...
单元测试整理
在国外软件开发中,单元测试必不可少,但是国内并不太重视这一块,一个好的单元测试可以提前发现很多问题,也减去和测试battle的时间 Spring单元测试 JUnit4 RunWith 指明单元测试框架 e.g. RunWith(SpringJUnit4ClassRunner.cla…...
计算机毕业设计hadoop+spark旅游景点推荐 旅游推荐系统 旅游可视化 旅游爬虫 景区客流量预测 旅游大数据 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
Java虚拟机面试题:内存管理(下)
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
【贝克街迷宫疑云:用侦探思维破解Java迷宫算法】
贝克街迷宫疑云:用侦探思维破解Java迷宫算法 "华生,把煤气灯调亮些。"福尔摩斯用放大镜仔细端详着桌上的羊皮纸,“这个案子比表面上看起来要复杂得多——它是个三维的思维迷宫。” 第一幕:离奇委托 1895年秋的伦敦笼…...
网络安全示意图 网络安全路线图
其实网络安全本身的知识点并不算难,但需要学的东西比较多,如果想要从事网络安全领域,肯定是需要系统、全面地掌握清楚需要用到的技能的。 自学的方式基本是通过看视频或者相关的书籍,不论是什么方法,都是很难的&#…...
ubuntu22.04离线安装K8S
1. 准备离线安装包 参考教程离线包准备教程 2. 准备环境 2.1. 准备主机 主机名ip系统k8s-master192.168.38.128ubuntu22.04k8s-node192.168.38.131ubuntu22.04 2.2. 设置host 修改 /etc/hosts 文件,添加master和node节点,需要和主机名保持一致 2…...
985本硕,网络安全方向,走算法还是走开发?
今天给大家分享的是一位粉丝的提问,985本硕,网络安全方向,走算法还是走开发? 接下来把粉丝的具体提问和我的回复分享给大家,希望也能给一些类似情况的小伙伴一些启发和帮助。 同学提问: 985本硕ÿ…...
如何清理 Linux 缓存 ?
和其他操作系统一样,Linux 使用缓存来优化系统性能。随着时间的推移,这些缓存可能会累积起来,尽管 Linux 擅长管理内存,但在某些情况下,手动清除可能是有益的,例如用于系统诊断、应用程序性能测试或其他特定…...
cv2库的使用及图像预处理02
目录 八,图像缩放 1. 图像缩放操作 2. 插值方法 (1)最邻近插值(cv2.INTER_NEAREST) (2)双线性插值(cv2.INTER_LINEAR) 3. 显示缩放结果 4. 目标尺寸 5. 总结 九,线性灰度变…...
硬件学习笔记--45 电磁兼容试验-9 无线电干扰抑制试验介绍
目录 电磁兼容试验- 无线电干扰抑制试验 1.试验目的 2.试验方法 3.判定依据及意义 电磁兼容试验- 无线电干扰抑制试验 驻留时间是在规定频率下影响量施加的持续时间。被试设备(EUT)在经受扫频频带的电磁影响量或电磁干扰的情况下&a…...
P1464 Function(记忆化递归)
#include <bits/stdc.h> using namespace std;#define ll long longll dp[21][21][21]; // dp数组,用来记忆已经计算过的结果ll w(ll a, ll b, ll c) {if (a < 0 || b < 0 || c < 0) {return 1;}if (a > 20 || b > 20 || c > 20) {return …...
OpenCV机器学习(7)人工神经网络 定义模型训练过程中参数的搜索范围cv::ml::ParamGrid 类
OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::ml::ParamGrid 类是 OpenCV 机器学习模块中的一个辅助类,用于定义模型训练过程中参数的搜索范围。它通常被用作某些机器学习算法(如支持向量机 SVM&…...
STL —— 洛谷字符串(string库)入门题(蓝桥杯题目训练)(一)
目录 一、B2109 统计数字字符个数 - 洛谷 算法代码: 1. 引入库和命名空间 2. 主函数 3. 读取输入 4. 变量初始化 5. 遍历字符串 6. 输出结果 7. 返回值 总结 评测记录: 二、B2110 找第一个只出现一次的字符 - 洛谷 方法一:算法代…...
游戏引擎学习第107天
仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾我们之前停留的位置 在这段内容中,讨论了如何处理游戏中的三维效果,特别是如何处理额外的“Z层”。由于游戏中的艺术资源是位图而不是3D模型,因此实现三维效果变得非常具有挑战性。虽然可…...
网页制作01-html,css,javascript初认识のhtml的基本标记
一、 Html简介 英文全称是 hyper text markup language,超文本标记语言,是全球广域网上描述网页内容和外观的标准. Html作为一款标记语言,本身不能显示在浏览器中.标记语言经过浏览器的解释和编译,才能正确地反映html标记语言的内容. 1.html 的基本标记 1)头部标…...
WebSocket在分布式环境中的局限性及解决方案
WebSocket 在分布式环境中存在一些局限性,特别是当系统需要扩展多个服务实例时,单个 WebSocket 连接的管理和消息推送就变得比较复杂。因此,必须采取一些额外的措施来确保 WebSocket 能在多个服务实例之间正确工作。 WebSocket 在分布式环境…...
Windows日志分析
查看服务日志文件 windows下我们可以通过时间查看器来查看windows系统下服务,应用,系统等产生的事件以及日志 1.打开方式是: winr 输入eventvwr.msc 2.控制面板--系统与安全--事件查看器 事件类型分为5种 错误:标识问题很严重…...
青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试
青少年编程与数学 02-009 Django 5 Web 编程 20课题、测试 一、软件测试二、自动化测试三、单元测试四、Django 单元测试(一)、创建测试用例(二)、运行测试(三)、常用测试功能 课题摘要: 本文全面介绍了软件…...
WPF 中为 Grid 设置背景图片全解析
WPF 中为 Grid 设置背景图片全解析 在 WPF(Windows Presentation Foundation)开发中,界面的美观度是吸引用户的重要因素之一。而添加背景图片是提升界面视觉效果的常见手段。今天,我们就来深入探讨在 WPF 里如何为 Grid 设置背景…...
3.10 实战Hugging Face Transformers:从文本分类到模型部署全流程
实战Hugging Face Transformers:从文本分类到模型部署全流程 一、文本分类实战:IMDB电影评论情感分析 1.1 数据准备与预处理 from datasets import load_dataset from transformers import AutoTokenizer # 加载IMDB数据集 dataset = load_dataset("imdb") …...
Android中获取so文件来源于哪个库
Android app中可能有很多的.so文件,有时我们不确定这些.so文件都是来源于哪些库的,可以通过在build.gradle中添加代码来统计。具体方法如下: 1.在com.android.application模块的build.gradle文件最后添加如下代码: // 获取所有的…...
地面沉降监测,为地质安全保驾护航
地面沉降,不容忽视的城市隐患 随着城市化进程的加速,大规模的工程建设、地下水过度开采等因素,导致地面沉降现象日益严重。地面沉降不仅会使建筑物开裂、倾斜,影响其使用寿命和安全性,还会破坏地下管线,引…...
宝塔docker 安装oracle11G
1、拉取镜像 sudo docker pull iatebes/oracle_11g #iatebes为用户名2、查看镜像 sudo docker images3、创建并运行容器 docker run -d --privileged --name oralce11g -p 1521:1521 iatebes/oracle_11g4、登录到容器 5、进入容器并修改system用户密码 docker exec -it orac…...
unity学习39:连续动作之间的切换,用按键控制角色的移动
目录 1 不同状态之间的切换模式 1.1 在1个连续状态和一个连续状态之间的transition,使用trigger 1.2 在2个连续状态之间的转换,使用bool值切换转换 2 至少现在有2种角色的移动控制方式 2.1 用CharacterController 控制角色的移动 2.2 用animator…...
DeepSeek等大模型功能集成到WPS中的详细步骤
记录下将**DeepSeek功能集成到WPS中**的步骤,以备忘。 1. 下载并安装OfficeAI插件 访问OfficeAI插件下载地址:https://www.office-ai.cn/,下载插件(目前只支持windows系统)。 注意,有两个插件࿰…...
基于Python的Flask微博话题舆情分析可视化系统
✅️配套lun文 1w9字 ✅️爬虫可用 12月数据 ✅️实时微博热点分析 技术栈:爬虫➕Flask后端框架➕bert深度学习模型➕mysql数据库系统功能:爬取微博数据(可以是同类型文章或者制定文章),微博文章情感分析,微博评论情感…...
服务器A到服务器B免密登录
#!/bin/bash # 变量定义 source_host"192.168.42.250" # 源主机 IP target_host"192.168.24.43" # 目标主机 IP target_user"nvidia" # 目标主机的用户名 ssh_port"6666" # SSH 端口号 # 生成 SSH…...
Unity中可靠的UDP实现
可靠 UDP(Reliable UDP)是一种在用户数据报协议(UDP)基础上,通过添加额外机制来实现可靠数据传输的技术。与传统 UDP 相比,它克服了 UDP 本身不保证数据可靠性、顺序性以及可能丢失数据的缺点,同…...
轮播图html
题十二:轮播图 要求: 1.鼠标不在图片上方时,进行自动轮播,并且左右箭头不会显示;当鼠标放在图片上方时,停止轮播,并且左右箭头会显示; 2.图片切换之后,图片中下方的小圆…...
二十多年前的苹果电源Power Mac G4 Mdd 电源接口
在1999年,苹果推出了最初的Power Mac G4电脑。第一代Power Mac G4有与G3系列相似的外壳和两种主板设置,分别使用PCI和AGP显示总线。第二代电脑被昵称为快银或水银机,来自2001年的它们有更高速的PowerPC 7450系列芯片,增强了L2缓存…...
java听书项目
项目的架构 网关:1路由转发 2.认证鉴权(token)3.统一处理(跨域) Mysql:关系型数据库 ES:搜索数据库 Redis:页面级缓存,会话状态存储 GitLab:私有托管平台 K8S:自动化部署、扩展和管理容器化应用程序的开源系统 Jenkins:自动化部署 1.环境搭建 创建一个父工程…...
RadASM环境,win32汇编入门教程之三
;运行效果 ;win32汇编环境,RadAsm入门教程之三 ;在这个教程里,我们学一下如何增加控件,比如按钮,其它的控件类似这样增加 ;以下的代码就是在教程一的窗口模版里增加一个按钮控件,可以比较一下,增加了什么内…...
【机器学习】线性回归 多元线性回归
【机器学习系列】 KNN算法 KNN算法原理简介及要点 特征归一化的重要性及方式线性回归算法 线性回归与一元线性回归 线性回归模型的损失函数 多元线性回归 多项式线性回归 多元线性回归 V1.0多元线性回归一元线性回归与多元线性回归多元线性回归模型的误差衡量多元线性回归的最…...
线性代数中的正交和标准正交向量
在线性代数中,理解正交向量和正交向量至关重要,尤其是对于机器学习中的应用。这篇博文将简化这些概念,而不会太深入地深入研究复杂的数学。 正交向量 如果两个向量的点积等于零,则认为这两个向量是正交的。但点积到底是什么呢&am…...
Vue 项目登录的基本流程
Vue 用户登录的基本流程包括以下6个步骤: 步骤: 1. 创建登录表单 在前端,首先要创建一个登录表单,用户输入账号(用户名、邮箱、手机号等)和密码。 示例:Login.vue <template><div…...
坐井说天阔---DeepSeek-R1
前言 DeepSeek-R1这么火,虽然网上很多介绍和解读,但听人家的总不如自己去看看原论文。于是花了大概一周的时间,下班后有进入了研究生的状态---读论文。 DeepSeek这次的目标是探索在没有任何监督数据的情况下训练具有推理能力的大模型&#…...
Spring 是如何解决循环依赖问题的?
Spring框架通过使用三级缓存机制来解决单例Bean之间的循环依赖问题。以下是详细的解释,包括循环依赖的概念、Spring的解决方案以及三级缓存的具体作用。 什么是循环依赖? 循环依赖是指两个或多个Bean之间相互依赖,形成一个闭环。例如&#…...