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

带你深入学习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: IfNotPresent

imagePullPolicy: 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&#xff08;负载均衡&#xff0c;自动发起&#xff09; 6、更新应用版本 三、编写yaml文件 四、Pod生命周期…...

前端系列11集-ES6 知识总结

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

连接分析工具箱 | 利用CATO进行结构和功能连接重建

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

【目标检测论文阅读笔记】Detection of plane in remote sensing images using super-resolution

Abstract 由于大量的小目标、实例级噪声和云遮挡等因素&#xff0c;遥感图像的目标检测精度低&#xff0c;漏检率或误检率高。本文提出了一种新的基于SRGAN和YOLOV3的目标检测模型&#xff0c;称为SR-YOLO。解决了SRGAN网络 对超参数的敏感性和模态崩溃问题。同时&#xff0c;Y…...

外卖app开发流程全解析

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

BUUCTF jarvisoj_level0

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

网络安全之入侵检测

目录 网络安全之入侵检测 入侵检测经典理论 经典检测模型 入侵检测作用与原理 意义 异常检测模型&#xff08;Anomaly Detection&#xff09; 误用检测模型&#xff08;Misuse Detection&#xff09; 经典特征案例 ​编辑自定义签名 ​编辑 签名检查过程 检测生命周期…...

元数据管理

1、业务元数据 描述 ”数据”背后的业务含义主题定义&#xff1a;每段 ETL、表背后的归属业务主题。业务描述&#xff1a;每段代码实现的具体业务逻辑。标准指标&#xff1a;类似于 BI 中的语义层、数仓中的一致性事实&#xff1b;将分析中的指标进行规范化。标准维度&#xf…...

C# WebService的开发以及客户端调用

目录 1、WebService简介 1.1 什么是XML&#xff1f; 1.2 什么是Soap&#xff1f; 1.3 什么是WSDL&#xff1f; 2、WebService与WebApi的区别与优缺点 2.1 WebService与WebApi的区别&#xff1a; 2.2 WebService的优缺点&#xff1a; 2.3 WebApi的优缺点&#xff1a; 3…...

有符号数和无符号数左移和右移

主要是有符号数的左移。 有的说不管符号位&#xff0c;直接左移&#xff0c;所以可以一会正数一会复数 https://bbs.csdn.net/topics/391075092 有的说符号位不动&#xff0c;其他来左移 不明白了。。。。 https://blog.csdn.net/hnjzsyjyj/article/details/119721014 https://…...

Netty小白入门教程

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

【逻辑位移和算数位移】

<< 运算符 && >> 运算符 正数位移 当 x>>n 中 x 为正数时&#xff0c;会将x的所有位右移x位&#xff0c;同时左边高位补0 显而易见&#xff0c;运算结束后&#xff0c;值为1 。 可知右移n位&#xff0c;结果就是 x / 2^n&#xff1a;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 在边选择模式&#xff0c;选中一条边&#xff0c;右键&…...

Java与Python、Node.js在人工智能和区块链应用程序开发中的比较

背景 Java、Python和Node.js都是常用的编程语言,它们在不同领域都有广泛的应用。在人工智能和区块链应用程序开发中,这三种语言都具有各自的优势和劣势。 Java的优势 Java在企业级应用中应用广泛,这得益于其跨平台性、安全性和稳定性等特点。在人工智能和区块链应用程序开…...

【计算机是怎么跑起来的】基础:计算机三大原则

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

NXP公司LPC21XX+PID实现稳定温度控制

本例使用的是LPC21XX系列芯片提供的PWM功能实现稳定的温度控制。首先我们获得当前环境温度之后&#xff0c;再用设定的温度与当前温度相减&#xff0c;通过PID算法计算出当前输出脉宽&#xff0c;并将其输出到L298N模块中&#xff0c;使加热丝发热&#xff0c;形成闭环&#xf…...

【CE实战-生化危机4重置版】实现角色瞬移、飞翔

▒ 目录 ▒ 🛫 导读需求开发环境1️⃣ CE扫描内存,定位坐标地址(加密后的地址)2️⃣ 硬件写入断点,定位真实坐标地址内存写入断点,定位到访问地址分析代码...

强烈建议互联网人转战实体和农业,去了就是降维打击!实体太缺人才了,老板也不缺钱!...

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

如何将 github pages 迁移到 vercel 上托管

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

2023五一数学建模竞赛(五一赛)选题建议

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

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

Neo4j 集群管理:原理、技术与最佳实践深度解析

Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

html-<abbr> 缩写或首字母缩略词

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

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Razor编程中@Html的方法使用大全

文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...