Kubernetes——Kubectl详解

目录

前言

一、陈述式资源管理方法

二、Kubectl命令操作

1.查

1.1kubectl version——查看版本信息

1.2kubectl api-resources——查看资源对象简写

1.3kubectl cluster-info——查看集群信息 

1.4配置Kubectl补全

1.5journalctl -u kubelet -f——查看日志

1.6kubectl get cs(componentstatuses)——查看节点状态

1.7kubectl get ns——查看命名空间

1.8kubectl get all——查看default命名空间的所有资源

1.9kubectl get  --show-labels——查看节点标签

1.10kubectl get pod -l label(-A)——根据标签进行条件查找 

1.11kubectl get pod -n ——查看具体命名空间内信息

1.12kubectl describe [-o wide|json|yaml] [-n namespace]——查看资源详细信息

1.13kubectl logs ——查看资源日志

2.增

2.1kubectl create namespace ——创建命名空间

2.2kubectl run --image -n ——指定命名空间中创建资源

2.2.1拓展

2.3kubectl create deployment --image -n ——指定命名空间中创建自主式Pod资源

3.删

3.1kubectl delete namespace ——删除命名空间

3.2kubectl delete pod -n ——删除Pod资源

3.3删除副本控制器

4.改

5.扩缩容

5.1扩容——针对并发量增加

5.2缩容——针对并发量减少

三、项目生命周期

1.创建——kubectl create

2.发布——kubectl expose

2.1Service的Type类型

2.2Port——Kubernetes集群中的Port

2.3测试Service暴露在Cluster集群使其可以访问

2.4测试Port暴露在外部流量中可以使其可以访问

2.6Endpoint——端点

3.更新——kubectl set

4.回滚——kubectl rollout

5.删除——kubectl delete

四、主要发布过程

1.蓝绿发布

2.滚动发布

3.金丝雀发布(Canary Release)灰度发布

五、声明式资源管理方法

六、总结

1.命令操作

2.Port端口

3.数据流向

4.生命周期

5.声明式管理方法


前言

本章我们来深入了解一下关于Kubernetes的命令行工具Kubectl的使用,相信前面的几篇博客都已经见到了使用Kubectl命令行工具,现在我们使用测试环境对Kubectl命令行工具管理操作进行详细解答。

管理操作分为两大类,陈述式和声明式

一、陈述式资源管理方法

  • Kubernetes 集群管理集群资源的唯一入口是通过相应的方法调用 APIServer 的接口
  • Kubectl 是官方的CLI命令行工具,用于与 APIServer 进行通信,将用户在命令行输入的命令,组织并转化为 APIServer 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径
  • Kubectl 的命令大全

kubectl --help
k8s中文文档:http://docs.kubernetes.org.cn/683.html

  • 对资源的增、删、查操作比较方便,但对改的操作就不容易了

二、Kubectl命令操作

1.查

kubectl get <resource> [-o wide|json|yaml] [-n namespace]
获取资源的相关信息,-n 指定命名空间,-o 指定输出格式
resource可以是具体资源名称,如pod nginx-xxx;也可以是资源类型,如pod;或者all(仅展示几种核心资源,并不完整)
--all-namespaces 或 -A :表示显示所有命令空间,
--show-labels :显示所有标签
-l app :仅显示标签为app的资源
-l app=nginx :仅显示包含app标签,且值为nginx的资源

1.1kubectl version——查看版本信息

1.2kubectl api-resources——查看资源对象简写

1.3kubectl cluster-info——查看集群信息 

1.4配置Kubectl补全

echo "source <(kubectl completion bash)" >> /root/.bashrc

1.5journalctl -u kubelet -f——查看日志

 -u指定服务,-f实时查看日志

1.6kubectl get cs(componentstatuses)——查看节点状态

1.7kubectl get ns——查看命名空间

命令空间的作用:用于允许不同命令空间的相同类型的资源重名

1.8kubectl get all——查看default命名空间的所有资源

1.9kubectl get <resource> --show-labels——查看节点标签

Label类似于键值对,标签的键值对以逗号分隔

1.10kubectl get pod -l label(-A)——根据标签进行条件查找 

1.11kubectl get pod -n <namespace>——查看具体命名空间内信息

模糊查找 

1.12kubectl describe <resource> [-o wide|json|yaml] [-n namespace]——查看资源详细信息

1.13kubectl logs <resource>——查看资源日志

2.增

2.1kubectl create namespace <name>——创建命名空间

2.2kubectl run <image:name> --image -n <namespace>——指定命名空间中创建资源

2.2.1拓展

由此我们看到刚刚创建的pod是在Node节点上的,现在我们假设Node2节点出现了问题

我们看到Pod也挂掉了,我们再重启Node2节点,发现静态的Pod就不存在了

但是如果对于动态的Pod的话,如果Node2挂掉的话,会重新创建一个新的Pod,并有新的节点来接替Node2的工作,如果再重启Node2之后,那么原来的Pod就会删除

2.3kubectl create deployment <image:name> --image -n <namespace>——指定命名空间中创建自主式Pod资源

这里可以明显看到使用kubectl run创建的资源只有指定的名称,但是我们使用kubectl create deployment创建的资源就会有携带的ID。

 Kubectl run创建的资源是存放在节点当中的;Kubectl create deployment创建的资源是存放在etcd中的

3.删

3.1kubectl delete namespace <name>——删除命名空间

此命令谨慎使用,因为如果命名空间中有资源存在,那么该命名空间直接被删除的话,该命名空间中的资源也不复存在了。

3.2kubectl delete pod <name> -n <namespace>——删除Pod资源

如果是删除kubectl run命令创建的资源,一旦删除不会再创建;如果是删除kubectl create deployment 命令创建的资源,一旦删除又会重新创建新的Pod资源;

若pod无法删除,总是处于terminate状态,则要强行删除pod
kubectl delete pod <pod-name> -n <namespace> --force --grace-period=0
#grace-period表示过渡存活期,默认30s,在删除pod之前允许POD慢慢终止其上的容器进程,从而优雅退出,0表示立即终止pod

  • kubectl run:创建自助式静态Pod
  • kubectl create deployment:创建deployment控制器管理的Pod

3.3删除副本控制器

kubectl delete deployment nginx-wl -n kube-public
kubectl delete deployment/nginx-wl -n kube-public

4.改

如果容器报错的话,可以跨主机登入相对应的Pod资源内对配置进行修改

5.扩缩容

5.1扩容——针对并发量增加

5.2缩容——针对并发量减少

三、项目生命周期

1.创建——kubectl create

  • 创建并运行一个或多个容器镜像。
  • 创建一个deployment 或job 来管理容器。
kubectl create --help
#启动 nginx 实例,暴露容器端口 80,设置副本数 3 ,设置所处命名空间为 cxk
kubectl create deployment nginx-cxk --image=nginx:1.14 --port=80 --replicas=3 -n cxk

kubectl get all -n cxk

2.发布——kubectl expose

将资源暴露为新的 Service

kubectl expose --help
#查看发布帮助

2.1Service的Type类型

  • ClusterIP:提供一个集群内部的虚拟IP以供Pod访问(service默认类型)
  • NodePort:在每个Node上打开一个端口以供外部访问,Kubernetes将会在每个Node上打开一个端口并且每个Node的端口都是一样的,通过 NodeIp:NodePort 的方式Kubernetes集群外部的程序可以访问Service。

每个端口只能是一种服务,端口范围只能是 30000-32767。

  • LoadBalancer:通过设置LoadBalancer映射到云服务商提供的LoadBalancer地址。这种用法仅用于在公有云服务提供商的云平台上设置Service的场景。通过外部的负载均衡器来访问,通常在云平台部署LoadBalancer还需要额外的费用。

在service提交后,Kubernetes就会调用CloudProvider在公有云上为你创建一个负载均衡服务,并且把被代理的Pod的IP地址配置给负载均衡服务做后端。

  • ExternalName:将service名称映射到一个DNS域名上,相当于DNS服务的CNAME记录,用于让Pod去访问集群外部的资源,它本身没有绑定任何的资源。 tgc.benet.com   www.benet.com 

CNAME:别名记录,多个别名记录在一台主机上,用于防止外部攻击,相当于Web服务的防火墙

  • headless clusterIP  无头模式   名称

2.2Port——Kubernetes集群中的Port

  • Port:是 k8s 集群内部访问service的端口,即通过 ClusterIP: Port 可以从 Pod 所在的 Node 上访问到 Service
  • NodePort:是外部访问 K8s 集群中 Service 的端口,通过 NodeIP: NodePort 可以从外部访问到某个 Service。
  • TargetPort:是 Pod 的端口,从 Port 或 NodePort 来的流量经过 Kube-Proxy 反向代理负载均衡转发到后端 Pod 的 TargetPort 上,最后进入容器。
  • ContainerPort:是 Pod 内部容器的端口,TargetPort 映射到 ContainerPort。

Port和NodePort都是属于四层;整体数据流向为TargetPort接收来自于Port和NodePort传来的情求,再转发给ContainerPort,TargetPort可以理解为Port的防火墙(Pod的防火墙)。

如果想修改Pod端口,要使用TargetPort

2.3测试Service暴露在Cluster集群使其可以访问

kubectl expose deployment nginx-cxk --port=8080 --target-port=80 -n cxk
#创建一个自主式Pod 可以通过8080端口转发至容器的80端口
service/nginx-cxk exposed

kubectl get svc -n cxk
NAME        TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
nginx-cxk   ClusterIP   10.108.238.71   <none>        8080/TCP   9s


curl 10.108.238.71:8080

这里可以看出基本是负载均衡轮询调度算法

2.4测试Port暴露在外部流量中可以使其可以访问

kubectl expose deployment nginx-cxk --port=80 --target-port=80 --type=NodePort -n cxk
service/nginx-cxk exposed


kubectl get svc -n cxk
NAME        TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx-cxk   NodePort   10.99.40.137   <none>        80:31119/TCP   7s

这里是算法的问题,按照负载均衡的分流算法  

2.6Endpoint——端点

kubectl get endpoints -n cxk
NAME        ENDPOINTS                                      AGE
nginx-cxk   10.244.1.13:80,10.244.1.14:80,10.244.1.15:80   9m5s

kubectl get pod -n cxk
NAME                         READY   STATUS    RESTARTS   AGE
nginx-cxk-84b96ddc7b-2qbzx   1/1     Running   0          83m
nginx-cxk-84b96ddc7b-fl6xl   1/1     Running   0          83m
nginx-cxk-84b96ddc7b-rcmtn   1/1     Running   0          83m

kubectl delete pod nginx-cxk-84b96ddc7b-2qbzx -n cxk
pod "nginx-cxk-84b96ddc7b-2qbzx" deleted

kubectl get pod -n cxk
NAME                         READY   STATUS    RESTARTS   AGE
nginx-cxk-84b96ddc7b-fl6xl   1/1     Running   0          84m
nginx-cxk-84b96ddc7b-rcmtn   1/1     Running   0          84m
nginx-cxk-84b96ddc7b-tdj5w   1/1     Running   0          37s

kubectl get endpoints -n cxk
NAME        ENDPOINTS                                      AGE
nginx-cxk   10.244.1.13:80,10.244.1.15:80,10.244.1.16:80   12m
#kubectl create deployment创建的自主式Pod在删除后会自动新建一个新的Pod,那么Endpoint会自动更新其IP地址

#查看关联后端的节点
kubectl get endpoints -n cxk
NAME        ENDPOINTS                                      AGE
nginx-cxk   10.244.1.13:80,10.244.1.15:80,10.244.1.16:80   15m

#查看 service 的描述信息
kubectl describe svc nginx

#查看负载均衡端口
yum install ipvsadm -y
ipvsadm -Ln

#外部访问的IP和端口
TCP  192.168.241.11:31119 rr
  -> 10.244.1.13:80               Masq    1      0          0         
  -> 10.244.1.15:80               Masq    1      0          0         
  -> 10.244.1.16:80               Masq    1      0          0         

#pod集群组内部访问的IP和端口
TCP  10.99.40.137:80 rr
  -> 10.244.1.13:80               Masq    1      0          0         
  -> 10.244.1.15:80               Masq    1      0          0         
  -> 10.244.1.16:80               Masq    1      0          0         

3.更新——kubectl set

更改现有应用资源一些信息

#获取修改模板
kubectl set image --help


Examples:
  # Set a deployment's nginx container image to 'nginx:1.9.1', and its busybox container image to 'busybox'.
  kubectl set image deployment/nginx busybox=busybox nginx=nginx:1.9.1
kubectl get pod -n cxk -owide

curl -I 10.244.1.13

kubectl set image deployment nginx-cxk nginx=nginx:1.15 -n cxk

kubectl get svc,pod -n cxk -owide

kubectl get pod -n cxk -owide

kubectl get pod -n cxk -owide

curl -I 10.244.1.17

25%规则,更新的测试无问题之后再删除旧版本,不会重新启动,只会先创建后删除

#处于动态监听 pod 状态,由于使用的是滚动更新方式,所以会先生成一个新的pod,然后删除一个旧的pod,往后依次类推
kubectl get pods -w

4.回滚——kubectl rollout

对资源进行回滚管理

kubectl rollout --help
#查看历史版本
kubectl rollout history deployment/nginx 

#执行回滚到上一个版本
kubectl rollout undo deployment/nginx

#执行回滚到指定版本
kubectl rollout undo deployment/nginx --to-revision=1

#检查回滚状态
kubectl rollout status deployment/nginx

5.删除——kubectl delete

#删除副本控制器
kubectl delete deployment/nginx

#删除service
kubectl delete svc/nginx-service

四、主要发布过程

1.蓝绿发布

蓝绿发布需要对服务的新版本进行冗余部署,一般新版本的机器规格和数量与旧版本保持一致,相当于该服务有两套完全相同的部署环境,只不过此时只有旧版本在对外提供服务,新版本作为热备。当服务进行版本升级时,我们只需将流量全部切换到新版本即可,旧版本作为热备。由于冗余部署的缘故,所以不必担心新版本的资源不够。如果新版本上线后出现严重的程序 BUG,那么我们只需将流量全部切回至旧版本,大大缩短故障恢复的时间。待新版本完成 BUG 修复并重新部署之后,再将旧版本的流量切换到新版本。

优点:用户无感知,业务稳定;缺点:资源消耗大,成本比较高 

2.滚动发布

按照比例分批进行滚动更新,K8S的默认更新机制就是滚动发布,无需创建一定比例的Pod,先创建再删除一定旧的Pod

3.金丝雀发布(Canary Release)灰度发布

Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后,再筛选一小部分的用户请求路由到新版本的Pod应用,继续观察能否稳定地按期望的方式运行。确定没问题之后再继续完成余下的Pod资源滚动更新,否则立即回滚更新操作。这就是所谓的金丝雀发布。

先安排一部分Pod,然后暂停更新,安排一小部分用户流量去访问更新的Pod来进行测试,当测试没问题后再扩大比例更新,直至全部更新完成为止

我们新建的Pod的版本为1.14.2的版本

将Pod资源的端口暴露在Service环境中,使得ClusterIP可以访问我们的Pod资源,此时访问的版本也是1.14.2版本

kubectl set image deployment/nginx nginx=nginx:1.15 && kubectl rollout pause deployment/nginx
#更新deployment/nginx nginx镜像变更为1.15版本  且 暂停deployment

监控更新的过程,可以看到已经新增了一个资源,但是并未按照预期的状态去删除一个旧的资源,就是因为使用了pause暂停命令

我们如果访问ServiceIP的话,会将我们调度到新的服务器上,但是这样其实是不允许的,我们要将旧版本的Nginx服务和新版本的Nginx服务进行分离

kubectl expose deployment nginx --name=new-nginx --port=80 --target-port=80 --type=NodePort

我们可以看到新版本的Nginx服务和旧版本的Nginx服务的标签不同,可以根据标签进行分离新旧版本

找到新服务的标签,将其标签写入yaml文件中,使其生效

vim new-nginx.yaml 

将selector标签选择器的内容修改为新版本的服务的标签

先删除原来的Sevice,再使用new-nginx.yaml文件生成新的Sevice,那就是此Sevice中只有新版本的一个Pod,做到了新版本的分离。

但是我们访问旧的集群的时候还是会调度到新的版本中,那么我们如何再将旧集群中的新版本进行剔除。

我们还是和新版本一样的建立方法,将标签选择器的内容指定为旧版本的标签

我们发现至此,旧版本集群中不会调度到新版本,新版本也不会调度到旧版本,新旧版本就此完成隔离,这个就是金丝雀发布!

kubectl rollout resume deployment nginx 

 我们继续将所有的Pod资源完成更新版本升级

五、声明式资源管理方法

  • 适合于对资源的修改操作
  • 声明式资源管理方法依赖于资源配置清单文件对资源进行管理

资源配置清单文件有两种格式:yaml(人性化,易读),json(易于api接口解析)

  • 对资源的管理,是通过事先定义在统一资源配置清单内,再通过陈述式命令应用到k8s集群里
  • 语法格式:kubectl create/apply/delete -f xxxx.yaml

create创建的是一次性的;apply可用于创建也可用于更新资源;delete -f yaml通过yaml格式文件对创建的资源进行统一删除

#查看资源配置清单
kubectl get deployment nginx -o yaml

#解释资源配置清单
kubectl explain deployment.metadata

#修改资源配置清单并应用


离线修改:
kubectl apply -f xxxx.yaml
#注意:当apply不生效时,先使用delete清除资源,再apply创建资源

在线修改:
直接使用 kubectl edit service nginx 在线编辑资源配置清单并保存退出即时生效(如port: 888)
PS:此修改方式不会对yaml文件内容修改
#删除资源配置清单
#陈述式删除:
kubectl delete service nginx

#声明式删除:
kubectl delete -f nginx-svc.yaml

六、总结

1.命令操作

命令含义
kubectl get (pod、service、namespace、all) -owide查看资源类型输出详细信息,也可以输出yaml、json格式
kubectl get --all-namespace 或 kubectl get -A查看所有的命名空间下的资源
kubectl create namespace <name>查看命名空间
kubectl delete namespace <name>删除命名空间
kubectl run <image:name> --image -n <namespace>创建自主式静态Pod
kubectl create deployment <image:name> --image -n <namespace>用于创建deployment控制器管理的Pod
kubectl delete pod <name> -n <namespace>删除Pod资源
kubectl scale --replicas=扩缩容
kubectl describe <resource> [-o wide|json|yaml] [-n namespace]查看pod/deployment 副本详细信息,根据信息查看pod故障

2.Port端口

Port:为Service在ClusterIP在网络中暴露端口

TargetPort:对容器映射在Pod上的端口

NodePort:可以通过K8S集群外部使用NodeIP+NodePort访问Service

ContainerPort:容器内部进程使用的端口

3.数据流向

  • Kubernetes内部:客户端----->ClusterIP:port----->Targetport----->Pod:IP----->Container:IP
  • Kubernetes外部:客户端----->NodeIP:Nodeport----->Targetport----->Pod:IP----->Container:IP

4.生命周期

  • 创建:kubectl create <资源类型> <资源名称> --image=<镜像名称> --port=端口 --replication
  • 发布:kubectl expose <资源类型> <资源名称> --port --targetport type=ClusterIP|NodePort
  • 更新:kubectl set image <资源类型> <资源名称> <容器名>-<镜像名> 标签版本
  • 回滚:kubectl rollout undo <资源类型> <资源名称>默认回滚到上一个版本
    • kubectl rollout undo <资源类型> <资源名称> --to-revision回滚到指定版本
    • kubectl rollout history|status <资源类型> <资源名称>查看历史信息
  • 删除:kubectl delete <资源类型> <资源名称>

5.声明式管理方法

当YAML配置文件发生改动后,使用Create创建资源如果想更新内容的话,需要先删除原有资源再进行通过YAML进行创建;如果使用Apply创建的资源想更新内容的话,可直接执行kubectl apply -f更新即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/638035.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子招投标系统源码实现与立项流程:基于Spring Boot、Mybatis、Redis和Layui的企业电子招采平台

随着企业的快速发展&#xff0c;招采管理逐渐成为企业运营中的重要环节。为了满足公司对内部招采管理提升的要求&#xff0c;建立一个公平、公开、公正的采购环境至关重要。在这个背景下&#xff0c;我们开发了一款电子招标采购软件&#xff0c;以最大限度地控制采购成本&#…

redis核心面试题一(架构原理+RDB+AOF)

文章目录 0. redis与mysql区别1. redis是单线程架构还是多线程架构2. redis单线程为什么这么快3. redis过期key删除策略4. redis主从复制架构原理5. redis哨兵模式架构原理6. redis高可用集群架构原理7. redis持久化之RDB8. redis持久化之AOF9. redis持久化之混合持久化 0. red…

【linux-uboot移植-mmc及tftp启动-IMX6ULL】

目录 1. uboot简介2. 移植前的基本介绍&#xff1a;2.1 环境系统信息: 3. 初次编译4. 烧录编译的u-boot4.1 修改网络驱动 5. 通过命令启动linux内核5.1 通过命令手动启动mmc中的linux内核5.1.1 fatls mmc 1:15.1.2 fatload mmc 1:1 0x80800000 zImage5.1.3 fatload mmc 1:1 0x8…

VMware 安装Windows 7 SP1

1.下载镜像 迅雷&#xff1a;ed2k://|file|cn_windows_7_enterprise_with_sp1_x64_dvd_u_677685.iso|3265574912|E9DB2607EA3B3540F3FE2E388F8C53C4|/ 2.安装过程 自定义名字&#xff0c;点击【浏览】自定义安装路径 点击【浏览】&#xff0c;选择下载镜像的路径 结束啦~ Win…

Pytorch深度学习实践笔记4

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;pytorch深度学习 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 视频来自【b站刘二大人】 1 反向传播 Back propaga…

力扣Hot100-73矩阵置零(标记数组)

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

2024年二建准考证打印入口已开通!

24年二建将于6月1日、2日举行&#xff0c;目前西藏、陕西准考证打印入口已开通&#xff0c;各省也将陆续开始准考证打印工作。 2024二建考试时间安排 2024二建准考证打印时间 二建准考证打印须知 01 准考证打印信息显示空白怎么办? 1)使用电脑自带的浏览器重新试一下。 2)…

【话题】你眼中的IT行业现状与未来趋势

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章&#xff0c;这是《话题》系列文章 目录 引言一、IT行业的现状1.1 云计算与大数据1.2 人工智能与机器学习1.3 物联网与5G通信1.4 区块链技术 二、IT行业未来发展趋势2.1 边缘计算与智能设备2.2 深度学习与自然语…

话题:如何让大模型变得更聪明?

随着人工智能&#xff08;AI&#xff09;技术的迅速发展&#xff0c;大模型&#xff08;如GPT-4、BERT、Transformer等&#xff09;在自然语言处理、图像识别和语音识别等领域取得了显著成果。然而&#xff0c;如何让大模型变得更聪明&#xff0c;进一步提升其性能和应用效果&a…

做好商业分析,帮你用有限的资源选择高效益项目实现战略目标

对于组织来说&#xff0c;资源条件总是有限的&#xff0c;为了实现战略目标&#xff0c;则需要从众多项目中筛选出最合适的项目来实现收益。但项目的筛选往往会遇到很多难点&#xff0c;如信息收集不全影响筛选的准确性、评估标准不明确或难以量化、决策过程复杂等等。 那么如何…

守护者:ThingsBoard物联网网关在温室环境监测中的应用

系统设计 智慧农业温室大棚系统由传感器及执行设备、数据传输网关、智慧农业温室大棚管理平台组成。 系统支持实时采集温室大棚内的空气温湿度、土壤温湿度、光照和二氧化碳等环境参数&#xff0c;根据农作物的生长需求自动控制温室中电器设备的启停&#xff0c;从而达到植物生…

caffe在ARM鲲鹏920-openEuler2309上的环境搭建

caffe 配置环境 caffe cpu-only openblas protobuf 编译caffe需要3.6~3.10版本&#xff0c;否则会报错 dnf install只能安装3.19版本 需要从源码编译&#xff0c;这里选择了3.9版本 protobuf的github仓 从源码编译安装 caffe-gpu mode caffe的gpu模式需要用到cuda make…

jmeter线程组(下篇)

线程组 线程组作为JMeter测试计划的核心组件之一&#xff0c;对于模拟并发用户的行为至关重要。线程组元件是整个测试计划的入口&#xff0c;所有的取样器和控制器必须放置在线程组下。 可以将线程组视为一个虚拟用户池&#xff0c;其中每个线程可被理解为一个虚拟用户&#x…

【Django】从零开始学Django(持续更新中)

pip install Djangopython manage.py startapp index运行&#xff1a; 成功&#xff01;&#xff01;&#xff01; 在templates中新建index.html文件&#xff1a;

在做题中学习(61):连续数组

525. 连续数组 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;前缀和 哈希表 转化&#xff1a;将 0 ——> -1 转变为&#xff1a;找到和为0的最长子数组 细节&#xff1a; 1.哈希表存什么 前缀和 &#xff0c; 长度 2.什么时候存入哈希表 先处理前一个&…

【Crypto】password

文章目录 password解题感悟 password 试试flag{zs19900315} 提交成功 解题感悟 这题有点大病

工具分享:VsCode注释神器,koro1FileHeader

他是有官方Wiki的。 https://github.com/OBKoro1/koro1FileHeader/wiki/ 项目在GitHub上开源。以下摘录部分wiki&#xff0c;用作介绍分享在这里插入代码片 如何找到setting.json设置模板 简单的输入命令 打开VSCode命令面板: mac: command p window: ctrl p输入> Ope…

day15|各种遍历的应用

相关题目&#xff1a; 层次遍历会一打十 反转二叉树 对称二叉树 层次遍历会一打十 自底向上的层序遍历 实现思路&#xff1a;层次遍历二叉树&#xff0c;将遍历后的结果revers即可 public List<List<Integer>> levelOrderBottom(TreeNode root) {List<List&l…

ubuntu22部署Docker私有仓库Harbor (http https方式)

harbor日志&#xff1a;/var/log/harbor 前置安装配置 需先安装docker和docker-compose&#xff1a; 0.配置清华大学apt源并安装docker #信任 Docker 的 GPG 公钥: sudo apt-get install ca-certificates curl gnupg curl -fsSL https://download.docker.com/linux/ubunt…

Talkingdata 数据统计

TalkingData 是一家提供移动大数据服务的平台&#xff0c;专注于为客户提供全面的产品统计分析服务和权威的移动行业数据解析。通过集成 TalkingData 的 SDK&#xff0c;开发者可以收集、处理和分析其应用的一方数据&#xff0c;从而深入了解用户的使用行为、应用表现及市场动态…