使用Helm安装、 升级、 回滚Kubernetes应用
前言
在我之前做的项目里,我们对Microk8s微服务的更新是通过自制tar包的方式做的, tar包存储了镜像和YAML文件。 每次升级时,我们需要先删除所有的YAML资源,然后重新创建新的资源。 这种方式存在以下问题:
- 服务中断:由于需要先删除旧资源再创建新资源,这会导致短暂的服务中断,影响用户体验
- 复杂的回滚逻辑:如果升级失败,回滚到之前的版本变得非常复杂,需要手动恢复旧的YAML文件,并且容易出错
了解到Helm可以有效解决以上问题, Helm是Kubernetes 的包管理工具,方便用户快速发现、 共享和使用Kubernetes构建的应用。 以下举例演示如何使用Helm实现安装、升级、回滚操作
环境准备
- Docker私有仓库 (https://mydockerregistry.com:5000), 参考:搭建Docker私有仓库
- Helm私有仓库 (https://myhelmrepo.com) 参考:搭建私有 Helm Chart 仓库
- Kubernetes集群 v1.28.x, Helm版本 v3.16.0 参考: kubeadm+keepalived+HAproxy搭建高可用kubernetes集群
- 为了使外部流量能访问集群内的服务,需要安装一个Ingress控制器, 参考: Helm快速上手,使用Helm安装nginx-ingress
创建一个Flask应用
创建一个简单的 Flask 应用,并准备两个版本:
- 1.0版本, 输出 “Hello, foo!”
- 2.0版本, 输出 “Hello, foo v2!”
文件结构
flask-app/
├── app.py
├── requirements.txt
└── Dockerfile
app.py
from flask import Flaskapp = Flask(__name__)@app.route('/', methods=['GET'])
def root():return "hello foo"if __name__ == '__main__':app.run(host='0.0.0.0', port=8000)
requirements.txt
Flask
Dockerfile
FROM rockylinux:9.3RUN dnf install -y python3 python3-pipWORKDIR /appCOPY requirements.txt .
RUN pip install -r requirements.txtCOPY app.py .CMD ["python3", "app.py"]
构建并测试镜像
构建镜像
docker build -t mydockerregistry.com:5000/flask-app:1.0 .
本地运行容器测试
docker run -d -p 8000:8000 mydockerregistry.com:5000/flask-app:1.0
curl localhost:8000/
hello foo
测试OK后, 推送镜像到repo
docker push mydockerregistry.com:5000/flask-app:1.0
配置Kubernetes环境
创建secret存储私有镜像仓库认证信息
为了从私有镜像仓库拉取镜像,我们需要在Kubernetes集群中创建一个Secret,用于存储认证信息。 这一步是必要的,因为Kubernetes默认无法直接访问需要认证的私有镜像仓库
执行以下命令创建Secret
kubectl create secret docker-registry my-registry-secret \--docker-server=mydockerregistry.com:5000 \--docker-username=dockeruser \--docker-password=123456 \--namespace flask-app
说明:该 Secret 将被 Helm Chart 中的 imagePullSecrets 引用,确保 Kubernetes 能够从私有镜像仓库拉取镜像。
配置 Containerd 忽略证书验证(仅限测试环境)
在每个节点上,编辑 /etc/containerd/config.toml 文件,添加以下配置以忽略私有镜像仓库的证书验证
[plugins."io.containerd.grpc.v1.cri".registry][plugins."io.containerd.grpc.v1.cri".registry.configs][plugins."io.containerd.grpc.v1.cri".registry.configs."mydockerregistry.com:5000".tls]insecure_skip_verify = true
重启 containerd 服务以应用更改
systemctl restart containerd
创建Helm Chart
Helm Chart 是 Helm 的核心组件,它允许我们以模板化的方式定义 Kubernetes 资源。下面我们创建一个名为 flask-app-chart 的 Chart。
helm create flask-app-chart
生成的文件结构如下:
flask-app-chart/
├── charts
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── _helpers.tpl
│ ├── hpa.yaml
│ ├── ingress.yaml
│ ├── NOTES.txt
│ ├── serviceaccount.yaml
│ ├── service.yaml
└── values.yaml
修改Chart文件
逐个修改以下文件, 或者直接使用: https://github.com/PCJ600/helm-chart-demo/tree/main/charts/v1.0/flask-app-chart
Chart.yaml
apiVersion: v2
name: flask-app-chart
description: A Helm chart for deploying a simple Flask app
type: application
version: 1.0.0 # Chart 版本
appVersion: "1.0" # 应用版本
values.yaml
# 全局名称覆盖
fullnameOverride: ""
nameOverride: ""# 副本数
replicaCount: 6# 镜像配置
image:repository: "mydockerregistry.com:5000/flask-app"tag: "1.0"pullPolicy: "IfNotPresent"pullSecrets:- my-registry-secret# 资源限制
resources:limits:cpu: "500m"memory: "512Mi"requests:cpu: "250m"memory: "256Mi"# 环境变量
env:ENV_VAR_1: "value1"ENV_VAR_2: "value2"# Ingress 配置
ingress:enabled: truehost: "flask-app.example.com"path: "/foo(/|$)(.*)"pathType: "ImplementationSpecific"# Service 配置
service:port: 8000serviceAccount:create: falsename: ""autoscaling:enabled: false
templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: {{ include "flask-app-chart.fullname" . }}labels:app: {{ include "flask-app-chart.name" . }}chart: {{ .Chart.Name }}release: {{ .Release.Name }}heritage: {{ .Release.Service }}
spec:replicas: {{ .Values.replicaCount | default 1 }}selector:matchLabels:app: {{ include "flask-app-chart.name" . }}template:metadata:labels:app: {{ include "flask-app-chart.name" . }}spec:containers:- name: {{ .Chart.Name }}image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default "latest" }}"imagePullPolicy: {{ .Values.image.pullPolicy | default "IfNotPresent" }}ports:- containerPort: 8000protocol: TCPresources:{{- toYaml .Values.resources | nindent 12 }}env:{{- if .Values.env }}{{- range $key, $value := .Values.env }}- name: {{ $key }}value: {{ $value | quote }}{{- end }}{{- end }}imagePullSecrets:{{- if .Values.image.pullSecrets }}{{- range .Values.image.pullSecrets }}- name: {{ . }}{{- end }}{{- else }}- name: my-registry-secret{{- end }}
注: 配置了imagePullSecrets, 支持从私有仓库拉取镜像
template/service.yaml
apiVersion: v1
kind: Service
metadata:name: {{ include "flask-app-chart.fullname" . }}namespace: {{ .Release.Namespace }}
spec:selector:app: {{ include "flask-app-chart.name" . }}ports:- port: {{ .Values.service.port | default 8000 }}targetPort: {{ .Values.service.port | default 8000 }}type: ClusterIP
template/ingress.yaml
定义ingress模板, 支持集群外部访问
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:name: {{ include "flask-app-chart.fullname" . }}-ingressnamespace: {{ .Release.Namespace }}annotations:nginx.ingress.kubernetes.io/rewrite-target: /$2 # 将 /foo/(.*) 重写为 /$1
spec:ingressClassName: nginx # 指定 IngressClass 名称rules:- host: {{ .Values.ingress.host | quote }}http:paths:- path: {{ .Values.ingress.path | default "/foo(/|$)(.*)" }}pathType: {{ .Values.ingress.pathType | default "ImplementationSpecific" }}backend:service:name: {{ include "flask-app-chart.fullname" . }}port:number: {{ .Values.service.port | default 8000 }}
templates/_helpers.tpl
{{/*
Create a default fully qualified app name.
We truncate at 63 characters because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "flask-app-chart.fullname" -}}
{{- if .Values.fullnameOverride -}}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" -}}
{{- else -}}
{{- printf "%s-%s" .Chart.Name .Release.Name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- end -}}{{/*
Create a default name for the chart.
*/}}
{{- define "flask-app-chart.name" -}}
{{- default .Chart.Name .Values.nameOverride -}}
{{- end -}}
本地测试部署
在正式发布 Chart 到仓库之前,可以先在本地进行测试部署
kubectl create ns flask-app
helm install flask-app ./flask-app-chart --namespace flask-app
验证OK
# curl flask-app.example.com/foo
hello foo
测试完成后,可以卸载Chart, 后面准备发布Chart到仓库
helm -n flask-app uninstall flask-app
发布Chart到仓库
检查Chart的正确性
helm lint flask-app-chart
# helm lint flask-app-chart/
==> Linting flask-app-chart/
[INFO] Chart.yaml: icon is recommended
打包Chart
# helm package flask-app-chart
Successfully packaged chart and saved it to: /path/to/flask-app-chart-1.0.0.tgz
上传 Chart 到私有 Helm 仓库
curl -u "helmuser:123456" --data-binary "@flask-app-chart-1.0.0.tgz" https://myhelmrepo.com/api/charts -k
如果需要删除旧版本的 Chart,使用以下命令
curl -X DELETE "https://myhelmrepo.com/api/charts/flask-app-chart/0.1.0" -u "helmuser:123456"
通过Helm Repo安装Chart
添加私有 Helm 仓库
helm repo add my-private-repo https://myhelmrepo.com \--ca-file ~/.helm/certs/myhelmrepo.com.crt \--username helmuser \--password 123456
更新仓库缓存并查看可用的 Charts
helm repo update
helm search repo -l flask
NAME CHART VERSION APP VERSION DESCRIPTION
my-private-repo/flask-app-chart 1.0.0 1.0 A Helm chart for deploying a simple Flask app
安装Chart到指定命名空间flask-app
helm install flask-app my-private-repo/flask-app-chart --namespace flask-app --version 1.0.0
验证安装是否成功
# curl flask-app.example.com/foo
hello foo
再发布2.0版本的Chart, 用于测试升级和回滚功能
改下app.py, 返回’hello foo v2’
from flask import Flaskapp = Flask(__name__)@app.route('/', methods=['GET'])
def root():return "hello foo v2"if __name__ == '__main__':app.run(host='0.0.0.0', port=8000)
构建并推送新版本镜像
docker build -t mydockerregistry.com:5000/flask-app:2.0 .
docker push mydockerregistry.com:5000/flask-app:2.0
更新Chart配置, 修改Chart.yaml和values.yaml
Chart.yaml
更新版本号为2.0.0, 并设置appVersion为2.0
# cat Chart.yaml
apiVersion: v2
name: flask-app-chart
description: A Helm chart for deploying a simple Flask app
type: application
version: 2.0.0
appVersion: "2.0"
改下values.yaml, 将镜像版本从1.0更新为2.0
image:repository: "mydockerregistry.com:5000/flask-app"tag: "2.0"
打包并上传新的Chart
helm package flask-app-chart
curl -u "helmuser:123456" --data-binary "@flask-app-chart-2.0.0.tgz" https://myhelmrepo.com/api/charts -k
使用Helm升级到新版本
使用helm upgrade
将应用从1.0版本升级到2.0版本
helm upgrade flask-app my-private-repo/flask-app-chart --version 2.0.0 --namespace flask-app --atomic
注: Helm支持通过–atomic参数实现原子性操作。如果升级失败,Helm会自动回滚到之前的版本
验证升级是否成功
# curl flask-app.example.com/foo
hello foo v2
watch观察升级过程, 可以看出是滚动更新方式
watch "kubectl get pods -n flask-app"
NAMESPACE NAME READY STATUS RESTARTS AGE
flask-app flask-app-chart-flask-app-5c86b6ffdf-4jlqb 1/1 Running 0 31s
flask-app flask-app-chart-flask-app-5c86b6ffdf-kkw57 1/1 Running 0 30s
flask-app flask-app-chart-flask-app-5c86b6ffdf-qlnhv 1/1 Running 0 30s
flask-app flask-app-chart-flask-app-5c86b6ffdf-s9tr5 1/1 Running 0 31s
flask-app flask-app-chart-flask-app-5c86b6ffdf-w6776 1/1 Running 0 30s
flask-app flask-app-chart-flask-app-5c86b6ffdf-xwgtp 1/1 Running 0 31s
flask-app flask-app-chart-flask-app-5d44b77c54-72mhg 0/1 Terminating 0 3m17s
flask-app flask-app-chart-flask-app-5d44b77c54-gvgv7 0/1 Terminating 0 3m17s
flask-app flask-app-chart-flask-app-5d44b77c54-mrj5h 0/1 Terminating 0 3m17s
flask-app flask-app-chart-flask-app-5d44b77c54-r2bdp 1/1 Terminating 0 3m17s
flask-app flask-app-chart-flask-app-5d44b77c54-w7v67 1/1 Terminating 0 3m17s
使用Helm回滚到旧版本
查看历史记录
helm history flask-app -n flask-app
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Sun Mar 23 19:15:11 2025 superseded flask-app-chart-1.0.0 1.0 Install complete
2 Sun Mar 23 19:17:57 2025 deployed flask-app-chart-2.0.0 2.0 Upgrade complete
- REVISION 1: 最初安装的1.0的版本
- REVISION 2: 升级到2.0的版本
执行回滚命令, 回滚到1.0版本
helm rollback flask-app 1 -n flask-app
Rollback was a success! Happy Helming!
验证回滚成功
# helm list -n flask-app
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
flask-app flask-app 3 2025-03-23 19:20:54.762690061 +0800 CST deployed flask-app-chart-1.0.0 1.0
# curl flask-app.example.com/foo
hello foo
总结
Helm vs 传统方式的对比
特性 | 传统方式 | Helm |
---|---|---|
版本管理 | 手动维护多个 YAML 文件,容易混乱。 | 版本化管理,清晰记录每个版本的变化。 |
升级操作 | 需要手动删除旧版本并应用新版本,可能导致服务中断。 | 智能化更新,仅更改必要的部分,避免服务中断。 |
回滚操作 | 需要手动恢复旧版本的 YAML 文件,操作复杂且容易出错。 | 一键回滚到任意历史版本,简单高效。 |
差异追踪 | 难以知道两个版本之间的具体差异,容易遗漏更改。 | Helm 自动计算差异,确保所有更改都被正确应用。 |
配置灵活性 | 需要手动编辑多个 YAML 文件,难以适应不同环境(如 dev、staging、prod)。 | 支持参数化配置,通过 values.yaml 动态调整,适应不同环境需求。 |
依赖管理 | 需要手动管理依赖关系,容易遗漏或冲突。 | 自动管理依赖关系,确保所有组件协同工作。 |
参考
https://helm.sh/docs/topics/charts/
相关文章:
使用Helm安装、 升级、 回滚Kubernetes应用
前言 在我之前做的项目里,我们对Microk8s微服务的更新是通过自制tar包的方式做的, tar包存储了镜像和YAML文件。 每次升级时,我们需要先删除所有的YAML资源,然后重新创建新的资源。 这种方式存在以下问题: 服务中断:…...
Text-to-SQL将自然语言转换为数据库查询语句
有关Text-To-SQL方法,可以查阅我的另一篇文章,Text-to-SQL方法研究 直接与数据库对话-text2sql Text2sql就是把文本转换为sql语言,这段时间公司有这方面的需求,调研了一下市面上text2sql的方法,比如阿里的Chat2DB,麻…...
gin学习
gin学习笔记,不仅包含了基本的增删查改外,还包括参数传递,上传下载,模版、session与中间件等,方便收藏自习可用 文章目录 获得个请求get打印字符串get请求xmlget请求跳转http方法路由可以通过Context的Param方法来获取…...
【HarmonyOS NEXT】关键资产存储开发案例
在 iOS 开发中 Keychain 是一个非常安全的存储系统,用于保存敏感信息,如密码、证书、密钥等。与文件系统不同,Keychain 提供了更高的安全性,因为它对数据进行了加密,并且只有经过授权的应用程序才能访问存储的数据。那…...
高德终端技术总结:高可用架构如何练成?
前言 高德地图作为国民级应用,特别是出行场景的独特性,要确保在线导航高并发和交通安全级的超稳定性,这对技术团队提出异乎寻常的高要求,无论是终端、云端,还是“终端-云端”之间的连接,都必须实现“高可用…...
STM32八股【3】------RAM和片上FLASH
1、RAM和FLASH构成 1.RAM ┌──────────────────────────┐ │ 栈区 (Stack) │ ← 从RAM顶端向下扩展(存储局部变量、函数调用信息) │--------------------------│ │ 堆区 (Heap) │ ← …...
Apache Doris
Apache Doris介绍 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库,以极速易用的特点被人们所熟知,仅需亚秒级响应时间即可返回海量数据下的查询结果,不仅可以支持高并发的点查询场景,也能支持高吞吐的复杂分析场…...
Debezium介绍
1.什么是Debezium Debezium 是一个开源的分布式平台,用于捕获数据库的变更事件(CDC,Change Data Capture)。它能够实时捕获数据库中的行级更改,并将这些更改作为事件流发送到消息中间件(如 Apache Kafka&a…...
奇迹科技:蓝牙网关赋能少儿篮球教育的创新融合案例研究
一、引言 本文研究了福建奇迹运动体育科技有限公司(简称‘奇迹科技’)如何利用其创新产品体系和桂花网蓝牙网关M1500,与少儿篮球教育实现深度融合。重点分析其在提升教学效果、保障训练安全、优化个性化教学等方面的实践与成效,为…...
Python散点图(Scatter Plot):高阶分析、散点图矩阵、三维散点图及综合应用
散点图:数据分析的利器 在数据分析领域,散点图是一种直观且强大的可视化工具,广泛应用于揭示变量间的相关性以及识别数据集中的异常值。本文将深入探讨散点图的这两种关键功能,并结合实际案例与Python代码示例,带您全面了解散点图的应用。 一、散点图如何展示变量间的相…...
计算机网络层超全解析:从IP协议到路由算法
🌐 (专业详解生活化类比,逻辑一镜到底) 📖 网络层的核心使命 核心任务:在不同网络间为数据包选择最佳路径,实现端到端通信。 类比:快递公司总部(网络层)根据…...
RoboVQA
RoboVQA:面向机器人技术的多模态长时推理 摘要 我们提出了一种可扩展、自下而上且具有内在多样性的数据收集方案,适用于中长时高级推理任务,其吞吐量比传统的自上而下分步收集方法高2.2倍。通过在3栋办公楼内使用多种实体(机器人、人类、使用抓取工具的人类)执行任意用…...
javascript语法入门
一、变量声明 在JavaScript中,可以使用var、let和const来声明变量。 javascript var name "张三"; let age 20; 二、数据类型 JavaScript中有7种基本数据类型:undefined、null、boolean、string、symbol、number,以及object。…...
前端字段名和后端不一致?解锁 JSON 映射的“隐藏规则” !!!
🚀 前端字段名和后端不一致?解锁 JSON 映射的“隐藏规则” 🌟 嘿,技术冒险家们!👋 今天我们要聊一个开发中常见的“坑”:前端传来的 JSON 参数字段名和后端对象字段名不一致,会发生…...
Java——ArrayList集合
ArrayList:基于动态数组实现,支持随机访问,适合频繁的随机访问操作,但在插入和删除元素时性能较差。 技术层面介绍 所属类库:ArrayList 位于 java.util 包中,它实现了 List 接口,因此具备 Lis…...
基于python+django的图书借阅网站-图书借阅管理系统源码+运行步骤
该系统是基于pythondjango开发的在线图书借阅管理系统。系统适合场景:大学生、课程作业、系统设计、毕业设计。 演示地址 前台地址: http://book.gitapp.cn 后台地址:http://book.gitapp.cn/#/admin 后台管理帐号: 用户名&…...
Flutter运行错误:UG! exception in phase ‘semantic analysis‘
最近在Mac Mini M4上通过Android Studio导入Flutter项目并运行,结果一直跑不起来,错误日志如下: 执行命令查看版本信息: flutter doctor --verbose通过输出信息Java version OpenJDK Runtime Environment (build 21.0.41242208…...
Python-docx库详解:轻松实现Word文档自动化生成与图片尺寸控制
Python-docx库详解:轻松实现Word文档自动化生成与图片尺寸控制 在现代办公自动化的浪潮中,文档处理是一项不可或缺的任务。Python作为一种强大的编程语言,提供了丰富的库来简化这些任务。其中,python-docx库是处理Word文档的有力…...
【NLP 42、实践 ⑪ 用Bert模型结构实现自回归语言模型的训练】
目录 数据文件 一、模型定义 1.模型初始化 代码运行流程 2.前向传播,计算损失 ⭐ 代码运行流程 二、加载语料 代码运行流程 三、 随机生成样本 代码运行流程 四、建立模型 五、采样策略选择 代码运行流程 六、模型效果测试 代码运行流程 七、模型训练 代码运行流程 …...
HTTPS
目录 一 HTTPS是什么 二 加密 三 加密方案 四 CA机构/证书 五 最终方案(对称密钥/非对称密钥/CA证书)和总体流程 一 HTTPS是什么 在应用层存在SSL,TLS(HTTP之下,传输层之上)加密/解密安全协议,如果HTTP经过这个协议,对端也走…...
electron框架(4.0)electron-builde和electron Forge的打包方式
----使用electron-builder打包(需要魔法) --安装electron-builder: npm install electron-builder -D--package.json中进行相关配置: {"name": "video-tools","version": "1.0.0","main&quo…...
SaaS系统的销售微服务与权限微服务边界设计
在设计SaaS系统的销售微服务与权限微服务的边界时,需要结合领域驱动设计(DDD)和微服务拆分原则,确保高内聚、低耦合。以下是结合微服务架构原则、多租户SaaS需求及权限管理场景的完整设计方案,整合了权限服务与销售服务…...
Unity-AI-Deepseek生成的生成模型代码
结果 能用,不是很理想,从左到右,分别是body,眼睛,演睫毛,手指套(如果你知道这是什么)结果不是很理想 (下面代码已包含,修复的切线只能传Vector3参数,Unity2022测试) 你们帮我看看…...
Django REST Framework 请求封装源码解析与实现流程
版本说明: Django: V4.2.20 Django Rest Framework: V3.15.2 一、核心封装流程示意图 #mermaid-svg-qXJLIa9Bx1TCiPSN {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-qXJLIa9Bx1TCiPSN .error-icon{fill…...
简介PyCDE:Python CIRCT Design Entry
简介PyCDE:Python CIRCT Design Entry 引言 在硬件设计和验证领域,随着设计复杂性的增加,传统的方法往往难以满足现代设计的需求。PyCDE(Python CIRCT Design Entry)作为CIRCT项目的一部分,旨在为硬件设计…...
Python实现deepseek接口的调用
简介:DeepSeek 是一个强大的大语言模型,提供 API 接口供开发者调用。在 Python 中,可以使用 requests 或 httpx 库向 DeepSeek API 发送请求,实现文本生成、代码补全,知识问答等功能。本文将介绍如何在 Python 中调用 …...
考研课程安排(自用)
文章目录 408数据结构(王道)计算机组成原理(王道)操作系统(王道)计算机网络(湖科大版) 数学一高等数学(微积分)线性代数和概率论 408 数据结构(王…...
Mybatis操作数据库(注解+xml两个方式)
文章目录 1.个人回顾2.关于mybatis注解的说明3.字段和属性不匹配的解决方案3.1第一个方案3.2第二个方案3.3第三个方案 4.xml路径配置5.xml里面的字段映射 1.个人回顾 刚刚翻看了一下自己的这个之前写的博客,上一次和这个javaee相关的博客还是去年写的,也…...
文心快码 使用体验与介绍
一、文心快码的核心作用 文心快码是百度基于文心大模型开发的智能代码助手,核心价值包括: 代码生成与补全 通用开发:根据注释生成HTML/CSS/JS、Python、Java等代码C专项:生成类定义、STL容器操作、智能指针代码(如st…...
区块链交易
文章目录 交易准备合约和代码逻辑合约compile.jsindex.js 运行 交易 项目来自https://github.com/Dapp-Learning-DAO/Dapp-Learning/blob/main/basic/02-web3js-transaction/README-cn.md 本项目包含对交易进行签名,发送,接收交易回执,验证…...
LeetCode 160 Intersection Of Two Linked Lists 相交链表 Java
题目:找到两个相交列表的起始点,如图c1开始为A和B两个链表的相交点 举例1:8为两个链表的相交点。 注意:相交不止是数值上的相同。 举例2:2为相交点 举例3:没有相交点 解题思路: 相交证明最后一…...
体育直播模板nba英超直播欧洲杯直播模板手机自适应
源码名称:体育直播模板nba英超直播欧洲杯直播模板手机自适应帝国cms 7.5模板 开发环境:帝国cms7.5 空间支持:phpmysql 带软件采集,可以挂着自动采集发布,无需人工操作! 模板特点: 程序伪静态…...
Android Compose 图标按钮深度剖析:从源码到实践(五)
Android Compose 图标按钮深度剖析:从源码到实践 一、引言 在现代 Android 应用开发中,用户界面的交互性和美观性至关重要。图标按钮作为一种常见的 UI 元素,以其简洁直观的特点,在提升用户体验方面发挥着重要作用。Android Com…...
【Dive Into Stable Diffusion v3.5】2:Stable Diffusion v3.5原理介绍
【Dive Into Stable Diffusion v3.5】系列博文: 第1篇:开源项目正式发布——深入探索SDv3.5模型全参/LoRA/RLHF训练第2篇:Stable Diffusion v3.5原理介绍 目录 1 前言1.1 扩散模型的原理1.2 损失函数1.3 加噪流程1.4 推理流程1.5 negative pr…...
WPF 布局舍入(WPF 边框模糊 或 像素错位 的问题)
1. 什么是 WPF 布局舍入? 在 WPF 开发过程中,可能会遇到界面模糊、边框错位、文本渲染不清晰等问题。这些现象通常是由于 WPF 采用 设备无关像素(DIP, Device Independent Pixels),在不同 DPI 设置下,UI 元…...
前端-选中pdf中的文字并使用,显示一个悬浮的翻译按钮(本地pdfjs+iframe)不适用textlayer
使用pdfjs移步– vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件) 方案1:获取选择文本内容的最前面的字符坐标的位置(这种写法会导致如果选择超出…...
Mongodb分片模式部署
MongoDB 分片集群部署教程 1. 概述 MongoDB 分片是一种用于处理大规模数据集的集群技术。通过分片,MongoDB 可以将数据分布在多个服务器上,从而提高存储容量和读写性能。本教程将详细介绍如何从零开始部署 MongoDB 分片集群。 介绍 分片集群中主要由三…...
「一起学后端」Nest.js + MySQL 查询方法教学文档
Nest.js MySQL 查询方法教学文档 文章目录 Nest.js MySQL 查询方法教学文档1. 基础 CRUD 操作1.1 创建记录1.2 查询记录1.3 更新记录1.4 删除记录 2. 复杂查询2.1 分页与排序2.2 关联查询(JOIN)2.3 聚合查询2.4 子查询 3. 高级操作3.1 事务处理3.2 Typ…...
基于Spring Boot的企业内管信息化系统的设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
【学习笔记】LLM推理与部署
文章目录 1 [LLMs inference] quantization 量化整体介绍(bitsandbytes、GPTQ、GGUF、AWQ)2 [LLMs inference] quantization 量化整体介绍(bitsandbytes、GPTQ、GGUF、AWQ)3 [LLMs serving] openrouter & vllm host LLM 推理服…...
leetcode-134.加油站
油箱容积无限,要求能环岛,说明总共加起来的油是不少于消耗量的,这是唯一一个决定能否环岛的变量,只要油量够,那么必定有一段路是攒油的路,它供给后续的消耗,使得油箱总是不空。 如果油量足够&am…...
companion object和object 从kotlin转java分析
说明 companion object 中 companion类中的方法是普通的方法 在外部类中生成静态变量,静态companion 对象 object MyClass2 中 类中方法是普通方法 在MyClass2中生成静态变量,静态MyClass2对象, 一 companion object 使用 kotlin转java pa…...
检索增强生成(2)本地PDF 本地嵌入模型
from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader PyPDFLoader(file_path)try:do…...
关于TVS管漏电流的问题?
问题描述: 在量产的带电池故事机生产中,工厂产线测试电流时,有1台机器电流比正常机器大10mA左右。 原因分析: 1、分析电路原理图,去除可能出现问题的电压或器件(不影响系统),发现…...
2025前端面试题记录
vue项目目录的执行顺序是怎么样的? 1、package.json 在执行npm run dev时,会在当前目录寻找package.json文件,此文件包含了项目的名称版本、项目依赖等相关信息。 2、webpack.config.js(会被vue-cli脚手架隐藏) 3、vue.config.js 对…...
Linux系统docker部署Ollama本地大模型及部署Hugging Face开源模型,ollama相关注意点,非ollama模型创建,模型量化,显存建议
本文主要描述在Linux系统使用docker部署ollama自有模型以及Hugging Face开源模型,也涉及到一些相关注意点,欢迎沟通讨论~ 拉取镜像 拉取ollama最新镜像:docker pull ollama/ollama:latest 运行ollama 执行:docker run -d --res…...
.NET 9 彻底改变了 API 文档:从 Swashbuckle(Swagger) 到 Scalar
示例代码下载:https://download.csdn.net/download/hefeng_aspnet/90404652 摘要 API 文档是现代软件开发的支柱。随着 .NET 9 从 Swashbuckle 转向 Microsoft.AspNetCore.OpenApi,开发人员需要新的策略来保持高效。本文探讨了这些变化,并介…...
C++——权限初识
权限初识 C中的访问权限主要分为三种: public 、 private 和 protected 。这些权限决定了类成员(包括数据成员和成员函数)的可访问性。以下是一个总结表格,说明了在不同情况下这些权限如何应用: 使用权限(…...
如何让自动驾驶汽车“看清”世界?坐标映射与数据融合概述
在自动驾驶领域,多传感器融合技术是实现车辆环境感知和决策控制的关键。其中,坐标系映射和对应是多传感器融合的重要环节,它涉及到不同传感器数据在统一坐标系下的转换和匹配,以实现对车辆周围环境的准确感知。本文将介绍多传感器融合中坐标系映射和对应的数学基础和实际应…...
如何在 Linux 系统中部署 FTP 服务器:从基础配置到安全优化
一、为什么选择 Linux 部署 FTP 服务器? FTP(文件传输协议)作为互联网最早的文件传输标准,至今仍在企业内部文件共享、镜像站点同步等场景中广泛应用。Linux 系统凭借其稳定性、开源特性及丰富的工具链,成为搭建 FTP 服…...