Kubernetes高级功能
资源配额
什么是资源配额
资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。
资源配额应用
创建的ResourceQuota对象将在test名字空间中添加限制,每个容器必须设置内存请求(memory request),内存限额(memory limit),cpu请求(cpu request)和cpu限额(cpu limit),所有容器的内存请求总额不得超过2GiB,所有容器的内存限额总额不得超过4 GiB,所有容器的CPU请求总额不得超过2 CPU,所有容器的CPU限额总额不得超过4CPU
[root@master ~]# cat namespace_ResourceQuota.yaml
apiVersion: v1
kind: Namespace
metadata:name: test
---
apiVersion: v1
kind: ResourceQuota
metadata:name: mem-cpu-quotanamespace: test
spec:hard:requests.cpu: "2"requests.memory: 2Gilimits.cpu: "4"limits.memory: 4Gi
[root@master ~]# kubectl apply -f namespace_ResourceQuota.yaml
namespace/test created
resourcequota/mem-cpu-quota created# 可以通过describe查看到test命名空间中我们设置的资源配额限制
[root@master ~]# kubectl describe ns test
Name: test
Labels: kubernetes.io/metadata.name=test
Annotations: <none>
Status: ActiveResource QuotasName: mem-cpu-quotaResource Used Hard-------- --- ---limits.cpu 0 4limits.memory 0 4Girequests.cpu 0 2requests.memory 0 2GiNo LimitRange resource.
针对Pod设置资源配额
对于有资源限制的命名空间,下面的pod,创建pod时候必须设置资源限额,否则创建失败。
requests:代表容器启动请求的资源限制,分配的资源必须要达到此要求
limits:代表最多可以请求多少资源
单位m:CPU的计量单位叫毫核(m)。一个节点的CPU核心数量乘以1000,得到的就是节点总的CPU总数量。如,一个节点有两个核,那么该节点的CPU总量为2000m。
该容器启动时请求500/2000的核心(25%)
[root@master ~]# cat pod_resources.yaml
apiVersion: v1
kind: Pod
metadata: name: test-nginxnamespace: testlabels:app: nginx
spec:containers:- name: nginxports:- containerPort: 80image: nginximagePullPolicy: IfNotPresentresources:requests:memory: "100Mi"cpu: "500m"limits:memory: "2Gi"cpu: "2"[root@master ~]# kubectl apply -f pod_resources.yaml
pod/test-nginx created
HorizontalPodAutoscaler(HPA)弹性伸缩
Horizontal Pod Autoscaling(Pod水平自动伸缩),简称HPA。HAP通过监控分析RC或者Deployment控制的所有Pod的负载变化情况来确定是否需要调整Pod的副本数量,这是HPA最基本的原理
HorizontalPodAutoscaler(简称 HPA ) 自动更新工作负载资源(例如 Deployment 或者 StatefulSet), 目的是自动扩缩工作负载以满足需求。
水平扩缩意味着对增加的负载的响应是部署更多的 Pod。 这与“垂直(Vertical)”扩缩不同,对于 Kubernetes, 垂直扩缩意味着将更多资源(例如:内存或 CPU)分配给已经为工作负载运行的 Pod。
如果负载减少,并且 Pod 的数量高于配置的最小值, HorizontalPodAutoscaler 会指示工作负载资源(Deployment、StatefulSet 或其他类似资源)缩减
HorizontalPodAutoscaler支持的指标
HPA支持的指标可以使用kubectl api-versions | grep autoscal命令查询
[root@master ~]# kubectl api-versions | grep autoscal autoscaling/v1 autoscaling/v2 autoscaling/v2beta1 autoscaling/v2beta2 |
autoscaling/v1只支持基于CPU指标的缩放;
autoscaling/v2beta1支持Resource Metrics(资源指标,如pod的CPU,内存)和Custom Metrics(自定义指标)的缩放;
autoscaling/v2beta2支持Resource Metrics(资源指标,如pod的CPU,内存)和Custom Metrics(自定义指标)和ExternalMetrics(额外指标)的缩放,但是目前也仅仅是处于beta阶段
autoscaling/v2(稳定版本)其中包括对基于内存和自定义指标执行扩缩的支持
如下图没有Metrics这个插件,所以需要部署资源清单
部署Metrics
1.上传文件components.yaml
2.上传文件道所有节点,并且加载(metrics-server_v0.6.4.tar.gz)
docker load < metrics-server_v0.6.4.tar.gz
3.执行yaml文件,即可开启Metrics
kubectl apply -f components.yaml
kubectl get pod -n kube-system
准备测试服务
1.在所有节点上传镜像文件,加载镜像(cpu_stress_v3.tar.gz)
docker load < cpu_stress_v3.tar.gz
2.在master节点,编写yaml文件,启动服务
vi stress.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: stress
spec:replicas: 1selector:matchLabels:app: stresstemplate:metadata:labels:app: stressspec:containers:- name: stressimage: cpu_stress:v3imagePullPolicy: IfNotPresentports:- containerPort: 80resources:requests:cpu: "100m"limits:cpu: "500m"---
apiVersion: v1
kind: Service
metadata:name: stress
spec:ports:- port: 80targetPort: 80selector:app: stress
4.启动服务
kubectl apply -f stress.yaml
配置HPA的两种方式
命令行配置
# --cpu-percent指定pod的cpu使用率维持在50%左右
# --min 指定pod数量最少多少
# --max 指定pod数量最多多少
kubectl autoscale deployment stress --cpu-percent=50 --min=1 --max=10[root@master ~]# kubectl autoscale deployment stress --cpu-percent=50 --min=1 --max=10
horizontalpodautoscaler.autoscaling/stress autoscaled# 查看hpa
[root@master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
stress Deployment/stress 0%/50% 1 10 1 16s
资源清单配置
# scaleTargetRef指定要缩放的目标,在这里是 "stress" 这个 Deployment
# minReplicas: 1缩放的最小 pod 数量
# maxReplicas: 10缩放的最大 pod 数量
#
[root@master ~]# cat stress_hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: stress
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: stressminReplicas: 1maxReplicas: 10metrics:- type: Resource # 指定缩放所用的指标类型,这里是资源利用率指标resource:name: cpu # 指定资源类型,这里是 CPUtarget:type: Utilization # 表示基于 CPU利用率百分比来自动扩缩容。averageUtilization: 50 # 目标 cpu 平均利用率为 50%。当利用率超过这个目标值时会缩放 pod 数量。[root@master ~]# kubectl apply -f stress_hpa.yaml
horizontalpodautoscaler.autoscaling/stress created[root@master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
stress Deployment/stress 1%/50% 1 10 1 39s
HPA测试
kubectl get hpa[root@master ~]# cat test.yaml
apiVersion: apps/v1
kind: Deployment
metadata: name: cpustress
spec:replicas: 1selector:matchLabels:app: cpustresstemplate:metadata:labels:app: cpustressspec:containers:- name: cpustressimage: alpineimagePullPolicy: IfNotPresentcommand:- "sh"- "-c"- "sed -i 's/mirrors.aliyun.com/mirrors.ustc.edu.cn/g' /etc/apk/repositories && apk update && apk add curl && while true; do curl stress/stress?duration=30&load=70 ;sleep 32;done"# 运行测试容器
[root@master ~]# kubectl apply -f test.yaml
deployment.apps/cpustress created# 查看hpa情况
[root@master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
stress Deployment/stress 62%/50% 1 10 10 51m# pod也启动了多个
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
cpustress-649d7f6485-gd6ld 1/1 Running 0 2m10s
stress-548b54ff89-2nlzk 1/1 Running 0 78s
stress-548b54ff89-5cz58 1/1 Running 0 93s
stress-548b54ff89-6cfpx 1/1 Running 0 63s
stress-548b54ff89-946kd 1/1 Running 0 78s
stress-548b54ff89-b9k48 1/1 Running 0 78s
stress-548b54ff89-k7d59 1/1 Running 0 93s
stress-548b54ff89-mw786 1/1 Running 0 63s
stress-548b54ff89-pcgc7 1/1 Running 0 93s
stress-548b54ff89-psb2f 1/1 Running 0 52m
stress-548b54ff89-zb2xl 1/1 Running 0 78s# 停止压力测试
[root@master ~]# kubectl delete -f test.yaml
deployment.apps "cpustress" deleted# 等待一段时间会发现pod数量降下来了,可能需要几分钟
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
stress-548b54ff89-psb2f 1/1 Running 0 61m
节点选择器
通过nodeSelector
nodeSelector 是节点选择约束的最简单推荐形式。你可以将 nodeSelector 字段添加到 Pod 的规约中设置你希望目标节点所具有的节点标签。 Kubernetes 只会将 Pod 调度到拥有你所指定的每个标签的节点上
[root@master ~]# cat pod_nodeSelector.yaml
apiVersion: v1
kind: Pod
metadata:name: podnodeselectornamespace: defaultlabels: app: nginx
spec:nodeSelector:disk: cephcontainers:- name: podnodeselectorports:- containerPort: 80image: nginximagePullPolicy: IfNotPresentresources:requests:memory: '100Mi'cpu: '500m'limits:memory: '1Gi'cpu: '1'# 部署资源
[root@master ~]# kubectl apply -f pod_nodeSelector.yaml
pod/podnodeselector created# 可以看到没有节点带有disk=ceph标签,所以pod是Pending
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
podnodeselector 0/1 Pending 0 39s
[root@master ~]# kubectl get node -l disk=ceph
No resources found# 给node1节点打标签,然后pod就自动运行在有指定标签的节点了
[root@master ~]# kubectl label node node1 disk=ceph
node/node1 labeled
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
podnodeselector 1/1 Running 0 2m46s 10.244.1.3 node1 <none> <none>
通过nodeName
nodeName 是比亲和性或者 nodeSelector 更为直接的形式。nodeName 是 Pod 规约中的一个字段。如果 nodeName 字段不为空,调度器会忽略该 Pod, 而指定节点上的 kubelet 会尝试将 Pod 放到该节点上。 使用 nodeName 规则的优先级会高于使用 nodeSelector 或亲和性与非亲和性的规则。
局限性:
如果所指代的节点不存在,则 Pod 无法运行,而且在某些情况下可能会被自动删除。
如果所指代的节点无法提供用来运行 Pod 所需的资源,Pod 会失败, 而其失败原因中会给出是否因为内存或 CPU 不足而造成无法运行。
在云环境中的节点名称并不总是可预测的,也不总是稳定的
[root@master ~]# cat nodeName.yaml
apiVersion: v1
kind: Pod
metadata:name: podnodeselectornamespace: defaultlabels: app: nginx
spec:nodeName: node1containers:- name: podnodeselectorports:- containerPort: 80image: nginximagePullPolicy: IfNotPresent
[root@master ~]# kubectl apply -f nodeName.yaml
pod/podnodeselector created
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
podnodeselector 1/1 Running 0 11s 10.244.1.4 node1 <none> <none>
亲和性
Affinity 翻译成中文是“亲和性”,它对应的是 Anti-Affinity,我们翻译成“互斥”。这两个词比较形象,可以把 pod 选择 node 的过程类比成磁铁的吸引和互斥,不同的是除了简单的正负极之外,pod 和 node 的吸引和互斥是可以灵活配置的
优点:
匹配有更多的逻辑组合,不只是字符串的完全相等
调度分成软策略(soft)和硬策略(hard),在软策略下,如果没有满足调度条件的节点,pod会忽略这条规则,继续完成调度
Node亲和性
[root@master ~]# cat pod-node-affinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-node-affinity-demonamespace: defaultlabels:app: nginx
spec:containers:- name: nginxports:- containerPort: 80image: nginximagePullPolicy: IfNotPresentaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: disktypeoperator: Invalues:- ssd- hhd[root@master ~]# kubectl apply -f pod-node-affinity-demo.yaml
pod/pod-node-affinity-demo created# 查看pod状态是Pending,因为没有节点带有disktype=ssd标签或者disktype=hhd标签
[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
pod-node-affinity-demo 0/1 Pending 0 30s
[root@master ~]# kubectl get node -l disktype=ssd
No resources found
[root@master ~]# kubectl get node -l disktype=hhd
No resources found# 打标签以后发现节点就运行了,并且是运行在打赏标签的哪个节点上
[root@master ~]# kubectl label node node1 disktype=ssd
node/node1 labeled
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-node-affinity-demo 0/1 ContainerCreating 0 3m4s <none> node1 <none> <none>
Pod亲和性
pod自身的亲和性调度有两种表示形式
podaffinity:pod和pod更倾向腻在一起,把相近的pod结合到相近的位置,如同一区域,同一机架,这样的话pod和pod之间更好通信,比方说有两个机房,这两个机房部署的集群有1000台主机,那么我们希望把nginx和tomcat都部署同一个地方的node节点上,可以提高通信效率;
podunaffinity:pod和pod更倾向不腻在一起,如果部署两套程序,那么这两套程序更倾向于反亲和性,这样相互之间不会有影响。
第一个pod随机选则一个节点,做为评判后续的pod能否到达这个pod所在的节点上的运行方式,这就称为pod亲和性;我们怎么判定哪些节点是相同位置的,哪些节点是不同位置的;我们在定义pod亲和性时需要有一个前提,哪些pod在同一个位置,哪些pod不在同一个位置,这个位置是怎么定义的,标准是什么?以节点名称为标准,这个节点名称相同的表示是同一个位置,节点名称不相同的表示不是一个位置。
topologyKey:
位置拓扑的键,这个是必须字段
怎么判断是不是同一个位置:
rack=rack1
row=row1
使用rack的键是同一个位置
使用row的键是同一个位置
labelSelector:
我们要判断pod跟别的pod亲和,跟哪个pod亲和,需要靠labelSelector,通过labelSelector选则一组能作为亲和对象的pod资源
namespace:
labelSelector需要选则一组资源,那么这组资源是在哪个名称空间中呢,通过namespace指定,如果不指定namespaces,那么就是当前创建pod的名称空间
[root@master ~]# cat podAffinity.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx01namespace: defaultlabels:app01: nginx01
spec:containers:- name: mynginxports:- containerPort: 80image: nginximagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Pod
metadata:name: nginx02namespace: defaultlabels:app02: nginx02
spec:containers:- name: mynginxports:- containerPort: 80image: nginximagePullPolicy: IfNotPresentaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: app01operator: Invalues: - nginx01topologyKey: kubernetes.io/hostname # 每个节点都有kubernetes.io/hostname标签,这个标签通常是主机名,topologyKey指定了这个标签意思就是限定在一个节点上
[root@master ~]# kubectl apply -f podAffinity.yaml
pod/nginx01 created
pod/nginx02 created
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx01 1/1 Running 0 82s 10.244.1.5 node1 <none> <none>
nginx02 1/1 Running 0 82s 10.244.1.6 node1 <none> <none>
反亲和 性
[root@master ~]# cat podAntiAffinity.yaml
apiVersion: v1
kind: Pod
metadata:name: nginx01namespace: defaultlabels:app01: nginx01
spec:containers:- name: mynginxports:- containerPort: 80image: nginximagePullPolicy: IfNotPresent
---
apiVersion: v1
kind: Pod
metadata:name: nginx02namespace: defaultlabels:app02: nginx02
spec:containers:- name: mynginxports:- containerPort: 80image: nginximagePullPolicy: IfNotPresentaffinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: app01operator: Invalues: - nginx01topologyKey: kubernetes.io/hostname
[root@master ~]# kubectl apply -f podAntiAffinity.yaml
pod/nginx01 created
pod/nginx02 created
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx01 1/1 Running 0 95s 10.244.1.7 node1 <none> <none>
nginx02 1/1 Running 0 95s 10.244.2.2 node2 <none> <none>
污点容忍
节点亲和性 是 Pod 的一种属性,它使 Pod 被吸引到一类特定的节点 (这可能出于一种偏好,也可能是硬性要求)。 污点(Taint) 则相反——它使节点能够排斥一类特定的 Pod。
容忍度(Toleration) 是应用于 Pod 上的。容忍度允许调度器调度带有对应污点的 Pod。 容忍度允许调度但并不保证调度:作为其功能的一部分, 调度器也会评估其他参数。
污点和容忍度(Toleration)相互配合,可以用来避免 Pod 被分配到不合适的节点上。 每个节点上都可以应用一个或多个污点,这表示对于那些不能容忍这些污点的 Pod, 是不会被该节点接受的。
污点
我们给节点打一个污点,不容忍的pod就运行不上来,污点就是定义在节点上的键值属性数据,可以定决定拒绝那些pod。
使用kubeadm安装的Kubernetes集群的master节点默认具有node-role.kubernetes.io/master:NoSchedule污点。
每个污点有一个key和value作为污点的标签,effect描述污点的作用。当前taint effect支持如下效果:
- NoSchedule:表示K8S将不会把Pod调度到具有该污点的Node节点上
- PreferNoSchedule:表示K8S将尽量避免把Pod调度到具有该污点的Node节点上
- NoExecute:表示K8S将不会把Pod调度到具有该污点的Node节点上,同时会将Node上已经存在的Pod驱逐出去
添加污点
# 给节点 node1 增加一个污点,它的键名是 key1,键值是 value1,效果是 NoSchedule
kubectl taint nodes node1 key1=value1:NoSchedule
查看污点
# 查询node1节点的污点,找到Taints
kubectl describe nodes node1[root@master ~]# kubectl describe nodes node1 | grep Taints
Taints: key1=value1:NoSchedule
删除污点
# 去除节点node1的污点,它的键名是 key1,键值是 value1,效果是 NoSchedule
kubectl taint nodes node1 key1=value1:NoSchedule-
容忍
默认情况下,Pod是不会运行在具有污点的节点上,但是我们可以配置容忍,让Pod运行在这个节点
设置污点
[root@master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 6d23h v1.23.0
node1 Ready <none> 6d23h v1.23.0
node2 Ready <none> 6d23h v1.23.0
[root@master ~]# kubectl taint node node1 node-type=test:NoSchedule
node/node1 tainted
[root@master ~]# kubectl taint node node2 node-type=production:NoSchedule
node/node2 tainted
运行没有容忍的Pod
[root@master ~]# cat nginx-taint.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: defaultlabels:app: nginx
spec:containers:- name: nginximage: nginxports:- name: httpcontainerPort: 80
[root@master ~]# kubectl apply -f nginx-taint.yaml
pod/nginx created[root@master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx 0/1 Pending 0 15s# 使用describe查询
[root@master ~]# kubectl describe pod nginx
Name: nginx
Namespace: default
Priority: 0
Node: <none>
Labels: app=nginx
Annotations: <none>
Status: Pending
IP:
IPs: <none>
Containers:nginx:Image: nginxPort: 80/TCPHost Port: 0/TCPEnvironment: <none>Mounts:/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-7tgj2 (ro)
Conditions:Type StatusPodScheduled False
Volumes:kube-api-access-7tgj2:Type: Projected (a volume that contains injected data from multiple sources)TokenExpirationSeconds: 3607ConfigMapName: kube-root-ca.crtConfigMapOptional: <nil>DownwardAPI: true
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---- ------ ---- ---- -------Warning FailedScheduling 54s default-scheduler 0/3 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate, 1 node(s) had taint {node-type: production}, that the pod didn't tolerate, 1 node(s) had taint {node-type: test}, that the pod didn't tolerate.
运行带有容忍的Pod
[root@master ~]# cat nginx-taint.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: defaultlabels:app: nginx
spec:containers:- name: nginximage: nginxports:- name: httpcontainerPort: 80# 容忍key是node-type,value是production,污点级是NoSchedule的污点tolerations:- key: "node-type"operator: "Equal"value: "production"effect: "NoSchedule"
[root@master ~]# kubectl apply -f nginx-taint.yaml
pod/nginx configured# 因为该Pod定义了容忍node-type=production:NoSchedule污点所以可以在node2节点运行
[root@master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx 1/1 Running 0 3m24s 10.244.2.3 node2 <none> <none># 只要对应的键是存在的,exists,其值被自动定义成通配符
tolerations:
- key: "node-type"operator: "Exists"value: ""effect: "NoSchedule# 有一个node-type的键,不管值是什么,不管是什么效果,都能容忍
tolerations:
- key: "node-type"operator: "Exists"value: ""effect: ""
相关文章:
Kubernetes高级功能
资源配额 什么是资源配额 资源配额,通过 ResourceQuota 对象来定义,对每个命名空间的资源消耗总量提供限制。 它可以限制命名空间中某种类型的对象的总数目上限,也可以限制命名空间中的 Pod 可以使用的计算资源的总上限。 资源配额应用 创建的…...
(作业)第三期书生·浦语大模型实战营(十一卷王场)--书生入门岛通关第1关Linux 基础知识
关卡任务 闯关任务需要在关键步骤中截图: 任务描述 完成所需时间 闯关任务 完成SSH连接与端口映射并运行hello_world.py 10min 可选任务 1 将Linux基础命令在开发机上完成一遍 10min 可选任务 2 使用 VSCODE 远程连接开发机并创建一个conda环境 10min 可选任务 3 创…...
【python爬取网页信息并存储】
爬取网页信息并存储是一个常见的任务,通常涉及以下几个步骤: 发送HTTP请求:使用库如requests来发送HTTP请求获取网页内容。解析网页内容:使用库如BeautifulSoup或lxml来解析HTML内容,提取所需信息。存储数据ÿ…...
TCP、UDP
TCP和UDP的区别 是否面向连接:UDP 在传送数据之前不需要先建立连接。而 TCP 提供面向连接的服务,在传送数据之前必须先建立连接,数据传送结束后要释放连接。 是否是可靠传输:远地主机在收到 UDP 报文后,不需要给出任…...
聊聊暖通空调系统的优化控制方法
目录 暖通空调系统的优化控制方法✈️part1 初版回归网络建模✈️part2 更新的回归网络✈️ 聊聊暖通空调系统的优化控制方法 这篇文章简单分享一下暖通空调(HVAC)领域常常提到的”优化控制“这一概念指的是什么,它控制的是哪些参数&#…...
2024年合肥市职业院校技能大赛(中职组)赛 网络安任务书样题
2024年合肥市职业院校技能大赛--中职组赛 网络安任务书样题 一、竞赛项目简介:二、竞赛注意事项模块A: 理论技能与职业素养模块B: 网络安全事件响应、数字取证调查和应用安全任务一:应急响应任务二:操作系统取证任务三:网络数据包分析任务四:代码审计 模块C:CTF 夺旗…...
制造企业如何提升项目管理效率?惠科股份选择奥博思PowerProject项目管理系统
全球知名的显示方案综合服务商 - 惠科股份有限公司与北京奥博思达成合作,基于奥博思 PowerProject 搭建企业级项目管理平台。满足惠科多产品多业务领域的项目全周期管理。助力企业在技术研发、产品创新等方面继续取得行业领先优势。 同时,PowerProject …...
mTLS(Mutual TLS)即双向传输层安全,是一种安全通信协议,用于在客户端和服务器之间建立双向的身份验证和加密通道。
mTLS(Mutual TLS)即双向传输层安全,是一种安全通信协议,用于在客户端和服务器之间建立双向的身份验证和加密通道。在传统的TLS(Transport Layer Security)中,客户端通常只会验证服务器的身份&am…...
HUAWEI WATCH GT 系列安装第三方应用
文章目录 适用机型概述官方文档从源码构建 hap 文件和对源码签名下载和安装DevEco Studio下载和安装首次启动推荐:设置IDE推荐的兼容版本环境(可选)安装并启用中文菜单插件 使用DevEco Studio打开项目并进行构建构建问题解决一、生成密钥和证…...
Html jquery下拉select美化插件——selectFilter.js
1. Html jquery下拉select美化插件——selectFilter.js jQuery是一个广泛使用的JavaScript库,它简化了DOM操作、事件处理、动画以及Ajax交互,使得开发者能更高效地构建交互式网页。在本案例中,jquery.selectlist.js插件正是基于jQuery构建的&…...
使用ESP8266扫描WiFi列表
一、简介 准备用基于esp8266的nodemcu开发板做一个天气时钟。目前只实现了第一阶段任务的第一点要求。使用arduino编程,在基于esp8266的nodemcu开发板上实现开机自动连接wifi。 这里记录一下使用ESP8266扫描WiFi列表的方法。还需要研究怎么把列表显示在网页上&…...
Java对象访问机制:句柄访问与直接指针访问
在Java虚拟机(JVM)中,对象的访问方式是一个关键的设计选择,它影响着程序的性能和内存管理。JVM规范中只规定了对象引用(reference)必须指向对象,但并没有定义这个引用应该如何定位和访问堆中对象…...
基于SpringBoot实现QQ邮箱发送短信功能 | 免费短信服务
开发学习过程中有个短信发送功能,阿里云腾讯云等等都要money,听说qq邮箱可以实现免费发送邮箱的功能(短信发送的平替),就用这个来实现!!!【找了好多好多方法才成功的啊啊啊啊&#x…...
【MySQL】聚合函数、group by子句
目录 聚合函数 count([distinct] column) sum([distinct] column) avg([distinct] column) max([distinct] column) min([distinct] column) group by子句 1.如何显示每个部门的平均薪资和最高薪资 2.显示每个部门每种岗位的平均薪资和最低薪资 3.显示平均工资低于200…...
详细分析SpringMvc中HandlerInterceptor拦截器的基本知识(附Demo)
目录 前言1. 基本知识2. Demo3. 实战解析 前言 对于Java的基本知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全)【Java项目】实战CRUD的功能整理(持续更新) 1. 基本知识 HandlerInter…...
阳光能源嵌入式面试及参考答案(2万字长文)
管道能够承载的最大传输数据量是多少? 在嵌入式系统中,管道能够承载的最大传输数据量取决于多个因素。 首先,管道的容量受到操作系统的限制。不同的操作系统对管道的大小有不同的规定。一般来说,管道的容量通常是有限的,并且在不同的操作系统版本和配置下可能会有所不同。…...
P10483 小猫爬山
1. #include<bits/stdc.h> using namespace std; //一个记录小猫的重量,sum记录当前小猫的重量之和 int n, w, a[3000],sum[3000],ans; bool cmp(int a,int b) {return a > b; } //x表示小猫当前的编号,cnt表示缆车的数量 void dfs(int x,int …...
技术速递|加入 .NET 智能组件生态系统
作者:Daniel Roth - 首席产品经理 排版:Alan Wang .NET 智能组件是一组示例嵌入式 UI 组件,使得在应用中轻松添加 AI 启用的功能变得更加简单,例如从剪贴板数据自动填写表单、智能文本补全以及语义搜索等场景。.NET 智能组件演示了…...
python/requests库的使用/爬虫基础工具/
requests 是一个 Python 库,它允许你发送 HTTP 请求。这个库需要单独安装,因为它不是 Python 标准库的一部分 1.让我们安装requests 在控制台运行 pip install requests 使用 requests 发送请求 1.GET 请求: import requestsresponse …...
【STM32-HAL库】MQ2烟雾传感器使用(STM32F407ZET6)
MQ2可燃气体传感器介绍 MQ2是一种广谱气体传感器,能够检测多种可燃气体和烟雾。它是一种低成本、高灵敏度的传感器,广泛应用于家庭和工业环境中的气体监测。 原理 MQ2传感器的工作原理基于金属氧化物半导体(MOX)技术。当传感器暴露…...
玩转指针(3)
一、字符指针变量 字符指针变量(如char* p)的两种赋值方式 ①将字符类型地址赋值给字符指针变量 int main() {char a w;char* p &a;*p m;return 0; }②将常量字符串赋值给字符指针变量 常量字符串的介绍:用" "引起来的就…...
【CSS in Depth 2 精译_040】6.3 CSS 定位技术之:相对定位(下)—— 用纯 CSS 绘制一个三角形
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第一章 层叠、优先级与继承(已完结)第二章 相对单位(已完结)第三章 文档流与盒模型(已完结)第四章 Flexbox 布局(已…...
HTML流光爱心
文章目录 序号目录1HTML满屏跳动的爱心(可写字)2HTML五彩缤纷的爱心3HTML满屏漂浮爱心4HTML情人节快乐5HTML蓝色爱心射线6HTML跳动的爱心(简易版)7HTML粒子爱心8HTML蓝色动态爱心9HTML跳动的爱心(双心版)1…...
java技能
日志实际使用 log.error(“111”,e);和 System.out.println(ExceptionUtils.getStackTrace(error)); 日志查询 tail -f root.log 前端页面命名: mounted(){ document.title‘设备可视页面’ } 查看ips所属mac nbtstat -a 10.87.236.60 获取容器名称 hostName In…...
本省第一所!新大学,揭牌!
9月26日,海南艺术职业学院举行揭牌仪式,标志着海南省第一所公办艺术类高等职业院校正式揭牌成立。海南省旅文厅党组成员、副厅长刘成出席揭牌仪式,省教育厅党组成员、副厅长邢孔政在揭牌仪式上宣读省人民政府同意设立海南艺术职业学院的批复。…...
企业微信(企微)审批与影刀RPA结合
企业微信审批与影刀RPA结合 效果先看视频: 影刀与企业微信审批结合 具体步骤: 1、登录企微管理后台,新建一个审批流。 添加模板→自定义模板,根据需求添加审批节点。 添加完之后,回到审批界面,可以看…...
新手教学系列——用 VSCode 实现高效远程开发
随着软件开发环境日益复杂,远程开发已成为许多开发者的日常工作方式。尤其当项目需要直接在服务器上运行或本地计算资源有限时,能够使用一款便捷、强大的工具至关重要。在众多 IDE 中,VSCode 因其轻量、灵活且支持丰富插件,成为远程开发的理想选择。本文将详细介绍如何通过…...
[uni-app]小兔鲜-04推荐+分类+详情
热门推荐 新建热门推荐组件, 动态设置组件的标题 <template><!-- 推荐专区 --><view class"panel hot"><view class"item" v-for"item in list" :key"item.id">... ...<navigator hover-class"none&…...
PHP人才机遇桥梁招聘求职全能系统小程序源码
人才机遇桥梁 —— 招聘求职全能系统全解析 💼🚀 🌉 搭建人才与机遇的桥梁 在这个竞争激烈的职场环境中,找到一份心仪的工作或招募到合适的人才,往往不是一件容易的事。但幸运的是,我们有了“人才机遇桥梁…...
计算机毕业设计Hadoop+Spark抖音可视化 抖音舆情监测 预测算法 抖音爬虫 抖音大数据 情感分析 NLP 自然语言处理 Hive 机器学习 深度学习
Python抖音可视化开题报告 一、研究背景与意义 随着移动互联网的迅猛发展,短视频平台如抖音已成为人们日常生活中不可或缺的一部分。抖音以其独特的算法和内容推荐机制,吸引了数以亿计的用户。然而,随着用户规模的不断扩大,如何…...
登录器显的窗口网站怎么做/看b站视频软件下载安装手机
数据结构实验之图论二:图的深度遍历 Description 请定一个无向图,顶点编号从0到n-1,用深度优先搜索(DFS),遍历并输出。遍历时,先遍历节点编号小的。 Input 输入第一行为整数n(0 < n < 100ÿ…...
秭归网站建设/南昌网站seo
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序…...
企业网站管理系统手机版教程/怎样进行seo优化
题目:原题链接(简单) 标签:动态规划 解法时间复杂度空间复杂度执行用时Ans 1 (Python)O(N)O(N)O(N)O(N)O(N)O(N)28ms (98.81%)Ans 2 (Python)Ans 3 (Python) 解法一: class Solution:def numWays(self, n: int, k: …...
做网站需不需要服务器/青岛网站制作公司
一、Kafka核心总控制器Controller 在Kafka集群中会有一个或者多个broker,其中有一个broker会被选举为控制器(Kafka Controller),它负责管理整个集群中所有分区和副本的状态。 当某个分区的leader副本出现故障时,由控…...
网站换域名后需要多长时间才能收录恢复正常/今日新闻头条大事
微信小程序常用的功能之一就是:使用微信登录微信小程序,但是登录之后拿到用户信息之后,缺少用户的唯一标识。 通常使用openid作为微信用户的唯一主键。受限于微信小程序的限制,不能直接通过小程序前端拿到openid,具体…...
网站做行业认证好处/外贸获客软件
最近开始弄支付这块,先是支付宝手机网站支付,也是坑了我许久,不过还好,问题不大。 让我们看看微信支付有多少坑 微信商户平台,你们知道么(我前天才知道,别笑我) 登录地址:…...