【云原生】k8s之包管理器Helm

前言

 每个成功的软件平台都有一个优秀的打包系统,比如Debian、Ubuntu 的 apt,RedHat、CentOS 的 yum。Helm 则是 Kubernetes上 的包管理器,方便我们更好的管理应用。

1.Helm的相关知识 

1.1 Helm的简介与了解 

 Helm本质就是让K8s的应用管理(Deployment、Service等)可配置,可以通过类似于传递环境变量的方式能动态生成。通过动态生成K8s资源清单文件(deployment.yaml、service.yaml)。 然后调用 Kubectl 自动执行 K8s 资源部署。

在没使用 helm 之前,向 kubernetes 部署应用,我们要依次部署 deployment、svc 等,步骤较繁琐。 况且随着很多项目微服务化,复杂的应用在容器中部署以及管理显得较为复杂,helm 通过打包的方式,支持发布的版本管理和控制, 很大程度上简化了 Kubernetes 应用的部署和管理。
 Helm 是官方提供的类似于 YUM 的包管理器,是部署环境的流程封装。

Helm的官网地址:http:// https://helm.sh/

1.2 Helm的三个重要概念


在Helm中 有三个重要的概念,分别为:Chart 、Repository 和 Release 

●Chart:Helm 的软件包,采用 TAR 格式。是创建一个应用的信息集合,包括各种 Kubernetes 对象的配置模板、参数定义、依赖关系、文档说明等。chart 是应用部署的自包含逻辑单元。 可以将 chart 想象成 apt、yum 中的软件安装包。

●Release:是 chart 的运行实例,代表了一个正在运行的应用。当 chart 被安装到 Kubernetes 集群,就生成一个 release。chart 能够多次安装到同一个集群,每次安装都是一个 release。

●Repository(仓库):Charts 仓库,用于集中存储和分发 Charts。Repository 本质上是一个 Web 服务器,该服务器保存了一系列的 Chart 软件包以供用户下载,并且提供了一个该 Repository 的 Chart 包的清单文件以供查询。Helm 可以同时管理多个不同的 Repository。

还有一个在Helm3版本中就被移除的概念:

Tiller: Helm 2.x版本中,Helm采用Client/Server的设计,Tiller就是Helm的Server部分,需要具备集群管理员权限才能安装到K8s集群中运行。Tiller与Helm client进行交互,接收client的请求,再与K8s API Server通信,根据传递的Charts来生成Release。而在最新的Helm 3.x中,据说是为了安全性考虑移除了Tiller。 

Helm在k8s集群运用中,总的来讲其作用过程:Helm 安装 charts 到 Kubernetes 集群中,每次安装都会创建一个新的 release。你可以在 Helm 的 chart repositories 中寻找新的 chart。 
 

 

2.Helm在k8s集群中的部署

(1)将Helm安装在master01节点上 

//在github中下载所需版本的二进制 Helm client 安装包
https://github.com/helm/helm/tags 
 
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
mv linux-amd64/helm /usr/local/bin/helm
helm version
 

 添加helm的自动补全功能,方便后续使用:

vim /etc/bashrc
source <(helm completion bash)

(2)使用 helm 安装 Chart 

###helm添加chat的语法格式:
helm repo add  chart仓库名   chart仓库地址
 
###添加常用的chart仓库############
#一个开源项目的仓库
helm repo add bitnami https://charts.bitnami.com/bitnami
#微软chart仓库,推荐使用,内容基本与官方仓库保持一致
helm repo add stable http://mirror.azure.cn/kubernetes/charts
#阿里chart仓库,应有尽有
helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
#官方仓库,国内网络问题,不太推荐应用
helm repo add incubator https://charts.helm.sh/incubator

 

(3)对chart仓库的基本使用 

1)更新和查看 charts 列表

helm repo update          
helm repo list
 

 

2)查看某chart仓库的可用chart列表 

//查看 stable 仓库可用的 charts 列表
helm search repo stable
 

 3)删除指定的chart仓库

//eg:因为官方仓库使用起来太慢,删除 incubator 仓库
helm repo remove incubator
 

 

 4)查看 chart 信息

 
helm show chart stable/mysql     #查看指定 chart 的基本信息

helm show all stable/mysql         #获取指定 chart 的所有信息

(4)安装 chart 

helm install my-redis bitnami/redis [-n default]   #指定 release 的名字为 my-redis,-n 指定部署到 k8s 的 namespace
 
helm install bitnami/redis --generate-name    #不指定 release 的名字时,需使用 –generate-name 随机生成一个名字

 

(5)对chart的基本管理

 1)查看所有的release

helm ls 
helm list

 

2)查看指定的 release 状态

helm status my-redis 

 

 3)删除指定的release

helm uninstall my-redis 
 

  3.Helm的自定义模板

 charts 除了可以在 repo 中下载,还可以自己自定义,创建完成后通过 helm 部署到 k8s。

3.1 在镜像仓库中拉取chart,查看chart的包结构

#拉取chart 到本地目录(现在所在的目录中)
helm pull stable/mysql
 
#对该拉取的chart压缩包进行解压
tar xf mysql-1.6.9.tgz

 

 

 由上图可以看出:一个 chart 包就是一个文件夹的集合,文件夹名称就是 chart 包的名称。

 chart 是包含至少两项内容的helm软件包:

(1)软件包自描述文件 Chart.yaml,这个文件必须有 name 和 version(chart版本) 的定义
(2)一个或多个模板,其中包含 Kubernetes 清单文件:

NOTES.txt:chart 的“帮助文本”,在用户运行 helm install 时显示给用户
deployment.yaml:创建 deployment 的资源清单文件
service.yaml:为 deployment 创建 service 的资源清单文件
ingress.yaml: 创建 ingress 对象的资源清单文件
_helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用

 

3.2 自定义创建一个chart 

(1)使用命令行创建生成一个模板

helm create nginx
 
tree nginx

 

cat nginx/templates/deployment.yaml

 

 在 templates 目录下 yaml 文件模板中的变量(go template语法)的值默认是在 nginx/values.yaml 中定义的,只需要修改 nginx/values.yaml 的内容,也就完成了 templates 目录下 yaml 文件的配置。
比如在 deployment.yaml 中定义的容器镜像:
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"

 

总结:所以实际操作中,大多数情况下,我们只需要通过操作Chart.yaml和values.yaml文件进行自定义chart的设置,其他文件均是由变量来获取values.yaml中的值 

(2)进行模板文件的修改,生成自定义chart 

vim nginx/Chart.yaml
apiVersion: v2
name: nginx                     #chart名字
description: A Helm chart for Kubernetes
type: application               #chart类型,application或library
version: 0.1.0                  #chart版本
appVersion: 1.16.0              #application部署版本

 vim nginx/values.yaml
replicaCount: 1
 
image:
  repository: nginx
  pullPolicy: IfNotPresent
  tag: "latest"                 #设置镜像标签
 
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
 
serviceAccount:
  create: true
  annotations: {}
  name: ""
 
podAnnotations: {}
 
podSecurityContext: {}
  # fsGroup: 2000
 
securityContext: {}
  # capabilities:
  #   drop:
  #   - ALL
  # readOnlyRootFilesystem: true
  # runAsNonRoot: true
  # runAsUser: 1000
 
service:
  type: ClusterIP
  port: 80
 
ingress:
  enabled: true                 #开启 ingress
  className: ""
  annotations: {}
    # kubernetes.io/ingress.class: nginx
    # kubernetes.io/tls-acme: "true"
  hosts:
    - host: www.test.com         #指定ingress域名
      paths:
        - path: /
          pathType: Prefix      #指定ingress路径类型
  tls: []
  #  - secretName: chart-example-tls
  #    hosts:
  #      - chart-example.local
 
resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 100m
    memory: 128Mi
 
autoscaling:
  enabled: false
  minReplicas: 1
  maxReplicas: 100
  targetCPUUtilizationPercentage: 80
  # targetMemoryUtilizationPercentage: 80
 
nodeSelector: {}
 
tolerations: []
 
affinity: {}

(3)进行chart打包 

//打包 chart
helm lint nginx        #检查依赖和模版配置是否正确
 
helm package nginx     #打包 chart,会在当前目录下生成压缩包 nginx-0.1.0.tgz

 

(4)利用自定义chart包进行k8s资源部署 

helm install nginx ./nginx --dry-run --debug    #使用 --dry-run 参数验证 Chart 的配置,并不执行安装
 
helm install nginx ./nginx -n default           #部署 chart,release 版本默认为 1
或者
helm install nginx ./nginx-0.1.0.tgz
 
#可根据不同的配置来 install,默认是 values.yaml
helm install nginx ./nginx -f ./nginx/values-prod.yaml

(5)部署 ingress

wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
kubectl apply -f mandatory.yaml
kubectl apply -f service-nodeport.yaml

kubectl get pod,svc -n ingress-nginx
kubectl get ingress

 

 进行客户机测试:(随便启用一台k8s集群以外的客户机

vim /etc/hosts
192.168.73.107 www.test.com 

(6)进行修改变动,进行chart的升级更新 

//修改为 NodePort 访问后,升级
vim nginx/values.yaml
service:
  type: NodePort
  port: 80
  nodePort: 30080
 
ingress:
  enabled: false
 
vim nginx/templates/service.yaml
apiVersion: v1
kind: Service
metadata:
  name: {{ include "nginx.fullname" . }}
  labels:
    {{- include "nginx.labels" . | nindent 4 }}
spec:
  type: {{ .Values.service.type }}
  ports:
    - port: {{ .Values.service.port }}
      targetPort: http
      protocol: TCP
      name: http
      nodePort: {{ .Values.service.nodePort }}              #指定 nodePort
  selector:
    {{- include "nginx.selectorLabels" . | nindent 4 }}

 

 

 
升级 release,release 版本加 1
helm upgrade nginx nginx 

 

 

进行访问测试:

 

 (7)自定义chart的版本回滚 (根据release版本)

helm history nginx              #查看 release 版本历史
 
helm rollback nginx 1           #回滚 release 到版本1
 
#通常情况下,在配置好 templates 目录下的 kubernetes 清单文件后,后续维护一般只需要修改 Chart.yaml 和 values.yaml 即可。

 在命令行使用 --set 指定参数来部署(install,upgrade)release
#注:此参数值会覆盖掉在 values.yaml 中的值,如需了解其它的预定义变量参数,可查看 helm 官方文档。
helm upgrade nginx nginx --set image.tag='1.15' (相当于k8s中打补丁设置的方式)

4. Helm 的私有仓库-Habor
 

 前面介绍了Habor作为docker镜像的私有仓库,其实Habor还可以成为Helm的私有仓库,用来存放打包好的chart包

具体部署步骤

(1)在新主机上安装habor和docker-compose(前提是已经安装好docker) 

 

//安装 harbor
#上传 harbor-offline-installer-v1.9.1.tgz 和 docker-compose 文件到 /opt 目录
cd /opt
cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose
 
tar zxf harbor-offline-installer-v1.9.1.tgz
cd harbor/

 

vim harbor.yml
hostname: 192.168.73.108
harbor_admin_password: Harbor12345     #admin用户初始密码
data_volume: /data                     #数据存储路径,自动创建
chart:
  absolute_url: enabled                #在chart中启用绝对url
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor          #日志路径
 
#安装带有 Clair service 和 chart 仓库服务的 Harbor
./install.sh --with-clair --with-chartmuseum

(2)在helm主机上安装好push插件 

#在线安装
helm plugin install https://github.com/chartmuseum/helm-push
 
#离线安装
wget https://github.com/chartmuseum/helm-push/releases/download/v0.8.1/helm-push_0.8.1_linux_amd64.tar.gz
 
mkdir -p ~/.local/share/helm/plugins/helm-push
tar -zxvf helm-push_0.8.1_linux_amd64.tar.gz -C ~/.local/share/helm/plugins/helm-push
 
helm repo ls

(3)在habor主机创建项目,在helm主机添加chart仓库 

打开浏览器:访问http://192.168.73.108,新建项目 

 

 

在helm主机上进行操作 :

#添加仓库
helm repo add harbor http://192.168.73.108/chartrepo/chart_repo --username=admin --password=Harbor12345
#注:这里的 repo 的地址是<Harbor URL>/chartrepo/<项目名称>,Harbor 中每个项目是分开的 repo。如果不提供项目名称, 则默认使用 library 这个项目。
 

 

(4)进行推送拉取测试 

推送chart包测试:

#推送 chart 到 harbor 中
cd /opt/helm
helm push nginx-0.1.0.tgz harbor
 

 

拉取chart包测试: 

注意:第一次拉取私有仓库chart包时,需要先进行helm repo update  更新helm仓库源

 

rm -f nginx-0.1.0.tgz
mkdir repo.bak
mv nginx/  ./repo.bak
 
#因为harbor仓库是第一次使用,需要先对仓库源进行更新
helm repo update
helm pull  harbor/nginx

 

 

 Helm的命令总结

(1)Helm的常用命令总结

 
helm           #查看helm基本操作命令
helm version   #查看helm的版本
helm env       #查看环境变量
helm create chartName    #创建chart目录(含基本配置文件和目录)
helm package chartDir    #将chart目录打包
helm template chartName  #渲染template目录下的模板文件(即将这些模板文件的字段内容用values.yaml填充,然后直接输出到终端)
 
helm search repo keyword   #根据关键字检索chart包
helm search hub keyword
#上面2个命令仅仅在第3个字段有区别,repo表示在本地所添加的仓库中进行检索;hub表示在Helm Hub中进行检索。
 
helm list  #查看发布到k8s中的chart对应的release
 
helm push chart.tgz repoName    上传chart到chart仓库
例:helm push demo.tgz harbor-10.30.12.211 --username=admin --password=Harbor12345
#有些仓库是有账号密码验证的,所以需要加上账号、密码的参数(比如Harbor提供的chart仓库功能,可参考下面的私有仓库搭建先搭建一个私有仓库出来,再进行仓库相关命令的测试)
 
命令:helm pull repoName/keyword    #从chart仓库中拉取chart到本地
例:helm pull harbor-10.30.12.211/demo
#harbor-10.30.12.211/demo的结构是本地起的仓库名/chart包的名字前缀,只要在harbor-10.30.12.211仓库中含有demo为前缀的chart包,就会被下载到本地
 
helm lint chartName    #检查chart包中的文件内容是否正确(即该chart包去k8s中是否能够成功安装部署)
#包可以是chart目录、chart压缩包
 
helm install releaseName chartName    #将chart包发布到k8s集群中安装部署
#releaseName为release的名字,chartName为chart包名,chart可以是未打包的chart,也可以是打包的chart,也可以是仓库中的chart。【chart和release的关系可以大致理解为程序和进程的关系,一个是静态的,一个是动态的】
helm install chartName --generate-name
#可以不指定release的名字,只需要指定–generate-name即可随机生成一个名字
#创建完后可以使用helm list查看是否有对应的release
 
helm uninstall releaseName   #将部署到k8s中的release卸载掉
#卸载完后使用helm list查看relDemo是否被删除了,同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部删除干净
 
helm upgrade releaseName chartName     #将部署到k8s中的release升级,即相当于应用升级
#relName指定一个release,该release对应一个k8s中的应用,chartName指定一个chart包,整个过程为直接使用指定的chart包替换部署release。就helm而言release还是原来那个,不过对应的chart包被替换了。对k8s而言,仅仅是将原先资源删除,然后用新的chart包创建资源。
#使用helm list查看release的CHART字段是否更新,同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部更新(看名字、运行时间)
 
helm rollback releaseName revision   #将release回退到前一个或若干个版本(k8s中会同步回退)
#revision为第几个版本,1表示第一个版本,2表示第二个版本,以此类推。通常回滚会搭配helm history releaseName使用,通过该命令查看所有的关于本release的发布历史,然后选择回退到哪个版本
#回滚成功后使用helm list查看该release的CHART和APP VERSION是否更新(具体得看chart中的chart.yaml中的version和appVersion有没有相应的修改),同时可以使用kubectl get pods查看相应的pod等与release相关的资源是否全部更新(看名字、运行时间)
 
helm history releaseName    #查看release的发布历史(包括安装、升级、回滚)
helm status releaseName     #查看release的基本信息

(2)查看chart包的操作命令

helm show chart chartName  #查看chart包中的chart.yaml文件内容
#chart包可以是本地的未打包的chart目录(即helm create 创建出来的chart目录),也可以是打包的chart压缩包(由helm package打包),也可以是保存在仓库中的chart包
 
helm show values chartName    #查看chart包中的values.yaml文件内容
#包同上有3种选择
 
helm show readme chartName     #查看chart包中README文件内容
#包同上有3种选择
 
helm show all chartName   #查看chart包中chart.yaml、values.yaml、README文件内容
#包同上有3种选择

(3)查看release指定内容(与helm show作用、格式相同)

 
helm get notes releaseName      #查看release的说明信息(相当于chart中的NOTES.TXT)
helm get manifest releaseName   #查看release在k8s中创建出来的资源
helm get hooks releaseName      #查看release的回调创建资源
helm get values releaseName     #查看release的values配置
helm get all releaseName        #查看上述所有内容

(4)helm plugin —— 插件管理

 

 
helm plugin list     #查看本地安装好的插件 (插件管理)
 
helm plugin install pluginURL    #安装插件
例:helm plugin install https://github.com/chartmuseum/helm-push
#最后的url地址为插件的下载地址,可参考 https://github.com/chartmuseum/helm-push
 
helm plugin uninstall pluginName   #卸载插件
helm plugin update pluginName   #更新插件,将插件升级到最新版本
#在下载插件的时候会保存插件及其下载地址,更新的时候使用原本的下载地址直接下载最新版本替换

(5)helm repo —— 仓库管理

helm repo list     #(仓库管理)查看添加的chart仓库,可在这些chart仓库中拉取chart(实际上就相当于一个应用的安装包)
 
helm repo add repoName repoURL     #本地添加chart仓库
例:helm repo add abc http://mirror.azure.cn/kubernetes/charts/
#repoName是你自己起的一个名字,用来代表这个repoURL,后续操作仓库的命令中直接用repoName来代替repoURL,只要指定了repoName,就表示要去操作repoName指向的repoURL的仓库
 
helm repo remove repoName  #本地删除chart仓库
 
helm repo update   #将本地所添加的chart仓库的最新信息缓存到本地
#helm search命令是检索某仓库中的chart包,假设仓库中一开始是没有所指定的chart包,所以helm search是检索不到的。这时候如果将chart包上传至该仓库,本地需要执行一遍helm repo update以更新本地的缓存数据才能检索到该指定的chart,因为helm search就是读取本地缓存数据的
 
helm repo index repoDir --url=repoURL     #根据指定仓库目录下的chart包生成index.yaml索引文件
例:helm repo index repo --url=http://192.168.73.108:8080/
#repoDir指定一个仓库的目录,该目录用来存放chart包及索引文件index.yaml。url指定仓库的访问路径,生成的索引文件中会以该url为地址前缀拼接上chart包名作为chart包的访问路径

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

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

相关文章

微服务保护——Sentinel【实战篇】

一、限流规则&#x1f349; 1.簇点链路&#x1f95d; 簇点链路&#xff1a;就是项目内的调用链路&#xff0c;链路中被监控的每个接口就是一个资源。默认情况下sentinel会监控SpringMVC的每一个端点&#xff08;Endpoint&#xff09;&#xff0c;因此SpringMVC的每一个端点&a…

5. MySQL - JDBC SQL 注入 博客系统(万字详解)

目录 1. 介绍 2. 使用 JDBC 连接数据库 2.1 如何使用 JDBC 连接数据库 2.2 导入的各个类 2.3 DataSource 对象的创建 2.4 从 DataSource 对象中得到 Connection 对象 2.5 创建 Statement 对象 2.6 从 ResultSet 中遍历每行结果&#xff0c;从每行中获取每列的值 2.7 代…

【0】冒泡排序

前言 通过函数模板技术设计一个冒泡排序算法&#xff0c;领悟泛型编程的思想和冒泡排序的思想&#xff0c;然后使用QTest测试各种输入值&#xff0c;养成先写测试代码&#xff0c;后写程序代码的习惯 0x0 编写一个int版本的冒泡函数 1.不管要排序的数组长度多长&#xff0c;外…

内核机制在以下方面发挥作用:

进程间通信&#xff1a;内核提供了特定的机制和接口&#xff0c;用于实现进程间的通信。这可以包括共享内存、管道、消息队列、信号量等。通过这些机制&#xff0c;进程可以在内核的帮助下进行数据传输和同步&#xff0c;实现进程间的协作和通信。 进程调度&#xff1a;内核负…

SpringCloud学习路线(1)—— 从头开始的微服务

一、服务架构的历史 现有的服务框架&#xff1a; 单体架构 概念&#xff1a; 将业务所有功能集中在一个项目中开发&#xff0c;打包部署优点&#xff1a; 架构简单&#xff0c;部署成本低缺陷&#xff1a; 耦合度高 分布式架构 概念&#xff1a; 根据业务功能对系统进行拆分&a…

如何在 Excel 中快速生成随机密码?

有时&#xff0c;我们可能想创建随机密码来保护某些重要内容。 但是&#xff0c;您有什么技巧可以在Excel中快速生成随机密码&#xff1f; 在这里&#xff0c;我有一些可以在Excel工作表中处理的方法。 用公式生成随机密码 使用插入随机数据生成随机密码​编辑 用公式生成随机…

从实体按键看 Android 车载的自定义事件机制

在汽车数字化、智能化变革的进程中&#xff0c;越来越多的车机设计或部分、或全部地舍弃了实体按键&#xff0c;进而把车主操作的入口转移到了车机 UI 以及语音助手。 但统一、高效的零层级 UI 颇为困难&#xff0c;语音的准确率、覆盖率亦不够完善&#xff0c;那么在当下的阶段…

STL源码刨析_stack _queue

目录 一. 介绍 1. stack 介绍 2. queue 介绍 二. 模拟实现 1. stack 模拟实现 2. queue 模拟实现 三. deque 1. deque 接口 2. 底层 一. 介绍 1. stack 介绍 stack&#xff08;栈&#xff09;是一种容器适配器&#xff0c;它提供了一种后进先出&#xff08;LIFO&#xff0…

arcgis建筑物平均高度

主要用到相交和属性表的汇总功能。 路网 建筑物栋 相交结果 右键&#xff0c;bh列汇总 原始块有392&#xff0c;这里只有389&#xff0c;说明有的地块没有建筑&#xff0c;所以应该将表连接到原始街区上检查是否合理&#xff0c;以及随机验证一个结果是否正确。 连接结果&…

【SpringBoot应用篇】SpringBoot集成atomikos实现多数据源配置和分布式事务管理

【SpringBoot应用篇】SpringBoot集成atomikos实现多数据源配置和分布式事务管理 分布式事务概念XA和JTA概述SpringBoot集成atomikos数据库结构pom通用工具类RBaseControllerBaseExceptionCodeExceptionCodeBaseExceptionBaseUncheckedExceptionBizException application.yml数据…

C++初阶 - 3.类和对象(中)

目录 1.类的6个默认成员函数 2.构造函数 2.2特性 3.析构函数 3.1 概念 3.2 特性 4. 拷贝构造函数 4.1 概念 4.2 特征 5.赋值运算符重载 5.1运算符重载 5.2 赋值运算符重载 5.3 前置和后置重载 6.日期类的实现 7.const成员 8.取地址及const取地址操作符重载 1.类…

为什么项目可见性难以实现?该如何提高?

在项目和专业服务管理中&#xff0c;失败有时难以避免。沟通不足和需求定义不明确被认为是造成失败的最大原因&#xff0c;这意味着项目可见性和信息流动至关重要。 什么是项目可见性&#xff1f; 项目可见性是组织项目相关信息的方式&#xff0c;以便所有团队成员、项目经理…

使用Jenkins自由风格的软件项目实现接口自动化测试持续集成

这里写目录标题 一、JOB项目配置1、添加描述2、限制项目的运行节点3、源码管理4、构建触发器5、构建步骤6、构建后操作 一、JOB项目配置 1、添加描述 可选选项可填可不填 2、限制项目的运行节点 节点中要有运行环境所需的配置 节点配置教程&#xff1a;https://blog.csdn…

Go语言之并发编程练习,GO协程初识,互斥锁,管道:channel的读写操作,生产者消费者

GO协程初识 package mainimport ("fmt""sync""time" )func read() {defer wg.Done()fmt.Println("read start")time.Sleep(time.Second * 3)fmt.Println("read end") }func listenMusci() {defer wg.Done()fmt.Println(&qu…

在云计算环境中,保护Java应用程序可用的有效措施和工具

云计算&#xff08;Cloud&#xff09;技术是近年来计算机科学的一个重要突破。大多数组织已经通过将自己的应用程序移入云平台而获益。不过&#xff0c;如何保证应用程序在第三方服务器上的安全性&#xff0c;是一项艰巨的挑战。 在本文中&#xff0c;我们将重点讨论Java&…

长沙打造“全球研发中心城市”,智能网联产业如何交卷?

作者 | 魏启扬 来源 | 洞见新研社 知乎上有一个浏览超百万的热门问题——“大家怎么看待长沙这个城市&#xff1f;” 答主“星球研究所”的回答获得了高赞&#xff0c;“这是一个天性如火的城市”。 网红城市的外衣下&#xff0c;从湖南卫视的综艺节目&#xff0c;到网红美…

数据结构--栈

一、栈 数组是一种连续存储、随机访问的线性表&#xff0c;链表属于分散存储、连续访问的线性表。它们每个数据都有其相对位置&#xff0c;有至多一个直接前驱和之多一个直接后继。栈&#xff08;Stack&#xff09;和队列&#xff08;Queue&#xff09;也属于线性表&#xff0c…

Fortinet Accelerate 2023·中国区巡展收官丨让安全成就未来

7月18日&#xff0c;2023 Fortinet Accelerate Summit在上海成功举办&#xff01;这亦象征着“Fortinet Accelerate2023中国区巡展”圆满收官。Fortinet携手来自多个典型行业的百余位代表客户&#xff0c;以及亚马逊云科技、Telstra - PBS 太平洋电信、Tenable等多家生态合作伙…

字幕切分视频

Whisper 仓库地址&#xff1a; https://github.com/openai/whisper 可用模型信息&#xff1a; 测试视频&#xff1a;18段&#xff0c;总共447S视频&#xff08;11段前&#xff1a;有11段开头有停顿的视频&#xff09; Tiny: 跑完&#xff1a;142S &#xff0c;11段前&#xf…

学习opencv.js之基本使用方法(读取,显示,灰度化,边缘检测,特征值点检测)

opencv.js是什么 OpenCV.js 是 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;的 JavaScript 版本。OpenCV 是一个广泛使用的计算机视觉和图像处理库&#xff0c;提供了一系列功能强大的算法和工具&#xff0c;用于处理图像、视频、特征提取、对象识别等…