当前位置: 首页 > news >正文

k8s集群中pod的容器资源限制和三种探针

一、资源限制

总结:

requests表示创建pod时预留的资源,limits表示pod能够使用资源的最大值。requests值可以被超,limits值不能超过,如果是内存使用超过limits会触发oom然后杀掉进程,如果是cpu超过limits会压缩cpu的使用率。

官网示例如下:

Resource Management for Pods and Containers | Kubernetes

1.1Pod 和 容器的资源请求和限制 

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

1.2Kubernetes 中的资源单位

1.2.1CPU 资源单位
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 资源。 

1.2.2内存 资源单位

内存的 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

例如:在买硬盘的时候,操作系统报的数量要比产品标出或商家号称的小一些,主要原因是标出的是以 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,所以检测实际结果要比标出的少一些。

cpu的单位可以是核个数如1.25,0.5等,可以是毫核如500m,1250m

memory的单位可以是128M或128Mi (分别是1000k=1M或1024Ki=1Mi)

1.3容器资源示例 

官方文档
https://kubernetes.io/zh-cn/docs/concepts/configuration/manage-resources-containers/

以下 Pod 有两个容器。每个容器的请求为 0.25 CPU 和 64MiB(226 字节)内存, 每个容器的资源限制为 0.5 CPU 和 128MiB 内存。 你可以认为该 Pod 的资源请求为 0.5 CPU 和 128 MiB 内存,资源限制为 1 CPU 和 256MiB 内存

apiVersion: v1
kind: Pod
metadata:name: frontend
spec:containers:- name: appimage: images.my-company.example/app:v4env:- name: MYSQL_ROOT_PASSWORDvalue: "password"resources:requests:memory: "64Mi"cpu: "250m" limits:memory: "128Mi"cpu: "500m"- name: log-aggregatorimage: images.my-company.example/log-aggregator:v6resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"

1.4部署容器资源限制

mkdir /opt/pod/
cd /opt/pod/
apiVersion: v1
kind: Pod
metadata:name: zzz-web-db
spec:containers:- name: webimage: nginxenv:- name: WEB_ROOT_PASSWORDvalue: "password"resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"- name: dbimage: mysqlenv:- name: MYSQL_ROOT_PASSWORDvalue: "abc123"resources:requests:memory: "64Mi"cpu: "0.25"limits:memory: "128Mi"cpu: "500m"

 

可以看到状态是OOMKilled、表示资源不足、需要修改资源

OOMKilled:资源不足被杀死

kubectl logs zzz-web-db -c db 

 

然后进入修改配置

 

现在状态正常,running状态,创建成功

查看pod的详细信息

kubectl describe pod zzz-web-db

 

kubectl get pods -owide

 

看到调度到了node01上面,我们可以去查看详细信息,如下图

kubectl describe nodes
#查看资源占用多少

 

预分配:request 

Pod 和 容器 的资源请求和限制:
spec.containers[].resources.requests.cpu        #定义创建容器时预分配的CPU资源
spec.containers[].resources.requests.memory       # 定义创建容器时预分配的内存资源

#创建pod容器时需要预留你的资源量   示例:0.5  500m  内存 MI、GI(2为底的)MG(10为底的)

上限:limits    内存超过limits大小,就会报omm内存资源不足的错误 

spec.containers[].resources.limits.cpu   #定义 cpu 的资源上限 
spec.containers[].resources.limits.memory        #定义内存的资源上限

#pod容器能够使用资源量的一个上限  示例 :4Gi内存上限 (不允许超过上限值)

kubectl describe 名称#查看pod或者查看node资源使情况

  k8s中的应用服务质量

 可以用查看pod的详细信息

qos优先级:

二、健康检查:又称为探针(Probe)⭐⭐⭐⭐⭐

健康检查:又称为探针(Probe)

探针是由kubelet对容器执行的定期诊断

2.1探针的三种规则 

总结:

不提供存活探针,默认为success,表示如果没有存活探针的情况下,都是认为探针成功正常的

在就绪探针中,判断容器是否准备好接受请求,表示,pod是否准备好接受客户端和通过service转发来的请求

先启动启动探针------随后启动存活探针或者就绪探针

2.2Probe支持三种检查方法

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

建议使用httpget和tcpsocket
 

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

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

官网示例:

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

 三、验证存活探针三大健康检查的方式

官网示例:exec方式

apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-exec
spec:containers:- name: livenessimage: k8s.gcr.io/busyboxargs:  - /bin/sh- -c- touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 60livenessProbe:exec:command:- cat- /tmp/healthyfailureThreshold: 1 initialDelaySeconds: 5periodSeconds: 5#initialDelaySeconds:指定 kubelet 在执行第一次探测前应该等待5秒,即第一次探测是在容器启动后的第6秒才开始执行。默认是 0 秒,最小值是 0。#periodSeconds:指定了 kubelet 应该每 5 秒执行一次存活探测。默认是 10 秒。最小值是 1。#failureThreshold: 当探测失败时,Kubernetes 将在放弃之前重试的次数。 存活探测情况下的放弃就意味着重新启动容器。就绪探测情况下的放弃 Pod 会被打上未就绪的标签。默认值是 3。最小值是 1。#timeoutSeconds:探测的超时后等待多少秒。默认值是 1 秒。最小值是 1。(在 Kubernetes 1.20 版本之前,exec 探针会忽略 timeoutSeconds 探针会无限期地 持续运行,甚至可能超过所配置的限期,直到返回结果为止。)

在这个配置文件中,可以看到 Pod 中只有一个 Container。 periodSeconds 字段指定了 kubelet 应该每 5 秒执行一次存活探测。 initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 5 秒。 kubelet 在容器内执行命令 cat /tmp/healthy 来进行探测。 如果命令执行成功并且返回值为 0,kubelet 就会认为这个容器是健康存活的。 当到达第 31 秒时,这个命令返回非 0 值,kubelet 会杀死这个容器并重新启动它

 随后自己写一个例子:

 

apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-exec
spec:containers:- name: livenessimage: busyboximagePullPolicy: IfNotPresentargs:- /bin/sh- -c- touch /tmp/healthy; sleep 10; rm -rf /tmp/healthy; sleep 15livenessProbe:exec:command:- cat- /tmp/healthyfailureThreshold: 2initialDelaySeconds: 5periodSeconds: 5

kubectl apply -f exec.yaml
kubectl get pod -w

 随后,去查看pod的详细信息,当82秒时检测存活探针失败,kubelet便会删除pod,随后重启pod

kubectl describe pod liveness-exec

 3.2httpget健康检查方式(必不可少的时port+path路径)

可以通过检测是否端口没有开启或者path路径下面的html页面是否存在 检验httpget

示例:httpGet方式

apiVersion: v1
kind: Pod
metadata:labels:test: livenessname: liveness-http
spec:containers:- name: livenessimage: k8s.gcr.io/livenessargs:- /serverlivenessProbe:httpGet:path: /healthzport: 8080httpHeaders:- name: Custom-Headervalue: AwesomeinitialDelaySeconds: 3periodSeconds: 3

在这个配置文件中,可以看到 Pod 也只有一个容器。initialDelaySeconds 字段告诉 kubelet 在执行第一次探测前应该等待 3 秒,则第4秒开始。periodSeconds 字段指定了 kubelet 每隔 3 秒执行一次存活探测。kubelet 会向容器内运行的服务(服务会监听 8080 端口)发送一个 HTTP GET 请求来执行探测。如果服务器上 /healthz 路径下的处理程序返回成功代码,则 kubelet 认为容器是健康存活的。如果处理程序返回失败代码,则 kubelet 会杀死这个容器并且重新启动它。

任何大于或等于 200 并且小于 400 的返回代码标示成功,其它返回代码都标示失败。

 

apiVersion: v1
kind: Pod
metadata:name: liveness-httpgetnamespace: default
spec:containers:- name: liveness-httpget-containerimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80livenessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 1periodSeconds: 3timeoutSeconds: 10

 

kubectl describe pod liveness-httpget

 

这里的重启 不是停止容器再次重启,而是删除容器 再次启动!!! 

3.3tcpsocket健康检查方式  指定端口号

示例:tcpSocket方式

apiVersion: v1
kind: Pod
metadata:name: goproxylabels:app: goproxy
spec:containers:- name: goproxyimage: k8s.gcr.io/goproxy:0.1ports:- containerPort: 8080readinessProbe:tcpSocket:port: 8080initialDelaySeconds: 5periodSeconds: 10livenessProbe:tcpSocket:port: 8080initialDelaySeconds: 15periodSeconds: 20

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

 

apiVersion: v1
kind: Pod
metadata:name: probe-tcp
spec:containers:- name: nginximage: soscscs/myapp:v1livenessProbe:initialDelaySeconds: 5timeoutSeconds: 1tcpSocket:port: 8080periodSeconds: 10failureThreshold: 2

 

kubectl apply -f tcpsocket.yaml

 

kubectl exec -it probe-tcp  -- netstat -natpkubectl describe pod probe-tcp #查看pod详细信息

 

重启原因:因为nginx的端口是80,而在yaml文件里面设置的tcpsocket的检测端口是8080 ,检测不到因此kubectl会杀死容器,随后重启。 

四、就绪探针

4.1就绪探针1

vim readiness-httpget.yaml
apiVersion: v1
kind: Pod
metadata:name: readiness-httpgetnamespace: default
spec:containers:- name: readiness-httpget-containerimage: soscscs/myapp:v1imagePullPolicy: IfNotPresentports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index1.htmlinitialDelaySeconds: 1periodSeconds: 3livenessProbe:httpGet:port: httppath: /index.htmlinitialDelaySeconds: 1periodSeconds: 3timeoutSeconds: 10

kubectl apply -f readiness-httpget.yamlkubectl get pods

 出现0/1 running 表示其中一个pod无法接受请求,svc要在endpoints删除未请求的ip地址

kubectl describe pod readiness-httpget

kubectl exec -it readiness-httpget sh
cd /usr/share/nginx/html/
echo "qin yu nian2" > index1.html

kubectl exec -it readiness-httpget -- rm -rf /usr/share/nginx/html/index.html
kubectl get pods -w

完成启动探针成功以后、就绪和存活探针才会生效

就绪探针与存活探针  是在启动探针探测成功以后才会生效

 4.2就绪检测2

apiVersion: v1
kind: Pod
metadata:name: myapp1labels:app: myapp
spec:containers:- name: myappimage: soscscs/myapp:v1ports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index.htmlinitialDelaySeconds: 5periodSeconds: 5timeoutSeconds: 10
---
apiVersion: v1
kind: Pod
metadata:name: myapp2labels:app: myapp
spec:containers:- name: myappimage: soscscs/myapp:v1ports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index.htmlinitialDelaySeconds: 5periodSeconds: 5timeoutSeconds: 10
---
apiVersion: v1
kind: Pod
metadata:name: myapp3labels:app: myapp
spec:containers:- name: myappimage: soscscs/myapp:v1ports:- name: httpcontainerPort: 80readinessProbe:httpGet:port: 80path: /index.htmlinitialDelaySeconds: 5periodSeconds: 5timeoutSeconds: 10
---
apiVersion: v1
kind: Service
metadata:name: myapp
spec:selector:app: myapptype: ClusterIPports:- name: httpport: 80targetPort: 80

kubectl apply -f readiness-myapp.yamlkubectl get pod -owide -wkubectl get pods,svc,endpoints -owide

 

 删除页面,看效果

kubectl exec -it  myapp1 -- rm -rf /usr/share/nginx/html/index.html

 

kubectl get svc,pod,endpoints -owide

readiness探测失败,Pod 无法进入READY状态,且端点控制器将从 endpoints 中剔除删除该 Pod 的 IP 地址 

kubectl get pods -owide -w

 恢复页面,查看内容

 4.3启动、退出动作

poststart 启动动作

prestop  推出动作

vim demo-pod02.yaml

apiVersion: v1
kind: Pod
metadata:name: lifecycle-demo
spec:containers:- name: lifecycle-demo-containerimage: soscscs/myapp:v1lifecycle:   #此为关键字段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-logmountPath: /var/log/nginx/readOnly: falseinitContainers:- name: init-myserviceimage: soscscs/myapp:v1command: ["/bin/sh", "-c", "echo 'Hello initContainers'   >> /var/log/nginx/message"]volumeMounts:- name: message-logmountPath: /var/log/nginx/readOnly: falsevolumes:- name: message-loghostPath:path: /data/volumes/nginx/log/type: DirectoryOrCreate

kubectl apply -f demo-pod02.yaml

 

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

 

 在 node02 节点上查看

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

删除 pod 后,再在 node02 节点上查看

kubectl delete pod lifecycle-demonode02操作
cd /data/volumes/nginx/log/
cat message

 

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

 4.4验证启动探针、 就绪探针、存活探针的顺序

vim demo-pod03.yaml

apiVersion: v1
kind: Pod
metadata:labels:test: demo1name: demo1
spec:containers:- name: nginximage: soscscs/myapp:v1ports:- containerPort: 80name: http
#设置存活探针,探测pod容器的运行状态,一旦探测失败,那么就会通过kubelet杀掉容器livenessProbe:httpGet:  #采用httpGet的方式 会像podip的指定端口发送http GET请求port: httppath: /index.html      #做http健康检查的页面failureThreshold: 2      #表示连续探测失败2次才为探测失败initialDelaySeconds: 2   #表示初始等待2秒后再才是启动存活探针periodSeconds: 8         #表示探测周期为8秒
#设置就绪探针,探测pod是否处于就绪状态,如果说探测失败则为未就绪状态,service会将其从关联的pod中删除,请求也不转发给该podreadinessProbe:httpGet:  #采用httpGet的方式 会像podip的指定端口发送http GET请求port: httppath: /index.html      #做http健康检查的页面failureThreshold: 2      #表示连续探测失败2次才为探测失败initialDelaySeconds: 2   #表示初始等待2秒后再才是启动存活探针periodSeconds: 10        #表示探测周期为10秒
#启动探针,为了探测容器应用是否处于运行状态,只有启动探针探测成功以后,就绪探针和存活探针才有效startupProbe:httpGet:  #采用httpGet的方式 会像podip的指定端口发送http GET请求port: httppath: /index1.html      #做http健康检查的页面failureThreshold: 3      #表示连续探测失败3次才为探测失败initialDelaySeconds: 2   #表示初始等待2秒后再才是启动存活探针periodSeconds: 15        #表示探测周期为15秒
kubectl apply -f demo-pod03.yamlkubectl describe pod demo1

kubectl get pods -owide -w

查看日志

 

 可验证 就绪探针与存活探针  是在启动探针探测成功以后才会生效,启动探针探测成功之后,不会再运行,接下来存活探针和就绪探针同时开始运行。

 4.5k8s探针图解

五、 pod的状态


1、pending:pod已经被系统认可了,但是内部的container还没有创建出来。这里包含调度到node上的时间以及下载镜像的时间,会持续一小段时间。

2、Running:pod已经与node绑定了(调度成功),而且pod中所有的container已经创建出来,至少有一个容器在运行中,或者容器的进程正在启动或者重启状态。--这里需要注意pod虽然已经Running了,但是内部的container不一定完全可用。因此需要进一步检测container的状态。

3、Succeeded:这个状态很少出现,表明pod中的所有container已经成功的terminated了,而且不会再被拉起了。

4、Failed:pod中的所有容器都被terminated,至少一个container是非正常终止的。(退出的时候返回了一个非0的值或者是被系统直接终止)

5、unknown:由于某些原因pod的状态获取不到,有可能是由于通信问题。 一般情况下pod最常见的就是前两种状态。而且当Running的时候,需要进一步关注container的状态

六、Container生命周期


1、Waiting:启动到运行中间的一个等待状态。

2、Running:运行状态。

3、Terminated:终止状态。 如果没有任何异常的情况下,container应该会从Waiting状态变为Running状态,这时容器可用。

但如果长时间处于Waiting状态,container会有一个字段reason表明它所处的状态和原因,如果这个原因很容易能标识这个容器再也无法启动起来时,例如ContainerCannotRun,整个服务启动就会迅速返回。(这里是一个失败状态返回的特性,不详细阐述)

三种探针

存活探针(livenessProbe):探测Pod容器是否在正常运行。如果探测失败则kubelet杀掉容器,并根据容器重启策略决定是否重启容器
就绪探针(readinessProbe):探测Pod是否进入就绪状态(ready状态栏是否100%比例),并做好接收service转发来的请求准备。
如果探测失败则Pod变成未就绪状态(0/1 1/2),service就会删除相关联的Pod端点,并不再转发请求给处于未就绪状态的Pod

启动探针(startupProbe):探测Pod容器内的应用进程是否启动成功。在启动探针探测成功之前,存活探针和就绪探针都会处于暂停状态,直到启动探针探测成功为止
如果探测失败则kubelet杀掉容器,并根据容器重启策略决定是否重启容器

关于探针的3种探测方式

exec:在容器里执行linux命令,如果命令返回码为0则认为探测成功,如果命令返回码为非0值则认为探测失败
httpGet:向PodIP和指定的端口及URL路径发送HTTP GET请求,如果HTTP响应状态码为2XX 3XX则认为探测成功,如果HTTP响应状态码为4XX 5XX则认为探测失败
tcpSocket:向PodIP和指定的端口发送TCP连接请求(三次握手),如果端口正确且TCP连接成功则认为探测成功,如果TCP连接失败则认为探测失败
探针参数:

initialDelaySeconds:指定容器启动后延迟探测的时间(单位为秒)
periodSeconds:指定每次探测的间隔时间
failureThreshold:指定判定探测失败的连续失败次数
timeoutSeconds:指定探测超时等待的时间
Pod容器的启动动作和退出动作:lifecycle.postStart|preStop(lifecycle与image字段同一层级)
lifecycle.postStart      设置Pod容器启动时额外执行的操作,此操作不会作为容器pid=1的主进程
lifecycle.preStop        设置Pod容器被kubelet杀掉退出时执行的操作

相关文章:

k8s集群中pod的容器资源限制和三种探针

一、资源限制 总结&#xff1a; requests表示创建pod时预留的资源&#xff0c;limits表示pod能够使用资源的最大值。requests值可以被超&#xff0c;limits值不能超过&#xff0c;如果是内存使用超过limits会触发oom然后杀掉进程&#xff0c;如果是cpu超过limits会压缩cpu的使用…...

tar 详细说明

tar命令在Unix和类Unix系统中被广泛用于打包和压缩文件。以下是对tar命令的详细说明&#xff1a; 一、命令概述 tar命令的名称来源于“tape archive”&#xff08;磁带存档&#xff09;&#xff0c;最初设计用于在磁带上创建备份。现在&#xff0c;它已成为在Unix和类Unix系统…...

渗透测试工具Cobalt strike-2.CS基础使用

三、结合metasploit,反弹shell 在kali中开启使用命令开启metasploit msfconsole ┌──(root㉿oldboy)-[~] └─# msfconsole --- msf6 > use exploit/multi/handler [*] Using configured payload generic/shell_reverse_tcp --- msf6 exploit(multi/handler) > show …...

【UE5.1 角色练习】08-物体抬升、抛出技能 - part2

目录 前言 效果 步骤 一、让物体缓慢的飞向手掌 二、向着鼠标方向发射物体 前言 在上一篇&#xff08;【UE5.1 角色练习】08-物体抬升、抛出技能 - part1&#xff09;的基础上继续完成角色将物体吸向手掌&#xff0c;然后通过鼠标点击的方向来发射物体的功能。 效果 步骤…...

Java面试题--JVM大厂篇(1-10)

引言&#xff1a; 在这个信息时代&#xff0c;对于准备进入大厂工作的朋友们来说&#xff0c;对于JVM&#xff08;Java虚拟机&#xff09;的掌握是面试中的一项重要内容。下面是一些精选的JVM面试题&#xff0c;希望对大家能有所帮助。 正文&#xff1a; 1. JVM有哪几种垃圾收…...

【知识拓展】机器学习基础(一):什么是预处理对象、模型对象 、pipeline、Tokenizer

前言 公司业务需要一套可离线部署的检索增强生成(RAG)大模型知识库&#xff0c;于是最近花了一周时间了解了AI相关的技术。除了查阅各类高质量技术博客&#xff0c;也自行动手进行了一些demo样例。其中包括huggingface、modelscope等平台&#xff0c;虽能使用&#xff0c;但疑惑…...

Linux dig 命令

dig 命令是一个用于在 Unix/Linux 操作系统中执行 DNS 查询的工具。它是 DNS 客户端&#xff0c;通常用于查询 DNS 服务器的信息&#xff0c;如域名解析、IP 地址查询等。 博主博客 https://blog.uso6.comhttps://blog.csdn.net/dxk539687357 一、常见 DNS 记录类型 类型描述…...

后台接口返回void有设置response相关内容,前端通过open打开接口下载excel文件

1、引入依赖&#xff0c;用来生成excel <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.1.2</version></dependency> 2、接口类代码如下&#xff1a; /*** 企业列表--导出*/Api…...

scp问题:Permission denied, please try again.

我把scp归纳三种情况&#xff1a; 源端root——》目标端root 源端root——》目标端mysql&#xff08;任意&#xff09;用户 源端&#xff08;任意用户&#xff09;——》目标端root用户 在scp传输文件的时候需要指导目标端的用户密码&#xff0c;如root用户密码、mysql用户…...

new CCDIKSolver( OOI.kira, iks ); // 创建逆运动学求解器

demo案例 new CCDIKSolver(OOI.kira, iks); 在使用某个特定的库或框架来创建一个逆运动学&#xff08;Inverse Kinematics, IK&#xff09;求解器实例。逆运动学在机器人学、动画和计算机图形学等领域中非常重要&#xff0c;它用于根据期望的末端执行器&#xff08;如机器人的…...

【Go】Swagger v2 转 OpenApi v3 CLI - swag2op

写这个工具的原因&#xff0c;也是受万俊峰老师的启发&#xff0c;他把工作中重复的事情&#xff0c;整合到一个工具&#xff0c;然后开源&#xff0c;这件事很赞。 swag2op 在 【Go】Go Swagger 生成和转 openapi 3.0.3 这篇文档&#xff0c;主要是对 swagger 如何生成&#…...

python Z-score标准化

python Z-score标准化 Zscore标准化sklearn库实现Z-score标准化手动实现Z-score标准化 Zscore标准化 Z-score标准化&#xff08;也称为标准差标准化&#xff09;是一种常见的数据标准化方法&#xff0c;它将数据集中的每个特征的值转换为一个新的尺度&#xff0c;使得转化后的…...

人工智能的数学基础(高数)

&#x1f31e;欢迎来到人工智能的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f31f;本文由卿云阁原创&#xff01; &#x1f4c6;首发时间&#xff1a;&#x1f339;2024年5月29日&…...

React(四)memo、useCallback、useMemo Hook

目录 (一)memo API 1.先想一个情景 2.用法 (1)props传入普通数据类型的情况 (2)props传入对象的情况 (3)props传入函数的情况 (4)使用自定义比较函数 3.什么时候使用memo&#xff1f; (二)useMemo Hook 1.用法 2.useMemo实现组件记忆化 3.useMemo实现函数记忆化 …...

前端介绍及工具环境搭建

前端发展历史 前端介绍 1.什么是前端 前端 &#xff1a;针对浏览器的开发&#xff0c;代码在浏览器中运行后端 &#xff1a;针对服务器的开发&#xff0c;代码在服务器中运行 2.前端的用处&#xff1f; 前端在现代技术环境中扮演着⾄关重要的⻆⾊。 作为⽤户与⽹站或应⽤程…...

uniapp高校二手书交易商城回收系统 微信小程序python+java+node.js+php

每年因为有大量的学生在接受教育&#xff0c;每到大学毕业季的时候&#xff0c;所使用的大量书籍对他们自己来说&#xff0c;很多是没有用&#xff0c;同时由于书籍多和不方便携带&#xff0c;导致很多大学生在毕业时将教材直接丢弃是在校大学生处理已用教材的一种主要方式。然…...

Vue3 图片或视频下载跨域或文件损坏的解决方法

Vue3 图片或视频下载跨域或文件损坏的解决方法 修改跨域配置文件下载方法 修改跨域配置文件 修改vite.config.ts文件proxy里面写跨域地址&#xff0c;如下图&#xff0c;图片地址就是我们要跨域的目标地址&#xff1a; 下载方法 如下就是我取消上面那句后的报错 然后调用两…...

vue2和3区别

Vue2和Vue3在**源码架构、性能提升以及API设计**等方面存在区别。具体分析如下&#xff1a; 1. **源码架构** - **Vue2**&#xff1a;Vue2的源码相对更传统&#xff0c;主要使用Options API来构建组件。这种方式要求开发者在一个对象中定义组件的各种属性&#xff08;如data、m…...

倍福TwinCAT3 PLC编程软件下载安装

1、哪里下载TwinCAT3 链接: Search result | 倍福 中国https://www.beckhoff.com.cn/zh-cn/support/download-finder/search-result/?download_group=97028248下载倍福PLC编程软件需要注册,大家可以提前注册,注册好后就可以开始愉快的下载了 安装前需要注意将各杀毒软件卸…...

Linux一键式管理jar程序执行周期【完整脚本复制可用】

最近由于频繁更新程序&#xff0c;项目又没有自动部署架构&#xff0c;单独执行脚本很麻烦。因此整理了一个脚本&#xff0c;一键式执行。 linux脚本执过程&#xff1a; 1.ps -ef|grep xxx.jar 查询.jar的进程&#xff0c; 2.如果有删除kill -9 进程。 3. 进程删除成功后 nohup…...

设计模式之六大设计原则

文章目录 高内聚低耦合设计原则开闭原则单一职责原则里氏代换原则依赖倒置原则迪米特原则接口隔离原则 高内聚低耦合 提高代码的可读性、可维护性和可扩展性&#xff0c;降低开发和维护的成本&#xff0c;并减少系统的风险 内聚&#xff1a; 内聚表示一个模块内部各个元素之间…...

【iOS】UI学习(一)

UI学习&#xff08;一&#xff09; UILabelUIButtonUIButton事件 UIViewUIView对象的隐藏UIView的层级关系 UIWindowUIViewController定时器与视图对象 UISwitch UILabel UILabel是一种可以显示在屏幕上&#xff0c;显示文字的一种UI。 下面使用代码来演示UILabel的功能&#…...

如何使用Vue和Markdown实现博客功能

创建Vue项目和安装依赖 npm install -g @vue/cli vue create vue-blog cd vue-blog npm install vue-markdown-loader --save-dev配置Vue项目以解析Markdown 在 vue.config.js 文件中添加以下配置: module.exports = {chainWebpack: config => {config...

1初识C#

1、Console安慰 Console.WriteLine("Hello, world!"); // 输出 "Hello, world!" 并换行 Console.WriteLine(123.45); // 输出数字 123.45 并换行 Console.WriteLine("Name: " name); // 输出 "Name: [变量name的值]" 并换行 2、 C…...

查询指定会话免打扰

查询指定用户&#xff08;requestId) 为指定会话&#xff08;targetId&#xff09;的设置的免打扰状态。 提示 该设置为用户级别设置。对应的设置接口详见设置指定会话免打扰。 请求方法 POST&#xff1a; https://数据中心域名/conversation/notification/get.json 频率限…...

Linux-命令

添加权限方法及注意事项: 字母权限法很灵活,无论目录还是文件都可以随意添加删除超级权限 chmod us ... 添加SUID chmod gs ... 添加SGID chmod s ...同时添加SUID和SGID chmod -s ...同时删除SUID和SGID chmod ot ...添加Sticky chmod t ...同上 数字权限表示法添加/删除…...

STM32读写内部FLASH读取芯片id

文章目录 读写内部Flash接线程序编写测试效果补充 读取芯片id代码编写 读写内部Flash 接线 程序编写 首先使用ThisFlash.c来写入flash的基本操作&#xff0c;写入、读取、擦除&#xff0c;然后使用Store.c配合数组来进行主存与flash的交互 ThisFlash.c #include "stm32…...

前端npm打包及报错解决

前端npm install 安装node 下载地址 https://nodejs.org/en/download/prebuilt-binaries 配置环境变量 wget https://nodejs.org/dist/v14.21.3/node-v14.21.3-linux-x64.tar.xz tar xf node-v14.21.3-linux-x64.tar.xz -C /data/ vim /etc/profile export NODE_HOME/data/n…...

vbs执行报错vbs没有文件拓展,双击无法打开

如果看不到文件扩展名需要设置&#xff1a; 无法双击打开vbs 一般为注册表问题 解决办法 将下方代码保存为xxx.reg Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\.VBS] "VBSFile" [HKEY_CLASSES_ROOT.VBS\PersistentHandler] "{5e941d80-bf96-…...

超详细的前后端实战项目(Spring系列加上vue3)前端篇(二)(一步步实现+源码)

好了&#xff0c;兄弟们&#xff0c;继昨天的项目之后&#xff0c;开始继续敲前端代码&#xff0c;完成前端部分 昨天完成了全局页面的代码&#xff0c;和登录页面的代码&#xff0c;不过昨天的代码还有一些需要补充的&#xff0c;这里添加一下 内容补充&#xff1a;在调用登…...