Kubernetes入门学习(上)

文章目录

  • Kubernetes入门学习(上)
    • 介绍
    • 云原生
  • Kubernetes架构
    • 基础概念
    • Kubernetes架构
      • 控制平面组件
      • Node组件
    • 组件关系
  • 安装Kubernetes
  • 基本对象和操作
    • Pod(容器集)
    • Deployment(部署)与ReplicaSet(副本集)
    • Service(服务)
    • namespace(命名空间)
    • 声明式对象配置
    • 容器与镜像

Kubernetes入门学习(上)

介绍

  1. 名称简介

    Kubernetes 是一个开源的容器编排引擎和容器集群管理工具,用来对容器化应用进行自动化部署、 扩缩和管理。

    Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有8个字符。 Google 在 2014 年开源了 Kubernetes 项目。

  2. 优势
    Kubernetes 建立在 Google 大规模运行生产工作负载十几年经验的基础上, 结合了社区中最优秀的想法和实践。它之所以能够迅速流行起来,是因为它的许多功能高度契合互联网大厂的部署和运维需求。

  3. 功能

    • 服务发现和负载均衡
    • 存储编排
    • 自动部署和回滚
    • 自动完成装箱计算
    • 自我修复
    • 密钥与配置管理

云原生

  1. 定义
    • 通俗理解:原生应用是采用特定操作系统的语言针对该操作系统开发的应用,而在设计和开发应用时,让他们能够运行在云基础设施(比如Kubernetes)上,从而使应用具备可弹性扩展的能力,我们称之为云原生应用。简而言之:云原生就是以容器技术为载体、基于微服务架构思想的一套技术体系和方法论
    • 官方定义:云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。

Kubernetes 是 CNCF 托管的第一个开源项目。因此现在提到云原生,往往我们都把它与kubernetes联系起来。

云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。

Kubernetes架构

基础概念

  • 节点(Node):Kubernetes中工作的机器叫做节点,会运行容器化应用程序,运行实际的应用和工作负载。
  • Pod:Pod 是可以在 Kubernetes 中创建和管理的、最小的可部署的计算单元。Pod表示你的集群上—组正在运行的容器。这些容器共享存储、网络、以及怎样运行这些容器的声明。
  • 集群:Kubernetes集群至少包含一个控制平面(control plane),以及一个或多个工作节点(worker node)。
  • 控制平面**(Control Plane) 😗* 控制平面负责管理工作节点和维护集群状态。所有任务分配都来自于控制平面。

Kubernetes架构

一个Kubernetes集群至少包含一个控制平面组件(control plane),以及一个或多个工作节点组件(worker node)。

控制平面组件

控制平面组件会为集群做出全局决策,比如资源的调度、检测和响应集群事件。

在这里插入图片描述

  1. kube-apiserver

    如果需要与Kubernetes 集群进行交互,就要通过 API

    apiserver是 Kubernetes 控制平面的前端,用于处理内部和外部请求。

  2. kube-scheduler

    负责监视新创建的、未指定运行节点(node)的 Pods, 并选择节点来让 Pod 在上面运行。集群状况是否良好?如果需要创建新的容器,要将它们放在哪里?这些是调度程序需要关注的问题。scheduler调度程序会考虑容器集的资源需求(例如 CPU 或内存)以及集群的运行状况。随后,它会将容器集安排到适当的计算节点。

  3. etcd

    一致且高可用的键值存储,用于存储配置数据和集群状态信息, 用作 Kubernetes 所有集群数据的后台数据库。

  4. kube-controller-manager

    控制器负责实际运行集群,controller-manager控制器管理器则是将多个控制器功能合而为一,降低了程序的复杂性。

    controller-manager包含了这些控制器:

    • 节点控制器(Node Controller):负责在节点出现故障时进行通知和响应
    • 任务控制器(Job Controller):监测代表一次性任务的 Job 对象,然后创建 Pods 来运行这些任务直至完成
    • 端点控制器(Endpoints Controller):填充端点(Endpoints)对象(即加入 Service 与 Pod)
    • 服务帐户和令牌控制器(Service Account & Token Controllers):为新的命名空间创建默认帐户和 API 访问令牌
  5. cloud-controller-manager

    控制平面还包含一个可选组件cloud-controller-manager

    云控制器管理器(Cloud Controller Manager)允许你将你的集群连接到云提供商的 API 之上, 并将与该云平台交互的组件同与你的集群交互的组件分离开来。

Node组件

节点组件会在每个节点上运行,负责维护运行的 Pod 并提供 Kubernetes 运行环境。

在这里插入图片描述

  1. kubelet

    kubelet 会在集群中每个节点(node)上运行。 它保证容器(containers)都运行在 Pod 中。
    当控制平面需要在节点中执行某个操作时,kubelet 就会执行该操作。

  2. kube-proxy

    kube-proxy 是集群中每个节点(node)上运行的网络代理,是实现 Kubernetes 服务(Service) 概念的一部分。
    kube-proxy 维护节点网络规则和转发流量,实现从集群内部或外部的网络与 Pod 进行网络通信。

  3. 容器运行时(Container Runtime)

    这个基础组件使 Kubernetes 能够有效运行容器。 它负责管理 Kubernetes 环境中容器的执行和生命周期。负责运行容器的软件。Kubernetes 支持许多容器运行环境,例如 containerd、docker或者其他实现了 Kubernetes CRI (容器运行环境接口)的容器。

组件关系

在这里插入图片描述

安装Kubernetes

参考这篇即可K8s安装部署–超级详细(无坑,v1.23)_虚拟机部署k8s_我不当正经人了z的博客-CSDN博客

容器镜像加速详见阿里云镜像加速

个人觉得这教程更好https://blog.csdn.net/IOT_AI/article/details/131975562

基本对象和操作

Pod(容器集)

  1. 概述

    Pod 是包含一个或多个容器的容器组,是 Kubernetes 中创建和管理的最小对象。

    Pod 有以下特点:

    • Pod是kubernetes中最小的调度单位(原子单元),Kubernetes直接管理Pod而不是容器。

    • 同一个Pod中的容器总是会被自动安排到集群中的同一节点(物理机或虚拟机)上,并且一起调度

    • Pod可以理解为运行特定应用的“逻辑主机”,这些容器共享存储、网络和配置声明(如资源限制)。

    • 每个 Pod 有唯一的 IP 地址。 IP地址分配给Pod,在同一个 Pod 内,所有容器共享一个 IP 地址和端口空间,Pod 内的容器可以使用localhost互相通信。

  2. 举例

    一个Pod中你可能有一个容器,为共享卷中的文件提供 Web 服务器支持,以及一个单独的 “边车 (sidercar)” 容器负责从远端更新这些文件,如下图所示:在这里插入图片描述

  3. 操作Pod

# 拉取并且运行Pod
# --image 指定镜像
kubectl run mynginx --image=nginx
# 查看Pod
kubectl get pod
# 描述
kubectl describe pod mynginx
# 查看Pod的运行日志
kubectl logs mynginx

# 显示pod的IP和运行节点信息
kubectl get pod -owide
# 使用Pod的ip+pod里面运行容器的端口
curl 10.42.1.3

#在容器中执行
# 命令放在--后
kubectl exec mynginx -it -- /bin/bash

# --watch 隔一段时间执行一次命令用于观察
kubectl get pod --watch
# -it 交互模式 
# --rm 退出后删除容器,多用于执行一次性任务或使用客户端
kubectl run mynginx --image=nginx -it --rm -- /bin/bash 

# 删除
kubectl delete pod mynginx
# 强制删除
kubectl delete pod mynginx --force

Deployment(部署)与ReplicaSet(副本集)

  1. 介绍

    1. Deployment:Deployment是对ReplicaSetPod更高级的抽象。

      它使Pod拥有多副本,自愈,扩缩容、滚动升级等能力。一个 Deployment 为 Pod 和 ReplicaSet 提供声明式的更新能力

    2. ReplicaSet:ReplicaSet 的目的是维护一组在任何时候都处于运行状态的 Pod 副本的稳定集合。 因此,它通常用来保证给定数量的、完全相同的 Pod 的可用性。通常我们不直接使用ReplicaSet,而是在Deployment中声明。

  2. 操作

    基本操作:创建、查看、删除

    #创建deployment,部署3个运行nginx的Pod
    kubectl create deployment nginx-deployment --image=nginx:1.22 --replicas=3
    #查看deployment
    kubectl get deploy
    #查看replicaSet
    kubectl get rs 
    #删除deployment
    kubectl delete deploy nginx-deployment
    

    缩放

    • 手动缩放

      #将副本数量调整为5
      kubectl scale deployment/nginx-deployment --replicas=5
      kubectl get deploy
      
    • 自动缩放

      自动缩放通过增加和减少副本的数量,以保持所有 Pod 的平均 CPU 利用率不超过 75%。

      自动伸缩需要声明Pod的资源限制,同时使用 Metrics Server 服务

      #自动缩放
      kubectl autoscale deployment/nginx-auto --min=3 --max=10 --cpu-percent=75 
      #查看自动缩放
      kubectl get hpa
      #删除自动缩放
      kubectl delete hpa nginx-deployment
      

    滚动更新

    #查看版本和Pod
    kubectl get deployment/nginx-deployment -owide
    kubectl get pods
    
    #更新容器镜像
    kubectl set image deployment/nginx-deployment nginx=nginx:1.23
    #滚动更新
    kubectl rollout status deployment/nginx-deployment
    #查看过程
    kubectl get rs --watch
    

    版本回滚

    #查看历史版本
    kubectl rollout history deployment/nginx-deployment
    #查看指定版本的信息
    kubectl rollout history deployment/nginx-deployment --revision=2
    #回滚到历史版本
    kubectl rollout undo deployment/nginx-deployment --to-revision=2
    

Service(服务)

  1. 概述

    Kubernetes 中 Service 是 将运行在一个或一组 Pod 上的网络应用程序公开为网络服务的方法。

    Service为一组 Pod 提供相同的 DNS 名(域名),并且在它们之间进行负载均衡。

    Kubernetes 为 Pod 提供分配了IP 地址,但IP地址可能会发生变化。

    集群内的容器可以通过service名称访问服务,而不需要担心Pod的IP发生变化。

    Kubernetes Service 定义了这样一种抽象:

    逻辑上的一组可以互相替换的 Pod,通常称为微服务。

    Service 对应的 Pod 集合通常是通过选择算符来确定的。

    举个例子,在一个Service中运行了3个nginx的副本。这些副本是可互换的,我们不需要关心它们调用了哪个nginx,也不需要关注 Pod的运行状态,只需要调用这个服务就可以了。

  2. 操作

    # 将已有的部署创建为服务
    # --name:指定服务名
    # --type:指定servicetype
    # --port:指定服务公开端口
    # --target-port:指定容器内部端口
    kubectl expose deployment/nginx-deployment \
    --name=nginx-service --type=ClusterIP --port=80 --target-port=80
    # 查看服务
    kubectl get svc
    
  3. ServiceTypePort解析

    • ServiceType 取值

      • ClusterIP:将服务公开在集群内部。kubernetes会给服务分配一个集群内部的 IP,集群内的所有主机都可以通过这个Cluster-IP访问服务集群内部的Pod可以通过service名称访问服务
      • NodePort:通过每个节点的主机IP 和静态端口(NodePort)暴露服务。 集群的外部主机可以使用节点IP和NodePort访问服务
      • ExternalName:将集群外部的网络引入集群内部。
      • LoadBalancer:使用云提供商的负载均衡器向外部暴露服务。
    • Port

      在这里插入图片描述

namespace(命名空间)

  1. 概述

    **命名空间(Namespace)**是一种资源隔离机制,将同一集群中的资源划分为相互隔离的组

    命名空间可以在多个用户之间划分集群资源(通过资源配额)。

    • 例如我们可以设置开发、测试、生产等多个命名空间。

    同一命名空间内的资源名称要唯一,但跨命名空间时没有这个要求。

    命名空间作用域仅针对带有名字空间的对象,例如 Deployment、Service 等。

    这种作用域对集群访问的对象不适用,例如 StorageClass、Node、PersistentVolume 等。

  2. Kubernetes 会创建四个初始命名空间:

    • default 默认的命名空间,不可删除,未指定命名空间的对象都会被分配到default中。
    • kube-system Kubernetes 系统对象(控制平面和Node组件)所使用的命名空间。
    • kube-public 自动创建的公共命名空间,所有用户(包括未经过身份验证的用户)都可以读取它。通常我们约定,将整个集群中公用的可见和可读的资源放在这个空间中。
    • kube-node-lease 租约(Lease)对象使用的命名空间。每个节点都有一个关联的 lease 对象,lease 是一种轻量级资源。lease对象通过发送心跳,检测集群中的每个节点是否发生故障。

    使用kubectl get lease -A查看lease对象

  3. 操作

    管理命名空间

    kubectl get pod -A
    #创建命名空间
    kubectl create namespace dev
    #查看命名空间
    kubectl get ns
    
    #在命名空间内运行Pod
    kubectl run nginx --image=nginx --namespace=dev
    kubectl run my-nginx --image=nginx -n=dev
    
    #查看命名空间内的Pod
    kubectl get pods -n=dev
    
    #查看命名空间内所有对象
    kubectl get all
    # 删除命名空间会删除命名空间下的所有内容
    kubectl delete ns dev
    

    切换当前命名空间

    #查看当前上下文
    kubectl config current-context
    
    #将dev设为当前命名空间,后续所有操作都在此命名空间下执行。
    kubectl config set-context $(kubectl config current-context) --namespace=dev
    

声明式对象配置

  1. 云原生的代表技术包括:

    • 容器

    • 服务网格

    • 微服务

    • 不可变基础设施

    • 声明式API

  2. 管理对象:命令行指令 vs 声明式配置

    • 命令行指令

      例如,使用kubectl命令来创建和管理 Kubernetes 对象。

      命令行就好比口头传达,简单、快速、高效。

      但它功能有限,不适合复杂场景,操作不容易追溯,多用于开发和调试。

    • 声明式配置

      kubernetes使用yaml文件来描述 Kubernetes 对象。

      声明式配置就好比申请表,学习难度大且配置麻烦。

      好处是操作留痕,适合操作复杂的对象,多用于生产。

  3. 常用命令缩写

    名称缩写Kind
    namespacesnsNamespace
    nodesnoNode
    podspoPod
    servicessvcService
    deploymentsdeployDeployment
    replicasetsrsReplicaSet
    statefulsetsstsStatefulSet
  4. 配置对象

    在创建的 Kubernetes 对象所对应的 yaml文件中,需要配置的字段如下:

    • apiVersion - Kubernetes API 的版本
    • kind - 对象类别,例如PodDeploymentServiceReplicaSet
    • metadata - 描述对象的元数据,包括一个 name 字符串、UID 、标签和可选的 namespace
    • spec - 对象的配置

    举例:

    # my-pod.yaml
    
    apiVersion: v1
    kind: Pod
    metadata:
      name: my-nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
        ports:
        - containerPort: 80
    

    使用yaml文件管理对象

    #创建对象
    kubectl apply -f my-pod.yaml
    #编辑对象,这里有点问题
    kubectl edit nginx
    #删除对象
    kubectl delete -f my-pod.yaml
    
  5. 标签

    标签(Labels) 是附加到对象(比如 Pod)上的键值对,用于补充对象的描述信息。

    标签使用户能够以松散的方式管理对象映射,而无需客户端存储这些映射。

    由于一个集群中可能管理成千上万个容器,我们可以使用标签高效的进行选择和操作容器集合。


    • 键的格式:
      • 前缀(可选)/名称(必须)。
    • 有效名称和值:
      • 必须为 63 个字符或更少(可以为空)
      • 如果不为空,必须以字母数字字符([a-z0-9A-Z])开头和结尾
      • 包含破折号**-**、下划线**_**、点**.**和字母或数字

    label配置模版

    apiVersion: v1
    kind: Pod
    metadata:
      name: label-demo
      labels: #定义Pod标签
        environment: test
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
        ports:
        - containerPort: 80
    
    # 查看Pod的同时展示标签
    kubectl get pod --show-labels
    # 根据标签查看Pod
    kubectl get pod -l environment=test,app=nginx
    
  6. 选择器

    标签选择器 可以识别一组对象。标签不支持唯一性。

    标签选择器最常见的用法是为Service选择一组Pod作为后端。


    Service配置模版

    apiVersion: v1
    kind: Service
    metadata:
      name: my-service
    spec:
      type: NodePort
      selector: #与Pod的标签一致
        environment: test
        app: nginx
      ports:
          # 默认情况下,为了方便起见,`targetPort` 被设置为与 `port` 字段相同的值。
        - port: 80
          targetPort: 80
          # 可选字段
          # 默认情况下,为了方便起见,Kubernetes 控制平面会从某个范围内分配一个端口号(默认:30000-32767)
          nodePort: 30007
    

    目前支持两种类型的选择运算:基于等值的基于集合的

    多个选择条件使用逗号分隔,相当于**And(&&)**运算。

    • 等值选择:键值对

      selector:
        matchLabels: # component=redis && version=7.0
          component: redis
          version: 7.0
      
    • 集合选择

      selector:
        matchExpressions: # tier in (cache, backend) && environment not in (dev, prod)
          - {key: tier, operator: In, values: [cache, backend]}
          - {key: environment, operator: NotIn, values: [dev, prod]}
      

容器与镜像

容器运行时接口(CRI)

Kubelet运行在每个节点(Node)上,用于管理和维护Pod和容器的状态。

容器运行时接口(CRI)是kubelet 和容器运行时之间通信的主要协议。它将 Kubelet 与容器运行时解耦,理论上,实现了CRI接口的容器引擎,都可以作为kubernetes的容器运行时。

Docker没有实现(CRI)接口,Kubernetes使用dockershim来兼容docker。

自V1.24版本起,Dockershim 已从 Kubernetes 项目中移除。


crictl是一个兼容CRI的容器运行时命令,他的用法跟docker命令一样,可以用来检查和调试底层的运行时容器。

crictl pull mysql:5.7-debian
crictl images

在一些局域网环境下,我们没法通过互联网拉取镜像,可以手动的导出、导入镜像。

crictl命令没有导出、导入镜像的功能。

需要使用ctr命令导出、导入镜像,它是containerd的命令行接口。

containerd导出、导入镜像

#导出镜像,kubernetes中所有镜像都在k8s.io命名
ctr -n k8s.io images export mysql.tar docker.io/library/mysql:5.7-debian --platform linux/amd64
#导入镜像
ctr -n k8s.io images import mysql.tar

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

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

相关文章

Linux shell编程学习笔记31:alias 和 unalias 操作 命令别名

目录 0 前言1 定义别名2 查看别名 2.1 查看所有别名2.2 查看某个别名 2.2.1 alias 别名2.2.2 alias | grep 别名字符串2.2.3 使用 CtrlAltE 组合键3 unalias:删除别名4 如何执行命令本身而非别名 4.1 方法1:使用 CtrlAltE 组合键 && unalias4…

促进高层次人才创新创业,长沙又在“放大招”

“人才”,寥寥数笔,却勾勒出一座城市的发展核心、创新引擎。大力引进高层次人才,更是城市提升综合实力的有效举措。 11月26日,在长沙市委组织部(市委人才工作局)举办“汇聚磅礴力量 全力建设全球研发中心城…

TCP 三次握手和四次挥手(图解)

TCP 三次握手和四次挥手 建立连接-三次握手 什么是三次握手? 简单来说: 客户端向服务器发送 SYN 报文,请求建立连接。服务器收到 SYN 报文后,回复一个 SYNACK 的报文,表示同意建立连接。客户端收到 SYNACK 报文后&am…

unity3d 旋转cube时变形

将cube移到父路径同级,重置再,更改角度,或者将父路径先重置,再将cube移动到父节点下面

股票技术从初级到高级,从实盘进阶到摩尔缠论

一、教程描述 摩尔缠论是什么?一个伟大的缠论分支体系,由顶尖高手创立的缠论分支,这个顶尖高手,江湖上的代号为摩尔,可能是一个人,或者是一群人。摩尔缠论,基于缠论的核心思想与基础理论&#…

Windows下Linkis1.5DSS1.1.2本地调试

1 Linkis: 参考: 单机部署 | Apache Linkis技术分享 | 在本地开发调试Linkis的源码 (qq.com)DataSphere Studio1.0本地调试开发指南 - 掘金 (juejin.cn) 1.1 后端编译 参考【后端编译 | Apache Linkis】】 修改linkis模块下pom.xml,将mysql.connetor.scope修改…

数据结构 | 查找

基本概念 关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。例如,在由一个学生元素构成的数据集合中,学生元素中“学号”这一数据项的值唯一地标识一名学生。 查找表&a…

从零开始的c语言日记day37——数组指针练习

一、 取地址数组储存在了*p里,里面储存的是整个数组的地址但本质也是第一个元素的地址解引用后1为4个字节所以就可以打印数组了。但一般不用这种方法 这样更方便一些 打印多维数组 如果不用这样传参,用指针传参怎么做呢? Main里函数的arr表示…

22款奔驰GLE450升级原厂360全景影像 超广角的视野

360全景影像影像系统提升行车时的便利,不管是新手或是老司机都将是一个不错的配置,无论是在倒车,挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况,避免盲区事故发生,提升行车出入安全性。 360全景影像包含&…

网工内推 | 外企网工,五险一金,弹性工作,最高30k*14薪

01 金蝶软件(中国)有限公司 招聘岗位:网络工程师 职责描述: 1、合理规划公司网络,保障网络架构的合理性、可靠性及前瞻性; 2、负责公司网络运维,处理日常运维事件,保障网络的稳定可…

基于mvc的大学生家教信息网站系统php+vue

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/phpmyadmin 开发软件:hbuilderx/vscode/Dreamweaver/PhpSt…

不同路径 II(力扣LeetCode)动态规划

不同路径 II 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。…

freerots启动过程分析(qemu仿真RISC-V架构为例)

1、前言 本文是基于qemu上virt板子适配的freertos系统源码进行讲解qemu安装可参考博客:《qemu源码下载和安装》;freertos移植到qemu上运行可参考博客:《移植freertos到qemu上运行》; 2、汇编代码部分 汇编文件:FreeR…

qt实现一个安卓测试小工具

qt实现一个安卓测试小工具 最终效果:目录结构源码gui.py 主要是按钮,文本控制代码main.py 主要是逻辑代码gui.spec 是打包使用的adb.ui 最终效果: 目录结构 上面2个是打包的生成的不用管 源码 gui.py 主要是按钮,文本控制代码…

vue3怎么提升效率的?为什么vue3比vue2快?效率提升主要在哪些方面?

官方文档中说vue3在 客户端渲染效率比vue2提升了1.3~2倍, SSR渲染效率比vue2提升了2~3倍,那么究竟是怎么提升的呢? 一、静态提升 在 vue3项目中的package.json文件中,可以看到这个 vue/compiler-sfc,它是用来解析(.v…

数据在内存中的存储练习题

数据在内存中的存储练习题 文章目录 数据在内存中的存储练习题1. 练习一2.练习二3. 练习三4. 练习四5. 练习五6. 练习六7. 总结 1. 练习一 #include <stdio.h>int main() {char a -1;signed b -1;unsigned char c -1;printf("a %d b %d c %d", a, b, c)…

PHP+vue+elementui高校学生社团信息管理系统o7q4a

社团是由高校用户依据兴趣爱好自愿组成&#xff0c;按照章程自主开展活动的用户组织。高校社团是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高用户综合素质、引导用户适应社会、促进用户交流等方面发挥着重要作用&#xff0c;是新形势下有效凝聚用户…

Echarts legend图例配置项 设置位置 显示隐藏

Echarts 官网完整配置项 https://echarts.apache.org/zh/option.html#legend 配置项 legend: { }设置图例为圆形 icon: circle,//设置图例为圆形设置图例位置 top: 20%//距离顶部百分之20//y:bottom 在底部显示设置图例 宽度 高度 itemWidth: 10,//设置图例宽度 itemHeight: …

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…

HttpRunner原来还能这么用,大开眼界!!!

hook机制 Httprunner 框架中的 hook 机制相当于unittest框架中的 setup , teardown 函数&#xff0c;用来进行测试用例执行之前的环境初始化以及测试用例执行完毕之后的环境清理操作。 httprunner 中的 hooks 机制可以用在测试用例层级也可以用在测试步骤层级&#xff0c;其关键…