k8s helm
k8s Helm 是Kubernetes的包管理工具,类似于Linux系统中常用的apt、yum等包管理工具。Helm通过定义、安装和升级Kubernetes应用程序来简化Kubernetes应用部署的复杂性。以下是对k8s Helm的详细解析:
一、Helm的基本概念
Chart:Chart是Helm的包,包含了运行一个应用所需要的镜像、依赖和资源定义等。它是Helm部署应用的基本单位,类似于Linux系统中的软件包。
Release:Release是在Kubernetes集群上运行的Chart的一个实例。同一个Chart可以在同一个集群上安装多次,每次安装都会创建一个新的Release。
Repository:Repository是用于发布和存储Chart的存储库。用户可以从Repository中检索、下载和安装所需的Chart。
二、Helm的架构
Helm主要包括Helm客户端(helm CLI)和Tiller服务端两部分。Tiller部署在Kubernetes集群中,负责处理Chart的安装、升级和卸载等操作。然而,需要注意的是,随着Helm的发展,Tiller组件已经被逐渐废弃,取而代之的是直接在客户端执行操作,并通过Kubernetes API与集群交互。
三、Helm的使用场景
Helm广泛应用于Kubernetes应用的部署和管理中,特别是在需要频繁部署、升级和回滚应用的场景下。通过使用Helm,用户可以轻松地将应用打包成Chart,并在不同的Kubernetes集群中部署和管理这些应用。
四、Helm的操作流程
添加Repository:用户首先需要添加包含所需Chart的Repository。这可以通过helm repo add命令完成,例如添加Elasticsearch的Helm Repository。
搜索Chart:用户可以使用helm search命令在Repository中搜索所需的Chart。
安装Chart:使用helm install命令安装Chart,并创建新的Release。用户可以指定Chart的版本、命名空间以及自定义的配置参数等。
升级Chart:当需要更新应用时,可以使用helm upgrade命令升级Chart。这将更新Release中的Chart到新版本,并根据需要更新相关的Kubernetes资源。
卸载Chart:使用helm uninstall命令可以卸载Chart并删除相关的Kubernetes资源。
五、Helm的优势
简化部署:Helm通过定义Chart来封装应用的部署逻辑,使得应用的部署变得简单快捷。
版本控制:Helm支持Chart的版本控制,用户可以轻松地回滚到之前的版本。
可重用性:Chart可以在不同的Kubernetes集群中重复使用,提高了应用的可移植性和可重用性。
自定义配置:用户可以通过修改Chart中的values.yaml文件来自定义应用的配置参数。
六、总结
k8s Helm是Kubernetes的包管理工具,它通过定义、安装和升级Chart来简化Kubernetes应用的部署和管理。Helm的使用可以大大提高Kubernetes应用的部署效率和可维护性,是Kubernetes生态系统中不可或缺的一部分。
参考4条信息源k8s Helm 是Kubernetes的包管理工具,类似于Linux系统中常用的apt、yum等包管理工具。Helm通过定义、安装和升级Kubernetes应用程序来简化Kubernetes应用部署的复杂性。以下是对k8s Helm的详细解析:
七、HELM部署
[root@master helm]# curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3
[root@master helm]# tar -zvxf helm-v3.12.3-linux-amd64.tar.gz
linux-amd64/
linux-amd64/LICENSE
linux-amd64/README.md
linux-amd64/helm
[root@master helm]# ls
get_helm.sh helm-v3.12.3-linux-amd64.tar.gz linux-amd64
[root@master helm]# cp -a linux-amd64/helm /usr/local/bin/
[root@master helm]# chmod a+x /usr/local/bin/helm
[root@master helm]# helm version
version.BuildInfo{Version:"v3.12.3", GitCommit:"3a31588ad33fe3b89af5a2a54ee1d25bfe6eaa5e", GitTreeState:"clean", GoVersion:"go1.20.7"}
# helm与/home/.kube/config的用户权限相同# 添加官方仓库
[root@master helm]# helm repo add bitnami https://charts.bitnami.com/bitnami
"bitnami" has been added to your repositories[root@master helm]# helm repo ls
NAME URL
bitnami https://charts.bitnami.com/bitnami# 查看有哪些包
[root@master helm]# helm search repo bitnami# 安装 chart 示例$ helm repo update # 确定我们可以拿到最新的 charts 列表
$ helm show values bitnami/apache
$ helm install bitnami/apache --generate-name$ helm show chart bitnami/apache # chart 的基本信息
$ helm show all bitnami/apache # chart 的所有信息#卸载一个版本
$ helm uninstall apache-1612624192 # 该命令会从Kubernetes卸载 mysql-
1612624192, 它将删除和该版本相关的所有相关资源(service、deployment、 pod等等)甚至版本历
史--keep-history # 选项, Helm 将会保存版本历史$ helm status apache-1612624192 # 查看该版本的信息
Chart 代表着 Helm 包。它包含在 Kubernetes 集群内部运行应用程序,工具或服务所需的所有资源定
义。你可以把它看作是 Homebrew formula,Apt dpkg,或 Yum RPM 在Kubernetes 中的等价物
‘helm search’:查找 Charts
# 用于在 Helm Hub(https://hub.helm.sh)上搜索 Helm charts
$ helm search hub wordpress
# 用于在配置的 Helm 仓库中搜索 Helm charts,~/.config/helm/repositories.yaml 中被定义
持久化
helm search repo wordpress
# Helm 搜索使用模糊字符串匹配算法,所以你可以只输入名字的一部分
[root@master ~]# cat ~/.config/helm/repositories.yaml
apiVersion: ""
generated: "0001-01-01T00:00:00Z"
repositories:
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: kubernetes-dashboardpass_credentials_all: falsepassword: ""url: https://kubernetes.github.io/dashboard/username: ""
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: stablepass_credentials_all: falsepassword: ""url: https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartsusername: ""
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: stable2pass_credentials_all: falsepassword: ""url: http://mirror.azure.cn/kubernetes/chartsusername: ""
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: bitnamipass_credentials_all: falsepassword: ""url: https://charts.bitnami.com/bitnamiusername: ""
- caFile: ""certFile: ""insecure_skip_tls_verify: falsekeyFile: ""name: prometheus-communitypass_credentials_all: falsepassword: ""url: https://prometheus-community.github.io/helm-chartsusername: ""
‘helm install’:安装一个 helm 包
$ helm install apache-1612624192 bitnami/apache#安装资源顺序
Namespace > NetworkPolicy > ResourceQuota > LimitRange > PodSecurityPolicy > PodDisruptionBudget > ServiceAccount > Secret > SecretList > ConfigMap > StorageClass > PersistentVolume > PersistentVolumeClaim > CustomResourceDefinition > ClusterRole > ClusterRoleList > ClusterRoleBinding > ClusterRoleBindingList > Role > RoleList > RoleBinding > RoleBindingList > Service > DaemonSet > Pod > ReplicationController > ReplicaSet > Deployment > HorizontalPodAutoscaler > StatefulSet > Job > CronJob > Ingress > APIService
安装前自定义 chart
$ helm show values bitnami/apache # 查看 chart 中的可配置选项
# 使用 YAML 格式的文件覆盖上述任意配置项,并在安装过程中使用该文件
$ vi values.yaml
service:type: NodePort$ helm install -f values.yaml bitnami/apache --generate-name
安装过程中有两种方式传递配置数据
–values (或 -f ):使用 YAML 文件覆盖配置。可以指定多次,优先使用最右边的文件
–set :通过命令行的方式对指定项进行覆盖
如果同时使用两种方式,则 --set 中的值会被合并到 --values 中,但是 --set 中的值优先级更高。
在 --set 中覆盖的内容会被被保存在 ConfigMap 中。可以通过 helm get values 来
查看指定 release 中 --set 设置的值。也可以通过运行 helm upgrade 并指定 --reset-values 字段来
清除 --set 中设置的值
–set 的格式和限制
–set 选项使用0或多个 name/value 对。最简单的用法类似于: --set name=value ,等价于如下
YAML 格式:
name: value
多个值使用逗号分割,因此 --set a=b,c=d 的 YAML 表示是:
a: b
c: d
支持更复杂的表达式。例如, --set outer.inner=value 被转换成了:
outer:inner: value
列表使用花括号( {} )来表示。例如, --set name={a, b, c} 被转换成了:
name:- a- b- c
某些 name/key 可以设置为 null 或者空数组,例如 --set name=[],a=null
name: []
a: null
从 2.5.0 版本开始,可以使用数组下标的语法来访问列表中的元素。例如 --set servers[0].port=80
就变成了:
servers:- port: 80
多个值也可以通过这种方式来设置。 --set servers[0].port=80,servers[0].host=example 变成
了:
servers:- port: 80host: example
如果需要在 --set 中使用特殊字符,你可以使用反斜线来进行转义; --set name=value1,value2 就
变成了:
name: "value1,value2"
–set nodeSelector.“kubernetes.io/role”=master
nodeSelector:kubernetes.io/role: master
更多安装方法
helm install 命令可以从多个来源进行安装:
- chart 的仓库(如上所述)
- 本地 chart 压缩包( helm install foo foo-0.1.1.tgz )
- 解压后的 chart 目录( helm install foo path/to/foo )
- 完整的 URL( helm install foo https://example.com/charts/foo-1.2.3.tgz )
‘helm upgrade’ 和 ‘helm rollback’:升级 release 和失败时恢复当你想升级到 chart 的新版本,或是修改release 的配置,你可以使用 helm upgrade 命令。Helm 会尝试执行最小侵入式升级。即它只会更新自上次发布以来发生了更改的内容
$ helm upgrade -f clusterip.yaml apache-23213213 bitnami/apache
在上面的例子中, apache-23213213 这个 release 使用相同的 chart 进行升级,但是使用了一个新的
YAML 文件:
service.type: ClusterIP
我们可以使用 helm get values 命令来看看配置值是否真的生效了:
$ helm get values apache-23213213
现在,假如在一次发布过程中,发生了不符合预期的事情,也很容易通过 helm rollback [RELEASE]
[REVISION] 命令回滚到之前的发布版本
$ helm history apache-23213213
$ helm rollback apache-23213213 1
上面这条命令将我们的 apache-23213213 回滚到了它最初的版本。release 版本其实是一个增量修订
(revision)。 每当发生了一次安装、升级或回滚操作,revision 的值就会加1。第一次 revision 的值
永远是1。我们可以使用 helm history [RELEASE] 命令来查看一个特定 release 的修订版本号
安装、升级、回滚时的有用选项
- –timeout:一个 Go duration 类型的值, 用来表示等待 Kubernetes 命令完成的超时时间,默认
值为 5m0s。such as “300ms”, “-1.5h” or “2h45m”. Valid time units are “ns”, “us” (or “µs”),
“ms”, “s”, “m”, “h”。 - –wait:表示必须要等到所有的 Pods 都处于 ready 状态,PVC 都被绑定,Deployments 都至少拥
有最小 ready 状态 Pods 个数(Desired减去 maxUnavailable),并且 Services 都具有 IP 地址
(如果是LoadBalancer, 则为 Ingress),才会标记该 release 为成功。最长等待时间由 –
timeout 值指定。如果达到超时时间,release 将被标记为 FAILED。注意:当 Deployment 的
replicas 被设置为1,但其滚动升级策略中的 maxUnavailable 没有被设置为0时,–wait 将返回就
绪,因为已经满足了最小 ready Pod 数 - –no-hooks :不运行当前命令的钩子,即为安装此 chart 时的已定义的安装前或者安装后的动作
- –recreate-pods:(仅适用于 upgrade 和 rollback ):这个参数会导致重建所有的Pod(deployment中的Pod 除外)。(在 Helm 3 中已被废弃)
‘helm uninstall’:卸载 release
$ helm uninstallapache-23213213 # 使用 helm uninstall 命令从集群中卸载一个
release
helm v2 版本中,当一个 release 被删除,会保留一条删除记录。而在 Helm 3 中,删除也会移除
release 的记录。 如果你想保留删除记录,使用 helm uninstall --keep-history 。使用 helm list
–uninstalled 只会展示使用了 --keep-history 删除的 release
helm list --all 会展示 Helm 保留的所有 release 记录,包括失败或删除的条目(指定了 --keephistory )
‘helm repo’:使用仓库
$ helm repo list # 查看配置的仓库,v3 版本已经不再默认添加一个仓库
$ helm repo add dev https://example.com/dev-charts # 添加新的仓库
$ helm repo update # 可以通过执行 helm repo update 命令来确保你的 Helm 客户端是最
新的
$ helm repo remove # 移除仓库
三、创建一个自己的 Chart
基本模式
# 1、创建一个模板
$ helm create myapp
# 2、删除不用的文件
# 3、编写 template 下的 service 和 deployment 资源清单
[root@k8s-master01 myapp]# cat templates/nodePort.yaml
apiVersion: v1
kind: Service
metadata:labels:app: myapp-testname: myapp-test-202401110926-svc
spec:ports:- name: 80-80port: 80protocol: TCPtargetPort: 80nodePort: 31111selector:app: myapp-testtype: NodePort
[root@k8s-master01 myapp]# cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-testname: myapp-test-202401110926-deploy
spec:replicas: 5selector:matchLabels:app: myapp-testtemplate:metadata:labels:app: myapp-testspec:containers:- image: wangyanglinux/myapp:v1.0name: myapp
# 4、发布部署
$ helm install myapp myapp/
注入 HELM 灵魂
[root@k8s-master01 myapp]# cat templates/NOTES.txt
1、这是一个测试的 myapp chart
2、myapp release 名字:myapp-test-{{ now | date "20060102030405" }}-deploy
3、service 名字:myapp-test-{{ now | date "20060102030405" }}-svc
---------------------------------------------------------------------------------
-
[root@k8s-master01 myapp]# cat templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: myapp-testname: myapp-test-{{ now | date "20060102030405" }}-deploy
spec:replicas: {{ .Values.replicaCount }}selector:matchLabels:app: myapp-testtemplate:metadata:labels:app: myapp-testspec:containers:- image: {{ .Values.image.repository }}:{{ .Values.image.tag }}name: myapp
---------------------------------------------------------------------------------
-
[root@k8s-master01 myapp]# cat templates/service.yaml
apiVersion: v1
kind: Service
metadata:labels:app: myapp-testname: myapp-test-{{ now | date "20060102030405" }}-svc
spec:ports:- name: 80-80port: 80protocol: TCPtargetPort: 80{{- if eq .Values.service.type "NodePort" }}nodePort: {{.Values.service.nodeport }}{{- end }}selector:app: myapp-testtype: {{ .Values.service.type | quote }}
---------------------------------------------------------------------------------
-
[root@k8s-master01 myapp]# cat values.yaml
# Default values for myapp.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 5
image:repository: wangyanglinux/myapptag: "v1.0"
service:type: NodePortnodeport: 32321
部署dashboard
[root@master kubernetes-dashboard]# helm install kubernetes-dashboard kubernetes-dashboard-7.5.0.tgz --namespace kubernetes-dashboard
Release “kubernetes-dashboard” does not exist. Installing it now.
NAME: kubernetes-dashboard
LAST DEPLOYED: Thu Aug 29 16:26:51 2024
NAMESPACE: kubernetes-dashboard
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
*** PLEASE BE PATIENT: Kubernetes Dashboard may need a few minutes to get up and become ready ***
Congratulations! You have just installed Kubernetes Dashboard in your cluster.
To access Dashboard run:
kubectl -n kubernetes-dashboard port-forward svc/kubernetes-dashboard-kong-proxy 8443:443
NOTE: In case port-forward command does not work, make sure that kong service name is correct.
Check the services in Kubernetes Dashboard namespace using:
kubectl -n kubernetes-dashboard get svc
Dashboard will be available at:
https://localhost:8443
kubectl edit svc -n kubernetes-dashboard kubernetes-dashboard-kong-proxy
type: ClusterIP --> type: NodePort
#查看
kubectl get svc -A |grep kubernetes-dashboard
[root@master kubernetes-dashboard]# kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default kubernetes ClusterIP 10.0.0.1 <none> 443/TCP 8d
kube-system calico-typha ClusterIP 10.12.153.109 <none> 5473/TCP 43h
kube-system kube-dns ClusterIP 10.0.0.10 <none> 53/UDP,53/TCP,9153/TCP 8d
kubernetes-dashboard kubernetes-dashboard-api ClusterIP 10.4.13.106 <none> 8000/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-auth ClusterIP 10.7.255.171 <none> 8000/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-kong-manager NodePort 10.13.194.147 <none> 8002:31893/TCP,8445:30742/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-kong-proxy NodePort 10.8.2.56 <none> 443:32646/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-metrics-scraper ClusterIP 10.3.118.3 <none> 8000/TCP 5m46s
kubernetes-dashboard kubernetes-dashboard-web ClusterIP 10.15.211.70 <none> 8000/TCP 5m46s
#获取token
[root@master kubernetes-dashboard]# vi dashboard-user.yaml
apiVersion: v1
kind: ServiceAccount
metadata:name: admin-usernamespace: kubernetes-dashboard
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: admin-user
roleRef:apiGroup: rbac.authorization.k8s.iokind: ClusterRolename: cluster-admin
subjects:
- kind: ServiceAccountname: admin-usernamespace: kubernetes-dashboard
#
[root@master kubernetes-dashboard]# kubectl apply -f dashboard-user.yaml
#获取token
[root@master kubernetes-dashboard]# kubectl -n kubernetes-dashboard create token admin-user#创建正式token
[root@master kubernetes-dashboard]# vi dashboard-admin.yaml
apiVersion: v1
kind: Secret
metadata:name: admin-usernamespace: kubernetes-dashboardannotations:kubernetes.io/service-account.name: "admin-user"
type: kubernetes.io/service-account-token#
[root@master kubernetes-dashboard]# kubectl apply -f dashboard-admin.yaml
#获取Token
[root@master kubernetes-dashboard]# kubectl get secret admin-user -n kubernetes-dashboard -o jsonpath={".data.token"} | base64 -d#访问这个端口
kubernetes-dashboard kubernetes-dashboard-kong-proxy NodePort 10.8.2.56 <none> 443:32646/TCP 5m46s
相关文章:
k8s helm
k8s Helm 是Kubernetes的包管理工具,类似于Linux系统中常用的apt、yum等包管理工具。Helm通过定义、安装和升级Kubernetes应用程序来简化Kubernetes应用部署的复杂性。以下是对k8s Helm的详细解析: 一、Helm的基本概念 Chart:Chart是Helm的…...
KMP 详解
KMP数组存的是什么 对于一个字符串 b,下标从1开始。 则kmp[i]表示 以i结尾的连续子串 s的前缀的最大值(等价于前缀最大结尾处) 如何求KMP 假设 i 以前的KMP都被求出来了。 j 表示上一个字符可以成功匹配的长度(等价于下标) …...
go语言并发编程-超详细mutex解析
文章目录 1 go语言并发编程学习-mutex1.1 学习过程1.2 如何解决资源并发访问的问题?【基本用法】1.2.1 并发访问带来的问题1.2.1.1 导致问题的原因 1.2.2 race detector检查data race1.2.3 mutex的基本实现机制以及使用方法1.2.3.1 具体使用-11.2.3.1 具体使用-2 1 …...
VirtualBox Debian 自动安装脚本
概览 相较于原脚本(安装目录/UnattendedTemplates/debian_pressed.cfg)更新如下内容: 配置清华镜像源配置仅主机网卡(后续只需添加仅主机网卡即可)配置Root用户远程登录配置用户sudo组 脚本 debian_pressed.cfg ##…...
最好的开放式耳机?五款红榜开放式耳机推荐!
面对众多的开放式耳机选项,消费者可能会感到难以抉择。买耳机不一定要买最贵最好的,但是一定要选最适合自己的,为了使选择过程更加容易,我提供了一些建议,推荐了几款既适合日常使用又佩戴舒适的热门开放式耳机。 开放式…...
线性代数之线性方程组
目录 线性方程组 1. 解的个数 齐次线性方程组: 非齐次线性方程组: 2. 齐次线性方程组的解 3. 非齐次线性方程组的解 4. 使用 Python 和 NumPy 求解线性方程组 示例代码 齐次线性方程组 非齐次线性方程组 示例结果 齐次线性方程组 非齐次线性…...
速盾:怎么查看是否使用cdn服务?
CDN(Content Delivery Network),即内容分发网络,是一种加速网络内容传输的技术。通过在全球各地建立分布式的节点服务器,将网站的静态资源缓存到最近的节点服务器上,使用户可以从离自己地理位置最近的节点服…...
828华为云征文|采用Flexus云服务器X实例部署RTSP直播服务器
一、前言 这篇文章讲解: 采用华为云最新推出的Flexus云服务器X实例搭建RTSP服务器,完成视频直播需求。 随着实时视频流传输需求的增长,RTSP(实时流协议)服务器成为了许多视频监控、直播和多媒体应用的核心组件。在当…...
Spring Cloud Gateway(二)
Spring Cloud Gateway(二) 文章目录 Spring Cloud Gateway(二)Gateway工作原理为什么使用API网关高并发Gateway性能优化 Gateway工作原理 Spring Cloud Gateway旨在为微服务架构提供简单、有效并且统一的API路由管理方式。它不仅…...
docker 简易入门
# docker 简易入门 docker由几个组成部分 docker client: 即 docker 命令行工具 docker host: 宿主机,docker daemon 的运行环境服务器 docker daemon: docker 的守护进程,docker client 通过命令行与 docker daemon 交互 container: 最小型的一个操…...
【看雪-注册安全分析报告】
前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…...
记录一个前端学习小组的收集的模版
问题1:输入“您的姓名”,选择“短答案”作为问题类型。问题2:输入“您是否愿意继续参加前端学习小组?”,选择“单选”作为问题类型,并添加选项“是”和“否”。问题3:输入“如果您选择‘是’&am…...
Rk3588 Android12 AIDL 开发
AIDL (Android Interface Definition Language) 和 HIDL (HAL Interface Definition Language) 都是 Android 系统中用于定义接口的工具,但它们有不同的用途和特性。 AIDL (Android Interface Definition Language) 用途: 主要用于应用程序之间的进程间…...
两个长整数字符串求和(不允许使用ES6+)
两个长整数字符串求和(不允许使用ES6), 面试手撸代码遇到到这个问题 1. 实现方式第一种 // 短整数字符串前边补 0; num需要补 0 的短整数字符串, len 长整数字符串的长度 function fillZero (num, len) {let str num.toString();if (str.length < len) {str 0.repeat(…...
11 Java 方法引用、异常处理、Java接口之函数式编程(接口知识补充Function<T,R>、BiFunction<T, U, R>和自定义泛型接口)
文章目录 前言一、Java接口之函数式编程 --- 接口知识补充1 Function<T,R>泛型接口2 BiFunction<T, U, R>泛型接口3 自定义泛型函数式编程接口4 使用lambda表达式、方法引用进行函数式编程二、方法引用1 方法引用初体验(以Array.sort()方法为例)(1)什么是方法引…...
深入探索 Go 语言的编译器与垃圾回收机制
Go 编译器 Go 编译器是通过 go 工具执行的,这个工具的功能不仅仅是生成可执行文件。你可以使用 go tool compile 命令来编译一个 Go 源文件。这个操作将生成一个目标文件,也就是 .o 后缀的文件。以下是在 macOS Mojave 系统上执行的命令和结果展示&…...
2024国赛数学建模-模拟火算法(MATLAB 实现)
模拟退火算法 1.1 算法原理 模拟退火算法的基本思想是从一给定解开始 ,从邻域 中随机产生另一个解 ,接受 Metropolis准则允许目标函数在 有限范围内变坏 ,它由一控制参数 t决定 ,其作用类似于物 理过程中的温度 T,对于控制参数的每一取值 ,算法持续进 行“产生 —判断 —接受…...
YOLOv8 只检测人 只画框不要标签
参考了这个:YOLOv8只检测人(或其他一种或者多种类别)_yolov8只检测指定类别-CSDN博客 1. 只检测人:predict的时候指定参数classes[0] 2. 只画框不要标签:plot的时候传入labelsFalse 3. 标签中去掉置信度:…...
如何将网络安全防范游戏化
组织对威胁的准备和恢复能力跟不上网络犯罪分子的进步。 一些首席执行官仍然认为网络安全需要偶尔干预,而不是持续关注。 但对于许多公司来说,情况并非如此;网络威胁准备需要协调一致的培训工作,因此网络安全团队在攻击发生时已…...
Qt QGraphicsView实现图片放缩、鼠标拖动移动、鼠标点位置放大缩小_图片查看
QtQGraphicsView实现图片放缩、鼠标拖动移动、鼠标点位置放大缩小 头文件: #ifndef TIMGWIDGET_H #define TIMGWIDGET_H#include <QGraphicsItem> #include <QMainWindow> #include <QObject> #include <QWidget>// class TImgWidget : pu…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
