k8s中部署Jenkins、SonarQube、StorageClass部署流程

部署Jenkins

系统环境:

• kubernetes 版本:1.23.3

• jenkins 版本:2.172

• jenkins 部署示例文件 Github 地址:https://github.com/my-dlq/blog-example/tree/master/jenkins-deploy

一、设置存储目录

在 Kubenetes 环境下所起的应用都是一个个 Docker 镜像,为了保证应用重启的情况下数据安全,所以需要将 Jenkins 持久化到存储中。这里用的是 NFS 网路存储,方便在 Kubernetes 环境下应用启动节点转义数据一致。当然也可以选择存储到本地,但是为了保证应用数据一致,需要设置 Jenkins 固定到某一 Kubernetes 节点。

1、安装 NFS 服务端

详情请看 CentOS7 搭建 nfs 服务器 ,这里不过多叙述。

2、挂载 NFS 并设置存储文件夹

如果不能直接操作 NFS 服务端创建文件夹,需要知道 NFS 服务器地址,然后将其挂在到本地目录,进入其中创建 Jenkins 目录空间。

(1)、挂载 NFS

$ mount -o vers=4.1 192.168.2.11:/nfs/ /nfs

(2)、在 NFS 共享存储文件夹下创建存储 Jenkins 数据的文件夹

$ mkdir -p /nfs/data/jenkins

二、创建 PV & PVC

创建 PV 绑定 NFS 创建的 Jenkins 目录,然后创建 PVC 绑定这个 PV,将此 PVC 用于后面创建 Jenkins 服务时挂载的存储。

1、准备 PV & PVC 部署文件

一定要确保 PV 的空间大于 PVC,否则无法关联

jenkins-pv-pvc.yaml

apiVersion: v1
kind: PersistentVolume
metadata:name: jenkinslabels:app: jenkins
spec:capacity:          storage: GiaccessModes:       - ReadWriteOncepersistentVolumeReclaimPolicy: Retain  mountOptions:   #NFS挂在选项- hard- nfsvers=4.1    nfs:            #NFS设置path: /nfs/data/jenkins   server: 192.168.2.11
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: jenkins
spec:accessModes:- ReadWriteOnceresources:requests:storage: Gi   #生产环境空间一定要设置比较大点selector:matchLabels:app: jenkins
2、创建 PV & PVC

提前将 namespace 修改成你自己的 namespace

• -n:指定 namespace

$ kubectl apply -f jenkins-pv-pvc.yaml -n public

三、创建 ServiceAccount & ClusterRoleBinding

此 kubernetes 集群用的是 RBAC 安全插件,必须创建权限给一个 ServiceAccount,然后将此 ServiceAccount 绑定到 Jenkins 服务,这样赋予 Jenkins 服务一定权限执行一些操作,为了方便,这里将 cluster-admin 绑定到 ServiceAccount 以保证 Jenkins 能拥有一定的权限。

注意:请提前修改 yaml 中的 namespace

(1)、jenkins-rbac.yaml

apiVersion: v1
kind: ServiceAccount
metadata:name: jenkins-admin       #ServiceAccount名namespace: mydlqcloud     #指定namespace,一定要修改成你自己的namespacelabels:name: jenkins
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:name: jenkins-adminlabels:name: jenkins
subjects:- kind: ServiceAccountname: jenkins-adminnamespace: mydlqcloud
roleRef:kind: ClusterRolename: cluster-adminapiGroup: rbac.authorization.k8s.io

(2)、创建 RBAC 命令

$ kubectl create -f jenkins-rbac.yaml

四、创建 Service & Deployment

这里开始部署 Jenkins 服务,创建 Service 与 Deployment,其中 Service 暴露两个接口 80880 与 50000。而 Deployment 里面要注意的是要设置上面创建的 ServiceAccount ,并且设置容器安全策略为“runAsUser: 0”以 Root 权限运行容器,而且暴露8080、50000两个端口。

1、创建 Service & Deployment 部署文件

jenkins-deployment.yaml

apiVersion: v1
kind: Service
metadata:name: jenkinslabels:app: jenkins
spec:type: NodePortports:- name: httpport:           #服务端口targetPort: nodePort:   #NodePort方式暴露 Jenkins 端口- name: jnlpport:          #代理端口targetPort: nodePort: selector:app: jenkins
---
apiVersion: apps/v1
kind: Deployment
metadata:name: jenkinslabels:app: jenkins
spec:selector:matchLabels:app: jenkinsreplicas: template:metadata:labels:app: jenkinsspec:serviceAccountName: jenkins-admincontainers:- name: jenkinsimage: registry.cn-shanghai.aliyuncs.com/mydlq/jenkins:2.172securityContext:                     runAsUser:        #设置以ROOT用户运行容器privileged: true   #拥有特权ports:- name: httpcontainerPort: - name: jnlpcontainerPort: resources:limits:memory: Gicpu: "1000m"requests:memory: Gicpu: "500m"env:- name: LIMITS_MEMORYvalueFrom:resourceFieldRef:resource: limits.memorydivisor: Mi- name: "JAVA_OPTS"  #设置变量,指定时区和 jenkins slave 执行者设置value: "-Xmx$(LIMITS_MEMORY)m-XshowSettings:vm-Dhudson.slaves.NodeProvisioner.initialDelay=0-Dhudson.slaves.NodeProvisioner.MARGIN=50-Dhudson.slaves.NodeProvisioner.MARGIN0=0.85-Duser.timezone=Asia/Shanghai"    - name: "JENKINS_OPTS"value: "--prefix=/jenkins"         #设置路径前缀加上 JenkinsvolumeMounts:                        #设置要挂在的目录- name: datamountPath: /var/jenkins_homevolumes:- name: datapersistentVolumeClaim:claimName: jenkins      #设置PVC

参数说明

• JAVA_OPTS: JVM 参数设置

• JENKINS_OPTS: Jenkins 参数设置

• 设置执行任务时候不等待:

默认情况下,Jenkins生成代理是保守的。例如,如果队列中有两个构建,它不会立即生成两个执行器。它将生成一个执行器,并等待某个时间释放第一个执行器,然后再决定生成第二个执行器。Jenkins确保它生成的每个执行器都得到了最大限度的利用。如果你想覆盖这个行为,并生成一个执行器为每个构建队列立即不等待,所以在Jenkins启动时候添加这些参数:

• -Dhudson.slaves.NodeProvisioner.initialDelay=0

• -Dhudson.slaves.NodeProvisioner.MARGIN=50

• -Dhudson.slaves.NodeProvisioner.MARGIN0=0.85

2、部署 Jenkins

执行 Kuberctl 命令将 Jenkins 部署到 Kubernetes 集群。

注意:将“-n”后面的 namespace 换成你自己的 namespace

• -n:指定应用启动的 namespace

$ kubectl create -f jenkins-deployment.yaml -n mydlqcloud

五、获取 Jenkins 生成的 Token

在安装 Jenkins 时候,它默认生成一段随机字符串,用于安装验证。这里访问它的安装日志,获取它生成的 Token 字符串。

(1)、查看 Jenkins Pod 启动日志

注意:这里“-n”指的是要 namespace,后面跟的 namespace 请替换成你jenkins 启动的 namespace

$ kubectl log $(kubectl get pods -n mydlqcloud | awk '{print $1}' | grep jenkins) -n mydlqcloud

(2)、查看日志中生成的 Token 字符串

查看日志,默认给的token为:

*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:3b3e0dda9d6746358ade987775f924efThis may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************

六、启动 Jenkins 进行安装

输入集群地址和 Jenkins Service 提供的 NodePort 端口,访问 Jenkins 进行安装步骤,可以按下一步步执行:

1、进入Jenkins

输入集群地址和上面设置的Nodeport方式的端口 32001,然后输入上面获取的 Token 字符串。例如,本人的集群IP为 192.168.2.11 ,所以就可以访问 http://192.168.2.11:32001/jenkins ,进入后可以看到下面的界面。

图片

2、安装插件

选择自定义插件来进行安装

图片

安装一些常用的插件,这里可以选择一下,推荐安装下面插件。

图片

图片

图片

确定后可以看到正在安装插件界面

3、设置用户名、密码

然后进入 Jenkins 界面

图片

七、其他

1、插件因网络问题安装失败

如果 Jenkins 安装插件失败,则可以按一下设置

• (1)、进入地址 http://192.168.2.11:32001/jenkins/pluginManager/advanced

• (2)、将最下面的 Update Site 的 URL 地址替换成:http://mirror.esuni.jp/jenkins/updates/update-center.json

• (3)、点“submit”按钮,然后点右下角角 “check now”

• (4)、然后输入地址 http://192.168.2.11:32001/jenkins/restart 重启 jenkins 后再重新安装插件

PS:上面地址替换成你们的集群地址及端口。

图片

图片

部署SonarQube

SonarQube 是一款用于代码质量管理的开源工具,它主要用于管理源代码的质量。 通过插件形式,可以支持众多计算机语言,比如 java, C#, go,C/C++, PL/SQL, Cobol, JavaScrip, Groovy 等。sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具来检测你的代码,帮助你发现代码的漏洞,Bug,异味等信息。 Sonar 不仅提供了对 IDE 的支持,可以在 Eclipse和 IntelliJ IDEA 这些工具里联机查看结果;同时 Sonar 还对大量的持续集成工具提供了接口支持,可以很方便地在持续集成中使用 Sonar。

Sonar可以从以下七个维度检测代码质量,而作为开发人员至少需要处理前5种代码质量问题。

1. 不遵循代码标准 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具规范代码编写。

2. 潜在的缺陷 sonar可以通过PMD,CheckStyle,Findbugs等等代码规则检测工具检 测出潜在的缺陷。

3. 糟糕的复杂度分布 文件、类、方法等,如果复杂度过高将难以改变,这会使得开发人员 难以理解它们, 且如果没有自动化的单元测试,对于程序中的任何组件的改变都将可能导致需要全面的回归测试。

4. 重复 显然程序中包含大量复制粘贴的代码是质量低下的,sonar可以展示 源码中重复严重的地方。

5. 注释不足或者过多 没有注释将使代码可读性变差,特别是当不可避免地出现人员变动 时,程序的可读性将大幅下降 而过多的注释又会使得开发人员将精力过多地花费在阅读注释上,亦违背初衷。

6. 缺乏单元测试 sonar可以很方便地统计并展示单元测试覆盖率。

7. 糟糕的设计 通过sonar可以找出循环,展示包与包、类与类之间的相互依赖关系,可以检测自定义的架构规则 通过sonar可以管理第三方的jar包,可以利用LCOM4检测单个任务规则的应用情况, 检测耦合。

1、环境介绍

1.1、kubernetes集群环境
[root@k8s-master-01 ~]# kubectl get nodes
NAME            STATUS   ROLES    AGE    VERSION
k8s-master-01   Ready    master   5d5h   v1.23.3
k8s-master-02   Ready    master   5d4h   v1.23.3
k8s-master-03   Ready    master   5d4h   v1.23.3
k8s-node-01     Ready    <none>   5d4h   v1.23.3
k8s-node-02     Ready    <none>   5d4h   v1.23.3
k8s-node-03     Ready    <none>   5d4h   v1.23.3
1.2、存储环境

本集群中kubernetes底层存储使用的是glusterfs,并且以glusterfs作为存储创建了storageclass便于动态创建pv

[root@k8s-master-01 ~]# kubectl get sc
NAME             PROVISIONER               AGE
gluster-heketi   kubernetes.io/glusterfs   4d22h
1.3、sonarqube版本

SonarQube版本:7.9.1

2、部署sonarqube

SonarQube需要依赖数据库存储数据,且SonarQube7.9及其以后版本将不再支持Mysql,所以这里推荐设置PostgreSQL作为SonarQube的数据库。

2.1、部署[PostgreSQL]

k8s集群部署PostgreSQL,需要将数据库的数据文件持久化,因此需要创建对应的pv,本次安装通过storageclass创建pv。由于postgre只需要集群内部连接,因此采用Headless service来创建数据库对应的svc,数据库的端口是5432,最终的yaml如下

apiVersion: apps/v1
kind: Deployment
metadata:name: postgres-sonarlabels:app: postgres-sonar
spec:replicas: 1selector:matchLabels:app: postgres-sonartemplate:metadata:labels:app: postgres-sonarspec:containers:- name: postgres-sonarimage: postgres:11.4imagePullPolicy: IfNotPresentports:- containerPort: 5432env:- name: POSTGRES\_DBvalue: "sonarDB"- name: POSTGRES\_USERvalue: "sonarUser"- name: POSTGRES\_PASSWORD value: "123456"resources:limits:cpu: 1000mmemory: 2048Mirequests:cpu: 500mmemory: 1024MivolumeMounts:- name: datamountPath: /var/lib/postgresql/datavolumes:- name: datapersistentVolumeClaim:claimName: postgres-data
--- 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: postgres-data 
spec:accessModes:- ReadWriteManystorageClassName: "gluster-heketi"resources:requests:storage: 1Gi
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: postgres-data 
spec:accessModes:- ReadWriteManystorageClassName: "gluster-heketi"resources:requests:storage: 1Gi---apiVersion: v1
kind: Service
metadata:name: postgres-sonarlabels:app: postgres-sonar
spec:clusterIP: Noneports:- port: 5432protocol: TCPtargetPort: 5432selector:app: postgres-sonar

 • 执行kubectl apply创建资源,并检查对应的pv,pvc以及日志

[root@k8s-master-01 ~\]# kubectl get pv,pvc
NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS     REASON   AGE
persistentvolume/pvc-f0157e05-427b-45af-8c09-9803b11f7036   1Gi        RWX            Retain           Bound    default/postgres-data    gluster-heketi            133mNAME                                   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
persistentvolumeclaim/postgres-data    Bound    pvc-f0157e05-427b-45af-8c09-9803b11f7036   1Gi        RWX            gluster-heketi   133m
[root@k8s-master-01 ~\]# kubectl get pods
NAME                               READY   STATUS    RESTARTS   AGE
[root@k8s-master-01 ~\]# kubectl get pods|grep postgres
postgres-sonar-75d7f8d99-sxdnn     1/1     Running   0          136m
2.2、部署SonarQube

先看看yaml,后面附上说明:

apiVersion: apps/v1
kind: Deployment
metadata:name: sonarqubelabels:app: sonarqube
spec:replicas: 1selector:matchLabels:app: sonarqubetemplate:metadata:labels:app: sonarqubespec:initContainers:- name: init-sysctlimage: busyboximagePullPolicy: IfNotPresentcommand: \["sysctl", "-w", "vm.max\_map\_count=262144"\]securityContext:privileged: truecontainers:- name: sonarqubeimage: sonarqube:ltsports:- containerPort: 9000env:- name: SONARQUBE\_JDBC\_USERNAMEvalue: "sonarUser"- name: SONARQUBE\_JDBC\_PASSWORDvalue: "123456"- name: SONARQUBE\_JDBC\_URLvalue: "jdbc:postgresql://postgres-sonar:5432/sonarDB"livenessProbe:httpGet:path: /sessions/newport: 9000initialDelaySeconds: 60periodSeconds: 30readinessProbe:httpGet:path: /sessions/newport: 9000initialDelaySeconds: 60periodSeconds: 30failureThreshold: 6resources:limits:cpu: 2000mmemory: 2048Mirequests:cpu: 1000mmemory: 1024MivolumeMounts:- mountPath: /opt/sonarqube/confname: datasubPath: conf- mountPath: /opt/sonarqube/dataname: datasubPath: data- mountPath: /opt/sonarqube/extensionsname: datasubPath: extensionsvolumes:- name: datapersistentVolumeClaim:claimName: sonarqube-data  ---apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: sonarqube-data 
spec:accessModes:- ReadWriteManystorageClassName: "gluster-heketi"resources:requests:storage: 10Gi---apiVersion: v1
kind: Service
metadata:name: sonarqubelabels:app: sonarqube
spec:type: NodePortports:- name: sonarqubeport: 9000targetPort: 9000nodePort: 30003protocol: TCPselector:app: sonarqube

• 实践中value: "jdbc:postgresql://postgres-sonar:5432/sonarDB"中的postgres-sonar直接写入集群IP也可以的

• 通过官方的sonar镜像部署,通过环境变量指定连接数据库的地址信息,同样通过storageclass来提供存储卷,通过NodePort方式暴露服务。

• 与常规部署不同的是,这里对sonar通过init container进行了初始化,执行修改了容器的vm.max_map_count大小。修改这里的原因可以参考官方文档

图片

修改此权限需要授权能执行系统命令

securityContext: privileged: true

2.3、访问检查

上述部署完成后,检查控制器创建的pod是否正常,并通过nodeport方式访问即可,默认登录的用户名和密码是admin/admin 中文插件名称:Chinese Pack,安装过程在界面操作,这里省略

图片

StorageClass部署流程

为什么需要StorageClass

在一个大规模的Kubernetes集群里,可能有成千上万个PVC,这就意味着运维人员必须实现创建出这个多个PV,此外,随着项目的需要,会有新的PVC不断被提交,那么运维人员就需要不断的添加新的,满足要求的PV,否则新的Pod就会因为PVC绑定不到PV而导致创建失败.而且通过 PVC 请求到一定的存储空间也很有可能不足以满足应用对于存储设备的各种需求,而且不同的应用程序对于存储性能的要求可能也不尽相同,比如读写速度、并发性能等,为了解决这一问题,Kubernetes 又为我们引入了一个新的资源对象:StorageClass,通过 StorageClass 的定义,管理员可以将存储资源定义为某种类型的资源,比如快速存储、慢速存储等,用户根据 StorageClass 的描述就可以非常直观的知道各种存储资源的具体特性了,这样就可以根据应用的特性去申请合适的存储资源了

StorageClass部署流程

  • • 要使用 StorageClass,我们就得安装对应的自动配置程序,比如我们这里存储后端使用的是 nfs,那么我们就需要使用到一个 nfs-client 的自动配置程序,我们也叫它 Provisioner,这个程序使用我们已经配置好的 nfs 服务器,来自动创建持久卷,也就是自动帮我们创建 PV。

搭建StorageClass+NFS,大致有以下几个步骤:

1.创建一个可用的NFS Serve 2.创建Service Account.这是用来管控NFS provisioner在k8s集群中运行的权限 3.创建StorageClass.负责建立PVC并调用NFS provisioner进行预定的工作,并让PV与PVC建立管理 4.创建NFS provisioner.有两个功能,一个是在NFS共享目录下创建挂载点(volume),另一个则是建了PV并将PV与NFS的挂载点建立关联

创建StorageClass

部署NFS

• 在所有节点中执行

yum -y install nfs-utils rpcbind
systemctl enable rpcbind && systemctl start nfs
systemctl enable nfs-server && systemctl start rpcbind

• 创建共享目录 

# 创建共享目录
mkdir /home/data
# 设置环境变量
vi /etc/exports
# 添加以下内容
/home/data *(insecure,rw,sync,no_subtree_check,no_root_squash)
# 重启服务systemctl restart nfs
创建目录
添加nfs-subdir-external-provisioner仓库
helm repo add nfs-subdir-external-provisioner https://kubernetes-sigs.github.io/nfs-subdir-external-provisioner/
查看nfs-subdir-external-provisioner所有版本
 helm search repo nfs-subdir-external-provisioner --versions
拉取文件
helm pull nfs-subdir-external-provisioner/nfs-subdir-external-provisioner --version 4.0.14Error: Get "https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner/releases/download/nfs-subdir-external-provisioner-4.0.14/nfs-subdir-external-provisioner-4.0.14.tgz": unexpected EOF根据报错去下载这个包
解压chart包
tar -xzvf nfs-subdir-external-provisioner-4.0.14.tgz
打开values配置文件
vi nfs-subdir-external-provisioner/values.yaml
修改如下参数replicaCount: 3 # 第1行,副本个数,根据自身需求设置,建议3个
image: registry.cn-beijing.aliyuncs.com/xngczl/nfs-subdir-external-provisione
repository: # 第5行,设置镜像仓库
tag: v4.0.0 # 第6行,镜像版本
nfs:
server: 192.168.1.101 # 第11行,nfs server端地址
path: /home/data # 第12行,nfs目录
storageClass:
defaultClass: true # 第27行,设置为默认存储类,如果不设置,使用存储类时需要指定
name: nfs-storage # 第31行,设置存储类资源名称
创建命名空间
kubectl create namespace nfs-storage
安装nfs-subdir-external-provisioner
helm install nfs-subdir-external-provisioner nfs-subdir-external-provisioner -n nfs-storage
查看pod
kubectl get pod -n nfs-storage
测试

创建PVC的yaml文件

cat > test-pvc.yaml << EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: test-pvc
spec:
storageClassName: nfs-storage # 指定存储类,如果设置了默认,可以去掉
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
EOF
创建pvc,会自动相应的pv
kubectl apply -f test-pvc.yaml -n nfs-storage
查看pvc和pv是否创建
kubectl get pvc,pv -n nfs-storage

关于StorageClass回收策略对数据的影响

第一种
# 配置archiveOnDelete: "false"  reclaimPolicy: Delete   #默认没有配置,默认值为Delete
#结果
1.pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
2.sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
3.删除PVC后,PV被删除且NFS Server对应数据被删除
第二种
#配置archiveOnDelete: "false"  reclaimPolicy: Retain  
#结果
1.pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
2.sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
3.删除PVC后,PV不会别删除,且状态由Bound变为Released,NFS Server对应数据被保留
4.重建sc后,新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中
第三种
#配置archiveOnDelete: "ture"  reclaimPolicy: Retain 
#结果
1.pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
2.sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
3.删除PVC后,PV不会别删除,且状态由Bound变为Released,NFS Server对应数据被保留
4.重建sc后,新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中
第四种
#配置archiveOnDelete: "ture"  reclaimPolicy: Delete 
#结果
1.pod删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
2.sc删除重建后数据依然存在,旧pod名称及数据依然保留给新pod使用
3.删除PVC后,PV不会别删除,且状态由Bound变为Released,NFS Server对应数据被保留
4.重建sc后,新建PVC会绑定新的pv,旧数据可以通过拷贝到新的PV中

总结:除以第一种配置外,其他三种配置在PV/PVC被删除后数据依然保留

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习·概率论基础

概率论 概率基础 这部分太简单&#xff0c;直接略过 条件概率 独立性 独立事件A和B的交集如下 非独立事件 非独立事件A和B的交集如下 贝叶斯定理 先验 事件 后验 在概率论和统计学中&#xff0c;先验概率和后验概率是贝叶斯统计的核心概念 简单来说后验概率就是结合了先验概…

【SpingCloud】客户端与服务端负载均衡机制,微服务负载均衡NacosLoadBalancer, 拓展:OSI七层网络模型

客户端与服务端负载均衡机制 可能有第一次听说集群和负载均衡&#xff0c;所以呢&#xff0c;我们先来做一个介绍&#xff0c;然后再聊服务端与客户端的负载均衡区别。 集群与负载均衡 负载均衡是基于集群的&#xff0c;如果没有集群&#xff0c;则没有负载均衡这一个说法。 …

springcolud学习05Feign

Feign Feign是一个声明式的http客户端,我们知道,在不使用Feign之前,在微服务中,一个模块如果想要调用另一个模块中的某个功能,需要向其发起请求http请求,如果不使用Feign,我们就需要通过硬编码的形式去编写构建http请求 新建模型,建立一个和consumer一样的module,不…

Python 实现PDF和TIFF图像之间的相互转换

PDF是数据文档管理领域常用格式之一&#xff0c;主要用于存储和共享包含文本、图像、表格、链接等的复杂文档。而TIFF&#xff08;Tagged Image File Format&#xff09;常见于图像处理领域&#xff0c;主要用于高质量的图像文件存储。 在实际应用中&#xff0c;我们可能有时需…

leetcode算法题之接雨水

这是一道很经典的题目&#xff0c;问题如下&#xff1a; 题目地址 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 解法1&#xff1a;动态规划 动态规划的核心就是将问题拆分成若干个子问题求解&#…

TCP与UDP网络编程

网络通信协议 java.net 包中提供了两种常见的网络协议的支持: UDP&#xff1a;用户数据报协议(User Datagram Protocol)TCP&#xff1a;传输控制协议(Transmission Control Protocol) TCP协议与UDP协议 TCP协议 TCP协议进行通信的两个应用进程&#xff1a;客户端、服务端 …

GD32相较于STM32的优劣势

优势 1.更高的主频 GD32单片机的主频可以达到108MHz&#xff0c;‌而STM32的最大主频为72MHz&#xff0c;‌这意味着GD32在代码执行速度上具有优势&#xff0c;‌适合需要快速处理数据的场景 2.更低的内核电压 GD32的内核电压为1.2V&#xff0c;‌而STM32的内核电压为1.8V。…

【保姆级介绍服务器硬件的基础知识】

🌈个人主页: 程序员不想敲代码啊 🏆CSDN优质创作者,CSDN实力新星,CSDN博客专家 👍点赞⭐评论⭐收藏 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步! 🦭服务器硬件基础知识 1. 🦭前言2. 🦭中央处理器(CPU)3. 🦭…

LeYOLO, New Scalable and Efficient CNN Architecture for Object Detection

LeYOLO, New Scalable and Efficient CNN Architecture for Object Detection 论文链接&#xff1a;http://arxiv.org/abs/2406.14239 代码链接&#xff1a;https://github.com/LilianHollard/LeYOLO 一、介绍 本文关注基于FLOP的高效目标检测计算的神经网络架构设计选择&am…

STM32CUBEIDE FreeRTOS操作教程(一):LED闪灯

STM32CUBEIDE FreeRTOS操作教程&#xff08;一&#xff09;&#xff1a;LED闪灯 STM32CUBEIDE(不是STM32CUBEMX)开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开…

利用PyTorch进行模型量化

利用PyTorch进行模型量化 目录 利用PyTorch进行模型量化 一、模型量化概述 1.为什么需要模型量化&#xff1f; 2.模型量化的挑战 二、使用PyTorch进行模型量化 1.PyTorch的量化优势 2.准备工作 3.选择要量化的模型 4.量化前的准备工作 三、PyTorch的量化工具包 1.介…

微软的Edge浏览器如何设置兼容模式

微软的Edge浏览器如何设置兼容模式&#xff1f; Microsoft Edge 在浏览部分网站的时候&#xff0c;会被标记为不兼容&#xff0c;会有此网站需要Internet Explorer的提示&#xff0c;虽然可以手动点击在 Microsoft Edge 中继续浏览&#xff0c;但是操作起来相对复杂&#xff0c…

【BUG】已解决:Downgrade the protobuf package to 3.20.x or lower.

Downgrade the protobuf package to 3.20.x or lower. 目录 Downgrade the protobuf package to 3.20.x or lower. 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&#xff0c;我是博主英杰&#xff0c;211科班出身…

Stable Diffusion基本原理通俗讲解

Stable Diffusion是一种基于深度学习的图像生成技术&#xff0c;它属于生成对抗网络&#xff08;GANs&#xff09;的一种。简单来说&#xff0c;Stable Diffusion通过训练一个生成器&#xff08;Generator&#xff09;和一个判别器&#xff08;Discriminator&#xff09;&#…

Vue使用FullCalendar实现日历/周历/月历

Vue使用FullCalendar实现日历/周历/月历 需求背景&#xff1a;项目上遇到新需求&#xff0c;要求实现工单以日/周/月历形式展示。而且要求不同工单根据状态显示不同颜色&#xff0c;一个工单内部&#xff0c;需要以不同颜色显示三个阶段。 效果图 日历 周历 月历 安装插件…

【unity 新手教程 001/100】安装与窗口布局介绍

欢迎关注 、订阅专栏 【unity 新手教程】谢谢你的支持&#xff01;&#x1f49c;&#x1f49c; Unity下载与安装 &#x1f449;点击跳转详细图文步骤&#xff1a;Unity Hub Unity 编辑器 窗口布局&#xff1a; Hierarchy: 层级窗口 | 默认 Sample Scene (main camera、direc…

75.WEB渗透测试-信息收集- WAF、框架组件识别(15)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;74.WEB渗透测试-信息收集- WAF、框架组件识别&#xff08;14&#xff09; php常见的组件…

视频汇聚平台EasyCVR启动出现报错“cannot open shared object file”的原因排查与解决

安防视频监控EasyCVR安防监控视频系统采用先进的网络传输技术&#xff0c;支持高清视频的接入和传输&#xff0c;能够满足大规模、高并发的远程监控需求。EasyCVR平台支持多种视频流的外部分发&#xff0c;如RTMP、RTSP、HTTP-FLV、WebSocket-FLV、HLS、WebRTC、fmp4等&#xf…

xmind--如何快速将Excel表中多列数据,复制到XMind分成多级主题

每次要将表格中的数据分成多级时&#xff0c;只能复制粘贴吗 快来试试这个简易的方法吧 这个是原始的表格&#xff0c;分成了4级 步骤&#xff1a; 1、我们可以先按照这个层级设置下空列&#xff08;后买你会用到这个空列&#xff09; 二级不用加、三级前面加一列、四级前面加…

Chrome v8 pwn 前置

文章目录 参考用到啥再更新啥简介环境搭建depot_tools和ninjaturbolizer 调试turbolizer使用结构数组 ArrayArrayBufferDataViewWASMJSObject结构Hidden Class命名属性-快速属性Fast Properties命名属性-慢速属性Slow Properties 或 字典模式Dictionary Mode编号属性 (Elements…