带你深入学习k8s--(三) pod 管理
目录
一、简介
1、什么是pod
2、为什么要有pod
二、pod的分类
0、pod常用命令命令
1、准备镜像
2、自主式pod
3、控制器创建pod
4、扩容pod数量
5、通过service暴露pod(负载均衡,自动发起)
6、更新应用版本
三、编写yaml文件
四、Pod生命周期
1、init容器
2、探针
1、存活探针
2、就绪探针
总结:
一、简介
1、什么是pod
Pod是可以创建和管理Kubernetes计算的最小可部署单元,一个Pod代表着集群中运行的一个进程,每个pod都有一个唯一的ip。
一个pod类似一个豌豆英,包含一个或多个容器 (通常是docker) ,多个容器间共享IPC、Network和UTC namespace。
2、为什么要有pod
k8s作为集群调度需要解决的一些问题
1、容器建超亲密关系,容器建共享问题如何解决,互通的问题
2、数据间共享问题
每个容器都会有自己的namespace,容器是通过namespace来做的隔离,就是说容器间网络是不通的,有些容器之间我们希望是像localhost这样超亲密容器之间如何互访?
容器中放的就是我们的业务,假设有两个容器,他们的关系非常的亲密,他们之间的通信非常的频繁,而且还需要共享数据,这样就需要pod,在k8s中pod就解决了上述的两个问题,打通了这两个超亲密容器之间的通信和数据共享的问题,pod就给他提供了这样的环境,在同一个pod内的容器共享一个网络栈,pod还可以为pod内的容器提供一个相对持久化的存储也就是卷,不删除pod存储就是在的(pod是怎么来的在我们下载额镜像中reg.westos.org/k8s/pause是汇编语言写的,很小,大概几百kb,永远处于一种暂停的方式,会通过镜像为我们提供一个k8s的环境,这是谷歌为我们准备好的,他的设计理念就是为了解决打通容器间的网络和存储,提供一个相对持久化的存储)
二、pod的分类
Kubernetes 集群中的 Pod 主要有两种用法:
运行单个容器的 Pod。"每个 Pod 一个容器" 模型是最常见的 Kubernetes 用例; 在这种情况下,可以将 Pod 看作单个容器的包装器,并且 Kubernetes 直接管理 Pod,而不是容器。
运行多个协同工作的容器的 Pod。 Pod 可能封装由多个紧密耦合且需要共享资源的共处容器组成的应用程序。 这些位于同一位置的容器可能形成单个内聚的服务单元 —— 一个容器将文件从共享卷提供给公众, 而另一个单独的 “边车”(sidecar)容器则刷新或更新这些文件。 Pod 将这些容器和存储资源打包为一个可管理的实体。
0、pod常用命令命令
kubectl get pod ##获取pod
kubectl get ns ##查看namespace
kubectl get pod -n kube-system ##查看相应namespace对应的pod,不加namespace就自动选择默认的namespace
kubectl describe pod xxx ##这条命令来查看pod详细信息
kubectl run -h ##查看创建pod帮助
kubectl get pod -o wide ##查看节点的具体信息
kubectl delete pod demo ##删除pod
1、准备镜像
下载测试镜像[root@k8s1 docker]# docker pull yakexi007/myapp:v1
[root@k8s1 docker]# docker pull yakexi007/myapp:v2
修改名称
[root@k8s1 docker]# docker tag yakexi007/myapp:v1 reg.westos.org/library/myapp:v1
[root@k8s1 docker]# docker tag yakexi007/myapp:v2 reg.westos.org/library/myapp:v2
上传harbor仓库
[root@k8s1 docker]# docker push reg.westos.org/library/myapp:v1
[root@k8s1 docker]# docker push reg.westos.org/library/myapp:v2
2、自主式pod
(生产不推荐,没有控制器维护的pod就是自主式pod,自主式pod没有自愈性)
[root@k8s2 ~]# kubectl run demo --image=myapp:v1
[root@k8s2 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
demo 1/1 Running 0 35s 10.244.2.2 k8s4 <none> <none>
查看pod详情
[root@k8s2 ~]# kubectl describe pod demo
Name: demo
Namespace: default
Priority: 0
Node: k8s4/192.168.56.174
Start Time: Mon, 09 Jan 2023 15:40:49 +0800
Labels: run=demo
Annotations: <none>
Status: Running
IP: 10.244.2.2
IPs:
IP: 10.244.2.2
...
删除pod[root@k8s2 ~]# kubectl delete pod demo
3、控制器创建pod
这里我们先使用deployment控制器,控制器内容会在下一章节讲解
创建
kubectl create deployment myapp --image=myapp:v1
拉伸pod的副本数
kubectl scale deployment myapp --replicas 3
创建时直接设定好副本数:kubectl create deployment myapp --image=myapp:v1 --replicas=3
控制器会自动维护pod副本数
[root@k8s2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-678fcbc488-gp6pr 1/1 Running 0 3s
myapp-678fcbc488-gqdgk 1/1 Running 0 3s
myapp-678fcbc488-qqkzx 1/1 Running 0 3s
获取当前deployment控制器,有3个pod
[root@k8s2 ~]# kubectl get deployments.apps
NAME READY UP-TO-DATE AVAILABLE AGE
myapp 3/3 3 3 16s
删除其中一个pod,控制器会自动创建一个新的,只要不删除控制器,他会自动维护pod[root@k8s2 ~]# kubectl delete pod myapp-678fcbc488-gp6pr
pod "myapp-678fcbc488-gp6pr" deleted
删除后查看还是3个副本数
在远程pod中执行命令
[root@k8s2 ~]# kubectl exec myapp-fcfbd4477-b2hkm -- ls /usr/share/nginx/html
[root@k8s2 ~]# kubectl exec myapp-fcfbd4477-b2hkm -- ls /usr/share/nginx/html
50x.html
index.html
4、扩容pod数量
扩容
[root@k8s2 ~]# kubectl scale deployment myapp --replicas=6
[root@k8s2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-678fcbc488-gqdgk 1/1 Running 0 11m
myapp-678fcbc488-jb5dw 1/1 Running 0 7s
myapp-678fcbc488-qqkzx 1/1 Running 0 11m
myapp-678fcbc488-tm55k 1/1 Running 0 7s
myapp-678fcbc488-v7ftf 1/1 Running 0 11m
myapp-678fcbc488-wrjt7 1/1 Running 0 7s
缩容
[root@k8s2 ~]# kubectl scale deployment myapp --replicas=3
deployment.apps/myapp scaled
[root@k8s2 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-678fcbc488-gqdgk 1/1 Running 0 12m
myapp-678fcbc488-qqkzx 1/1 Running 0 12m
myapp-678fcbc488-v7ftf 1/1 Running 0 11m
5、通过service暴露pod(负载均衡,自动发起)
指定暴露端口和目标端口,目标端口相当于做了一个映射
[root@k8s2 ~]# kubectl expose deployment myapp --port=80 --target-port=80
查看svc详情
describe查看命令详情
有3个Endpoints,这个就是三个pod的ip地址
[root@k8s2 ~]# kubectl describe svc myapp
Name: myapp
Namespace: default
Labels: app=myapp
Annotations: <none>
Selector: app=myapp
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.106.225.101
IPs: 10.106.225.101
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.2:80,10.244.1.3:80,10.244.2.4:80
Session Affinity: None
Events: <none>
访问时默认是iptable的负载均衡算法,不是特别的均匀但是会提供一个健康的
[root@k8s2 ~]# curl 10.106.225.101
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
[root@k8s2 ~]# curl 10.106.225.101/hostname.html
myapp-678fcbc488-v7ftf
service自动发现pod扩容与缩容,自动更新endpoints,实现对应用的负载均衡
service默认使用clusterip类型,只能在集群中访问
nodeport类型,可以在集群外部访问
[root@k8s2 ~]# kubectl edit svc myapp
[root@k8s2 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 120m
myapp NodePort 10.106.225.101 <none> 80:30280/TCP 23m
6、更新应用版本
更新镜像版本
[root@k8s2 ~]# kubectl set image deployment/myapp myapp=myapp:v2
[root@k8s1 docker]# curl 192.168.18.14:30840
查看应用历史版本
[root@k8s2 ~]# kubectl rollout history deployment myapp
回滚
[root@k8s2 ~]# kubectl rollout undo deployment myapp --to-revision=1
[root@k8s2 ~]# curl 192.168.18.14:30840
删除应用
[root@k8s2 ~]# kubectl delete deployments.apps myapp
[root@k8s2 ~]# kubectl delete svc myapp
[root@k8s2 ~]# kubectl get pod
以上操作我们都是在默认的namespace中进行,在k8s中通过namespace进行逻辑隔离,只要不指定就是在default中
[root@k8s2 ~]# kubectl get ns
三、编写yaml文件
在实际中我们更常用yaml文件的方式创建pod
资源清单
获取帮助
[root@k8s2 pod]# kubectl explain pod.spec.containers
获取yaml模板
[root@k8s2 pod]# kubectl run demo --image nginx --dry-run=client -o yaml > pod.yaml
编写yaml文件
[root@k8s2 pod]# vim pod.yaml
apiVersion: v1
kind: Pod
metadata:
labels:
run: demo
name: demo
spec:
containers:
- image: nginx
name: demo
imagePullPolicy: IfNotPresentimagePullPolicy: IfNotPresent镜像拉取策略,有3种,always总是拉取、Never不拉取、IfNotPresent如果本地有就不拉取镜像,1.25版本默认就是 IfNotPresent
创建pod
[root@k8s2 pod]# kubectl create -f pod.yaml
查看详情
[root@k8s2 pod]# kubectl get pod -o wide
[root@k8s2 pod]# kubectl describe pod demo
[root@k8s2 pod]# kubectl get pod demo -o yaml
示例
[root@k8s2 pod]# vim pod.yml
apiVersion: v1
kind: Pod
metadata:labels:run: demoname: demo
spec:hostNetwork: truenodeSelector: #nodeSelector调动策略,是以标签的形式写的 kubectl getnode --show-labelskubernetes.io/hostname: k8s3containers:- image: myapp:v1 name: demoimagePullPolicy: IfNotPresent#ports: #端口映射#- name: http# containerPort: 80# hostPort: 80#resources: #资源限制# limits:# cpu: 1# memory: 200Mi# requests:# cpu: 0.5# memory: 100Mi#- name: demo2 #定义多个容器# image: busyboxplus# command: ["/bin/sh", "-c", "sleep 3600"]
资源敏感型业务:
resources这里会有一个资源敏感型业务,最小requests和最大上限limits是一样的,并且cpu和内存都需要设置。如果不是资源敏感型业务,在这个pod上如果资源不够时会把一些资源要求比较宽容的pod踢出去,从而保证资源敏感型pod正常运行。(Mi是1024换算,M是1000换算),在k8s中QoS Class不可以直接赋值,必须要通过resources来赋值
k8s根据Pod中Containers Resource的request和limit的值来定义Pod的QoS Class。其中,指定容器request,代表系统确保能够提供的资源下限值。指定容器limit,代表系统允许提供的资源上限值。
Pods需要保证长期稳定运行需要设定“确保运行的最少资源”,然而pod能够使用的资源经常是不能确保的。
通常,Kubernetes通过设置request和limit的值来指定超卖比例,进而提升资源利用率。K8S的调度基于request,而不是limit。Borg通过使用“non-guranteed”的资源,提升了20%的资源利用率。
在一个资源被“超卖”的系统(总limits > machine capacity),容器在资源被耗尽的情况下会被kill。理想情况是那些“不重要”的容器先被kill。
对于每一种Resource都可以将容器分为3中QoS Classes:Guaranteed敏感型, Burstable次敏感型, and Best-Effort宽容型,它们的QoS级别依次递减。K8S底层实际上是通过 limit和request值来实现不同等级QoS的划分。
Guaranteed 如果Pod中所有Container的所有Resource的limit和request都相等且不为0,则这个Pod的QoS Class就是Guaranteed。
注意,如果一个容器只指明了limit,而未指明request,则表明request的值等于limit的值。
Best-Effort 如果Pod中所有容器的所有Resource的request和limit都没有赋值,则这个Pod的QoS Class就是Best-Effort
Burstable 除了符合Guaranteed和Best-Effort的场景,其他场景的Pod QoS Class都属于Burstable。 当limit值未指定时,其有效值其实是对应Node Resource的Capacity
[root@k8s2 pod]# kubectl apply -f pod.yml
删除
[root@k8s2 pod]# kubectl delete -f pod.yml
四、Pod生命周期
官方文档: Pod 的生命周期 | Kuberneteshttps://v1-25.docs.kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/
1、init容器
为什么要用初始化容器,Init 容器能做什么?
Init 容器可以包含一些安装过程中应用容器中不存在的实用工具或个性化代码。Init 容器可以安全地运行这些工具,避免这些工具导致应用镜像的安全性降低。
应用镜像的创建者和部署者可以各自独立工作,而没有必要联合构建一个单独的应用镜像。
Init 容器能以不同于Pod内应用容器的文件系统视图运行。因此,Init容器可具有访问 Secrets 的权限,而应用容器不能够访问。由于Init 容器必须在应用容器启动之前运行完成,因此 lnit 容器提供了一种机制来阻塞或延迟应用容器的启动,直到满足了一组先决条件。一旦前置条件满足,Pod内的所有的应用容器会并行启动。
案例:需要service解析,没有解析init容器启动失败,主容器不会运行,初始化容器运行成功后主容器才能运行
[root@k8s2 pod]# vim init-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app.kubernetes.io/name: MyApp
spec:
containers:
- name: myapp-container
image: busybox
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
initContainers:
- name: init-myservice
image: busybox
command: ['sh', '-c', "until nslookup myservice.default.svc.cluster.local; do echo waiting for myservice; sleep 2; done"]
[root@k8s2 pod]# kubectl apply -f init-pod.yaml
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 0/1 Init:0/1 0 41s
在init容器没有成功运行之前,主容器不会被运行
添加svc定义
[root@k8s2 pod]# vim myservice.yaml
---
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- protocol: TCP
port: 80
targetPort: 80
[root@k8s2 pod]# kubectl apply -f myservice.yaml
[root@k8s2 pod]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3d1h
myservice ClusterIP 10.103.221.131 <none> 80/TCP 2s
svc解析成功后,init容器退出,主容器运行
[root@k8s2 pod]# yum install -y bind-utils
[root@k8s2 pod]# dig -t A myservice.default.svc.cluster.local. @10.96.0.10
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
myapp-pod 1/1 Running 0 3m35s
回收资源
[root@k8s2 pod]# kubectl delete -f init-pod.yml
[root@k8s2 pod]# kubectl delete -f myservice.yml
2、探针
共三种探针:分别是存活探针,就绪探针,启动探针,前两个使用居多。
1、存活探针
[root@k8s2 pod]# vim liveness-pod.yaml
apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-http
spec:containers:- name: livenessimage: nginxlivenessProbe:tcpSocket:port: 8080initialDelaySeconds: 3 #容器启动多少秒后开始检测periodSeconds: 3 #检测频率,间隔timeoutSeconds: 1 #超时时间
[root@k8s2 pod]# kubectl apply -f liveness-pod.yaml
在存活探针检测失败导致容器不断被重启
[root@k8s2 pod]# kubectl get pod -w
NAME READY STATUS RESTARTS AGE
liveness-http 1/1 Running 0 5s
liveness-http 1/1 Running 1 (0s ago) 13s
liveness-http 1/1 Running 2 (0s ago) 22s[root@k8s2 pod]# kubectl describe pod liveness-http
释放资源
[root@k8s2 pod]# kubectl delete -f liveness-pod.yaml
2、就绪探针
[root@k8s2 pod]# vim liveness-pod.yaml
apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-http
spec:containers:- name: livenessimage: nginxlivenessProbe:tcpSocket:port: 80initialDelaySeconds: 3periodSeconds: 3readinessProbe:httpGet:path: /test.htmlport: 80initialDelaySeconds: 5periodSeconds: 5
[root@k8s2 pod]# kubectl apply -f liveness-pod.yaml
就绪探针失败导致容器一直未就绪
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-http 0/1 Running 0 34s
查看详情
[root@k8s2 pod]# kubectl describe pod liveness-http
创建测试页面
[root@k8s2 pod]# kubectl exec liveness-http -- touch /usr/share/nginx/html/test.html就绪探针成功
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-http 1/1 Running 0 100s
创建svc
[root@k8s2 pod]# kubectl expose pod liveness-http --port 80 --target-port 80
svc通过就绪探针判断这个应用是否正常,能否上线
就绪容器自动上线
[root@k8s2 pod]# kubectl describe svc liveness-http
Name: liveness-http
Namespace: default
Labels: test=liveness
Annotations: <none>
Selector: test=liveness
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.108.21.178
IPs: 10.108.21.178
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.33:80
Session Affinity: None
Events: <none>
删除测试页面
[root@k8s2 pod]# kubectl exec liveness-http -- rm /usr/share/nginx/html/test.html
就绪探针失败,容器未就绪,svc发现不了服务,就没有Endpoints
[root@k8s2 pod]# kubectl get pod
NAME READY STATUS RESTARTS AGE
liveness-http 0/1 Running 0 6m15s
在svc中容器自动下线
[root@k8s2 pod]# kubectl describe svc liveness-http
Name: liveness-http
Namespace: default
Labels: test=liveness
Annotations: <none>
Selector: test=liveness
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.108.21.178
IPs: 10.108.21.178
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints:
Session Affinity: None
Events: <none>
回收
[root@k8s2 pod]# kubectl delete -f liveness-pod.yaml
总结:
存活探针如果启动失败,他会不断的重启这个容器,让他达到一个自愈的功能,就绪探针和svc自动发现相关联,就绪我们就可以认为这个业务可以正常对外发布,正常才让他出现在svc的负载均衡列表中,就相当于健康检测,这是k8s对我们应用上线和下线的一个优雅操作。
相关文章:

带你深入学习k8s--(三) pod 管理
目录 一、简介 1、什么是pod 2、为什么要有pod 二、pod的分类 0、pod常用命令命令 1、准备镜像 2、自主式pod 3、控制器创建pod 4、扩容pod数量 5、通过service暴露pod(负载均衡,自动发起) 6、更新应用版本 三、编写yaml文件 四、Pod生命周期…...

前端系列11集-ES6 知识总结
ES Module 优点 静态分析 浏览器和 Node 都支持 浏览器的新 API 能用模块格式提供 不再需要对象作为命名空间 export 用于规定模块的对外接口 输出的接口与其对应的值是动态绑定关系可以取到模块内部实时的值 import 用于输入其他模块提供的功能 具有提升效果,会提升…...

连接分析工具箱 | 利用CATO进行结构和功能连接重建
导读 本研究描述了一个连接分析工具箱(CATO),用于基于扩散加权成像(DWI)和静息态功能磁共振成像(rs-fMRI)数据来重建大脑结构和功能连接。CATO是一个多模态软件包,使研究人员能够运行从MRI数据到结构和功能连接组图的端到端重建,定制其分析并…...

【目标检测论文阅读笔记】Detection of plane in remote sensing images using super-resolution
Abstract 由于大量的小目标、实例级噪声和云遮挡等因素,遥感图像的目标检测精度低,漏检率或误检率高。本文提出了一种新的基于SRGAN和YOLOV3的目标检测模型,称为SR-YOLO。解决了SRGAN网络 对超参数的敏感性和模态崩溃问题。同时,Y…...

外卖app开发流程全解析
外卖app开发是现代餐饮业的一个必备部分。在这个数字化时代,人们更愿意使用手机应用程序来订购食品。因此,为了满足客户需求,餐饮企业需要开发自己的外卖app。 第一步:确定目标受众 在开始外卖app的开发之前,需要确定…...

BUUCTF jarvisoj_level0
小白垃圾做题笔记而已,不建议阅读。。。 这道题感觉主要就是64位程序ebp8 题目中给出了shellcode 我们直接将返回地址覆盖就好。 在main函数中调用了vulnerable_function()函数。 vulnerable函数是一个漏洞函数:(存在缓溢出),我们只需要将…...

网络安全之入侵检测
目录 网络安全之入侵检测 入侵检测经典理论 经典检测模型 入侵检测作用与原理 意义 异常检测模型(Anomaly Detection) 误用检测模型(Misuse Detection) 经典特征案例 编辑自定义签名 编辑 签名检查过程 检测生命周期…...
元数据管理
1、业务元数据 描述 ”数据”背后的业务含义主题定义:每段 ETL、表背后的归属业务主题。业务描述:每段代码实现的具体业务逻辑。标准指标:类似于 BI 中的语义层、数仓中的一致性事实;将分析中的指标进行规范化。标准维度…...

C# WebService的开发以及客户端调用
目录 1、WebService简介 1.1 什么是XML? 1.2 什么是Soap? 1.3 什么是WSDL? 2、WebService与WebApi的区别与优缺点 2.1 WebService与WebApi的区别: 2.2 WebService的优缺点: 2.3 WebApi的优缺点: 3…...
有符号数和无符号数左移和右移
主要是有符号数的左移。 有的说不管符号位,直接左移,所以可以一会正数一会复数 https://bbs.csdn.net/topics/391075092 有的说符号位不动,其他来左移 不明白了。。。。 https://blog.csdn.net/hnjzsyjyj/article/details/119721014 https://…...

Netty小白入门教程
一、概述 1.1 概念 Netty是一个异步的基于事件驱动(即多路复用技术)的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端。 1.2 地位 Netty在Java网络应用框架中的地位就好比,Spring框架在JavaEE开发中的地位。 以下的框架都使用了Nett…...

【逻辑位移和算数位移】
<< 运算符 && >> 运算符 正数位移 当 x>>n 中 x 为正数时,会将x的所有位右移x位,同时左边高位补0 显而易见,运算结束后,值为1 。 可知右移n位,结果就是 x / 2^n:7 / 2 ^2 1;…...

Blender3.5 边的操作
目录 1. 边操作1.1 边的细分 Subdivide1.2 边的滑移 Edge Slide1.3 边的删除1.4 边的溶解 Dissolve1.5 边线倒角 Bevel1.6 循环边 Loop Edges1.7 并排边 Ring Edges1.8 桥接循环边 1. 边操作 1.1 边的细分 Subdivide 在边选择模式,选中一条边,右键&…...
Java与Python、Node.js在人工智能和区块链应用程序开发中的比较
背景 Java、Python和Node.js都是常用的编程语言,它们在不同领域都有广泛的应用。在人工智能和区块链应用程序开发中,这三种语言都具有各自的优势和劣势。 Java的优势 Java在企业级应用中应用广泛,这得益于其跨平台性、安全性和稳定性等特点。在人工智能和区块链应用程序开…...

【计算机是怎么跑起来的】基础:计算机三大原则
【计算机是怎么跑起来的】基础:计算机三大原则 计算机的三个根本性基础1.计算机是执行输入,运算,输出的机器输入,运算,输出 2. 软件是指令和数据的集合指令数据 3. 计算机的处理方式有时与人们的思维习惯不同对计算机来…...

NXP公司LPC21XX+PID实现稳定温度控制
本例使用的是LPC21XX系列芯片提供的PWM功能实现稳定的温度控制。首先我们获得当前环境温度之后,再用设定的温度与当前温度相减,通过PID算法计算出当前输出脉宽,并将其输出到L298N模块中,使加热丝发热,形成闭环…...
【CE实战-生化危机4重置版】实现角色瞬移、飞翔
▒ 目录 ▒ 🛫 导读需求开发环境1️⃣ CE扫描内存,定位坐标地址(加密后的地址)2️⃣ 硬件写入断点,定位真实坐标地址内存写入断点,定位到访问地址分析代码...

强烈建议互联网人转战实体和农业,去了就是降维打击!实体太缺人才了,老板也不缺钱!...
大环境不好,互联网人该何去何从? 一位网友提出了一个新思路:强烈建议互联网同学转战实体、农业这些行业。实体真的太缺人才了,目前大部分实体都留下70后、80后在继续奋斗。其实实体老板很多都不缺钱,经过多年积累&…...

如何将 github pages 迁移到 vercel 上托管
如何将 github pages 迁移到 vercel 上托管 前言 早期网站使用 github pages,后来迁移到 coding,最近又放到腾讯云网站静态托管,无论是 coding 的 cos 存储桶,还是静态网站托管 他们都是收费的,那有没有免费的托管商呢,既不影响网站的访问速度还免费,于是,找了一下,还真有,ve…...

2023五一数学建模竞赛(五一赛)选题建议
提示:DS C君认为的难度:C<A<B,开放度:B<A<C 。 A题:无人机定点投放问题 这道题是传统的物理类题目,基本每次建模竞赛都会有。由于这道题目并未给明数据,所以数据获取和搜集资料是…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...