当前位置: 首页 > article >正文

k8s教程3:Kubernetes应用的部署和管理

学习目标
  • 理解Kubernetes中应用部署的基本概念和方法
  • 掌握Deployment、ReplicaSet、StatefulSet、DaemonSet、Job与CronJob等控制器的使用
  • 了解Helm作为Kubernetes的包管理工具的基本使用
  • 通过实际示例学习应用的部署、更新与管理

Kubernetes提供了一套强大而灵活的机制,用于部署、管理和扩展容器化应用。通过不同类型的控制器(Controllers),Kubernetes能够自动化处理应用的生命周期,确保应用的高可用性和可扩展性。本篇文章将深入探讨Kubernetes中应用部署与管理的核心概念和实践方法,包括各种控制器的使用、配置管理工具Helm的介绍,以及实际的部署示例,帮助读者全面掌握Kubernetes应用管理的关键技能。

1. 应用部署概述

在Kubernetes中,**部署(Deployment)**是管理应用生命周期的核心资源对象。通过Deployment,用户可以声明应用的期望状态,如Pod的数量、使用的镜像版本等,Kubernetes会自动确保实际状态与期望状态一致。Deployment提供了滚动更新、回滚、扩展和暂停等功能,极大地简化了应用的管理。

关键概念:

  • 声明式管理:用户声明期望状态,Kubernetes负责实现和维护。
  • 自动化控制:自动处理Pod的创建、更新和删除,确保应用的高可用性。
  • 版本管理:支持应用版本的快速切换和回滚。

2. Deployment

Deployment是用于管理无状态应用的控制器,负责确保指定数量的Pod副本在任何时候都在运行。它支持滚动更新和回滚功能,使应用的版本管理更加便捷和安全。

主要功能:

  • 滚动更新:逐步替换旧版本的Pod,确保服务不中断。
  • 回滚:在更新失败时,快速恢复到之前的稳定版本。
  • 扩展与缩减:根据需求动态调整Pod的副本数量。

示例:创建一个简单的Deployment

创建deployment.yaml文件:

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80

应用配置:

kubectl apply -f deployment.yaml

3. ReplicaSet

ReplicaSet用于确保在任何时间点都有指定数量的Pod副本在运行。虽然Deployment实际上使用ReplicaSet来管理Pod副本,但理解ReplicaSet的工作原理对于深入掌握Kubernetes应用管理至关重要。

主要功能:

  • Pod副本管理:确保Pod的数量与ReplicaSet的副本数一致。
  • 标签选择器:通过标签匹配Pod,进行管理和调度。

示例:查看ReplicaSet

kubectl get replicasets

4. StatefulSet

StatefulSet用于管理有状态应用,提供稳定的网络标识符、持久化存储和有序的部署与更新。适用于数据库、分布式存储系统等需要保持状态的应用。

主要功能:

  • 稳定的Pod名称:每个Pod都有一个唯一且稳定的名称。
  • 有序部署与更新:按照顺序创建、删除或更新Pod。
  • 持久化存储:每个Pod可以绑定到特定的PersistentVolume,确保数据持久性。

示例:创建一个StatefulSet

创建statefulset.yaml文件:

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: "mysql"replicas: 3selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7ports:- containerPort: 3306env:- name: MYSQL_ROOT_PASSWORDvalue: "my-secret-pw"volumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: mysql-persistent-storagespec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi

应用配置:

kubectl apply -f statefulset.yaml

5. DaemonSet

DaemonSet确保在集群中的每个节点上运行一个Pod实例,常用于运行集群级别的服务,如日志收集、监控代理等。

主要功能:

  • 节点级服务部署:在每个节点上自动创建Pod。
  • 自动扩展:新添加的节点会自动部署DaemonSet的Pod。

示例:创建一个DaemonSet

创建daemonset.yaml文件:

apiVersion: apps/v1
kind: DaemonSet
metadata:name: fluentdlabels:app: fluentd
spec:selector:matchLabels:app: fluentdtemplate:metadata:labels:app: fluentdspec:containers:- name: fluentdimage: fluent/fluentd:v1.11ports:- containerPort: 24224

应用配置:

kubectl apply -f daemonset.yaml

6. Job与CronJob

JobCronJob用于管理批处理任务。Job负责一次性任务的执行,确保任务完成;CronJob则基于时间计划定期执行任务。

主要功能:

  • Job

    • 一次性任务:执行特定的批处理任务,如数据库迁移、数据备份等。
    • 重试机制:在任务失败时自动重试。
  • CronJob

    • 定时任务:按照预定的时间表定期执行任务。
    • 灵活的时间表达式:支持类似Linux cron的时间调度格式。

示例:创建一个Job

创建job.yaml文件:

apiVersion: batch/v1
kind: Job
metadata:name: pi
spec:template:spec:containers:- name: piimage: perlcommand: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]restartPolicy: NeverbackoffLimit: 4

应用配置:

kubectl apply -f job.yaml

示例:创建一个CronJob

创建cronjob.yaml文件:

apiVersion: batch/v1
kind: CronJob
metadata:name: hello
spec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:- name: helloimage: busyboxargs:- /bin/sh- -c- echo Hello Kubernetes! && sleep 30restartPolicy: OnFailure

应用配置:

kubectl apply -f cronjob.yaml

7. Helm介绍与使用

Helm是Kubernetes的包管理工具,类似于Linux的apt或yum。通过Helm,用户可以更轻松地打包、配置和部署Kubernetes应用。

主要功能:

  • Chart:Helm的包格式,包含应用的所有Kubernetes资源定义。
  • 版本管理:支持应用的版本控制和回滚。
  • 模板化配置:使用模板和变量,实现配置的灵活性和可重用性。

安装Helm

  1. 下载Helm
    • 访问Helm官网下载适用于操作系统的Helm二进制文件。
  2. 安装Helm
    • 解压下载的文件并将helm可执行文件移动到系统路径中,例如:
      tar -zxvf helm-v3.10.0-linux-amd64.tar.gz
      sudo mv linux-amd64/helm /usr/local/bin/helm
      
  3. 验证安装
    helm version
    

使用Helm部署应用

  1. 添加Helm仓库
    helm repo add stable https://charts.helm.sh/stable
    helm repo update
    
  2. 安装一个Chart
    helm install my-nginx stable/nginx-ingress
    
  3. 查看已安装的Chart
    helm list
    
  4. 升级Chart
    helm upgrade my-nginx stable/nginx-ingress --set controller.replicaCount=3
    
  5. 回滚Chart
    helm rollback my-nginx 1
    
  6. 卸载Chart
    helm uninstall my-nginx
    

8. 配置和管理应用

除了基本的部署,Kubernetes还提供了丰富的配置和管理工具,确保应用能够灵活适应不同的环境和需求。

配置管理工具:

  • ConfigMap:用于存储非敏感的配置信息,如配置文件和环境变量。
  • Secret:用于存储敏感数据,如密码、令牌和证书,支持加密存储。

示例:使用ConfigMap

创建configmap.yaml文件:

apiVersion: v1
kind: ConfigMap
metadata:name: app-config
data:APP_ENV: productionLOG_LEVEL: info

应用配置:

kubectl apply -f configmap.yaml

在Pod中使用ConfigMap:

apiVersion: v1
kind: Pod
metadata:name: config-pod
spec:containers:- name: appimage: my-app-imageenvFrom:- configMapRef:name: app-config

示例:使用Secret

创建secret.yaml文件:

apiVersion: v1
kind: Secret
metadata:name: db-secret
type: Opaque
data:username: YWRtaW4=  # base64编码后的"admin"password: MWYyZDFlMmU2N2Rm  # base64编码后的"1f2d1e2e67df"

应用配置:

kubectl apply -f secret.yaml

在Pod中使用Secret作为环境变量:

apiVersion: v1
kind: Pod
metadata:name: secret-pod
spec:containers:- name: appimage: my-app-imageenv:- name: DB_USERNAMEvalueFrom:secretKeyRef:name: db-secretkey: username- name: DB_PASSWORDvalueFrom:secretKeyRef:name: db-secretkey: password

9. 实际示例与操作步骤

通过一个完整的示例,展示如何在Kubernetes中部署和管理一个实际应用,包括使用Deployment、Service、ConfigMap和Secret等资源。

示例背景

假设我们需要部署一个简单的Web应用,该应用连接到一个MySQL数据库。应用需要读取配置信息,并通过环境变量传递数据库凭证。我们将使用Deployment管理Web应用,StatefulSet管理MySQL数据库,并使用Service进行网络暴露。

步骤 1:部署MySQL数据库
  1. 创建StorageClass(如果需要动态存储)

    创建storageclass.yaml

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:name: standard
    provisioner: kubernetes.io/aws-ebs  # 根据实际环境选择
    parameters:type: gp2fsType: ext4
    reclaimPolicy: Delete
    

    应用配置:

    kubectl apply -f storageclass.yaml
    
  2. 创建Secret用于数据库凭证

    创建mysql-secret.yaml

    apiVersion: v1
    kind: Secret
    metadata:name: mysql-secret
    type: Opaque
    data:username: YWRtaW4=  # base64编码后的"admin"password: cGFzc3dvcmQ=  # base64编码后的"password"
    

    应用配置:

    kubectl apply -f mysql-secret.yaml
    
  3. 创建StatefulSet部署MySQL

    创建mysql-statefulset.yaml

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:name: mysql
    spec:serviceName: "mysql"replicas: 1selector:matchLabels:app: mysqltemplate:metadata:labels:app: mysqlspec:containers:- name: mysqlimage: mysql:5.7env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: passwordports:- containerPort: 3306volumeMounts:- name: mysql-persistent-storagemountPath: /var/lib/mysqlvolumeClaimTemplates:- metadata:name: mysql-persistent-storagespec:accessModes: [ "ReadWriteOnce" ]resources:requests:storage: 1Gi
    

    应用配置:

    kubectl apply -f mysql-statefulset.yaml
    
  4. 创建Service暴露MySQL

    创建mysql-service.yaml

    apiVersion: v1
    kind: Service
    metadata:name: mysql
    spec:ports:- port: 3306clusterIP: Noneselector:app: mysql
    

    应用配置:

    kubectl apply -f mysql-service.yaml
    
步骤 2:部署Web应用
  1. 创建ConfigMap用于应用配置

    创建web-configmap.yaml

    apiVersion: v1
    kind: ConfigMap
    metadata:name: web-config
    data:APP_ENV: productionLOG_LEVEL: info
    

    应用配置:

    kubectl apply -f web-configmap.yaml
    
  2. 创建Deployment部署Web应用

    创建web-deployment.yaml

    apiVersion: apps/v1
    kind: Deployment
    metadata:name: web-app
    spec:replicas: 2selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: webimage: my-web-app-image:latest  # 替换为实际镜像ports:- containerPort: 80envFrom:- configMapRef:name: web-configenv:- name: DB_USERNAMEvalueFrom:secretKeyRef:name: mysql-secretkey: username- name: DB_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: password
    

    应用配置:

    kubectl apply -f web-deployment.yaml
    
  3. 创建Service暴露Web应用

    创建web-service.yaml

    apiVersion: v1
    kind: Service
    metadata:name: web-service
    spec:type: NodePortports:- port: 80targetPort: 80nodePort: 30080selector:app: web
    

    应用配置:

    kubectl apply -f web-service.yaml
    
  4. 访问Web应用

    在浏览器中输入http://<Cluster_IP>:30080,即可访问部署的Web应用。

步骤 3:更新应用
  1. 修改Deployment配置

    更新web-deployment.yaml中的镜像版本,例如将my-web-app-image:latest更新为my-web-app-image:v2.0

  2. 应用更新配置

    kubectl apply -f web-deployment.yaml
    
  3. 观察滚动更新过程

    kubectl rollout status deployment/web-app
    
  4. 验证应用版本

    访问Web应用,确保应用已更新到新版本。

10. 高级配置与最佳实践

为了确保Kubernetes应用的高效运行和管理,以下是一些高级配置和最佳实践:

10.1 使用健康检查

配置Readiness ProbeLiveness Probe,确保应用的健康状态。

示例:配置Readiness和Liveness Probe

apiVersion: apps/v1
kind: Deployment
metadata:name: web-app
spec:replicas: 2selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: webimage: my-web-app-image:latestports:- containerPort: 80readinessProbe:httpGet:path: /healthzport: 80initialDelaySeconds: 5periodSeconds: 10livenessProbe:httpGet:path: /healthzport: 80initialDelaySeconds: 15periodSeconds: 20
10.2 使用滚动更新策略

通过配置滚动更新策略,控制应用更新的方式和速度。

示例:配置滚动更新策略

apiVersion: apps/v1
kind: Deployment
metadata:name: web-app
spec:replicas: 3strategy:type: RollingUpdaterollingUpdate:maxUnavailable: 1maxSurge: 1selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: webimage: my-web-app-image:latestports:- containerPort: 80
10.3 资源限制与配额

为容器配置资源限制,防止资源滥用。

示例:配置资源限制

apiVersion: apps/v1
kind: Deployment
metadata:name: web-app
spec:replicas: 2selector:matchLabels:app: webtemplate:metadata:labels:app: webspec:containers:- name: webimage: my-web-app-image:latestports:- containerPort: 80resources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"

配置资源配额

创建resource-quota.yaml

apiVersion: v1
kind: ResourceQuota
metadata:name: web-quota
spec:hard:pods: "10"requests.cpu: "2"requests.memory: "1Gi"limits.cpu: "4"limits.memory: "2Gi"

应用配置:

kubectl apply -f resource-quota.yaml
10.4 使用标签和选择器

通过合理使用标签和选择器,实现资源的高效管理和组织。

示例:使用标签选择器

apiVersion: apps/v1
kind: Deployment
metadata:name: web-applabels:tier: frontend
spec:replicas: 2selector:matchLabels:tier: frontendtemplate:metadata:labels:tier: frontendspec:containers:- name: webimage: my-web-app-image:latestports:- containerPort: 80

11. 故障排除与常见问题

在Kubernetes应用的部署和管理过程中,可能会遇到各种问题。以下是一些常见问题及其解决方法:

11.1 Pod无法启动

原因

  • 镜像拉取失败
  • 配置错误
  • 资源不足

解决方法

  1. 查看Pod状态:
    kubectl get pods
    
  2. 查看详细信息:
    kubectl describe pod <pod-name>
    
  3. 查看容器日志:
    kubectl logs <pod-name>
    
11.2 Service无法访问

原因

  • Service配置错误
  • 后端Pod未就绪
  • 网络策略限制

解决方法

  1. 检查Service配置:
    kubectl get svc
    kubectl describe svc <service-name>
    
  2. 检查后端Pod状态:
    kubectl get pods -l app=<app-label>
    
  3. 检查网络策略:
    kubectl get networkpolicy
    
11.3 应用更新失败

原因

  • 新版本镜像有问题
  • 配置错误
  • 资源限制

解决方法

  1. 查看Deployment状态:
    kubectl rollout status deployment/<deployment-name>
    
  2. 回滚到之前的版本:
    kubectl rollout undo deployment/<deployment-name>
    
  3. 检查新版本Pod的详细信息和日志。

12. 总结

Kubernetes提供了一套完善的机制,用于部署、管理和扩展容器化应用。通过掌握Deployment、ReplicaSet、StatefulSet、DaemonSet、Job与CronJob等控制器的使用,结合配置管理工具Helm,运维人员能够高效地管理应用的生命周期,确保应用的高可用性和可扩展性。此外,理解和应用最佳实践,如健康检查、资源限制和标签选择器,有助于构建稳定和可靠的Kubernetes应用环境。

通过本篇文章的学习,你已经掌握了Kubernetes中应用部署与管理的核心概念和实际操作步骤。接下来,你可以继续学习第四篇:Kubernetes服务发现与负载均衡,深入了解Kubernetes中的网络管理和流量控制。如果你有任何问题或需要进一步的指导,请随时与我联系!

13. 资源链接

  • Kubernetes官方文档 - Deployments
  • Kubernetes官方文档 - ReplicaSets
  • Kubernetes官方文档 - StatefulSets
  • Kubernetes官方文档 - DaemonSets
  • Kubernetes官方文档 - Jobs
  • Kubernetes官方文档 - CronJobs
  • Helm官方文档
  • Kubernetes官方文档 - ConfigMaps
  • Kubernetes官方文档 - Secrets
  • Kubernetes最佳实践指南

通过本篇文章,你已经深入了解了Kubernetes中应用的部署和管理方法,掌握了各种控制器的使用技巧,学会了如何使用Helm进行应用的打包和部署,并通过实际示例加深了理解。应用这些知识,你可以更加高效地管理Kubernetes集群中的应用,确保其稳定运行和灵活扩展。接下来,你可以继续学习第四篇:Kubernetes服务发现与负载均衡,进一步提升你的Kubernetes运维和管理技能。

相关文章:

k8s教程3:Kubernetes应用的部署和管理

学习目标 理解Kubernetes中应用部署的基本概念和方法掌握Deployment、ReplicaSet、StatefulSet、DaemonSet、Job与CronJob等控制器的使用了解Helm作为Kubernetes的包管理工具的基本使用通过实际示例学习应用的部署、更新与管理 Kubernetes提供了一套强大而灵活的机制&#xff…...

微信小程序获得当前城市,获得当前天气

// // 获取用户当前所在城市 // wx.getLocation({// type: wgs84, // 默认为 wgs84 返回 gps 坐标,gcj02 返回可用于 wx.openLocation 的坐标 // success: function(res) {// console.log(获取位置成功, res); // // 使用腾讯地图API进行逆地址解析 // wx…...

磁流变式汽车减振器创新设计与关键技术研究

摘要 本文针对智能悬架系统的发展需求&#xff0c;深入探讨磁流变减振器&#xff08;MR Damper&#xff09;的核心设计原理与工程实现路径。通过建立磁场-流场耦合模型&#xff0c;优化磁路结构与控制策略&#xff0c;提出具有快速响应特性的新型磁流变减振器设计方案&#xf…...

Python3.14都有什么重要新特性

目录 1、语法糖新宠&#xff1a;模式匹配再进化 1.1 结构化数据克星 1.2 类型守卫(Type Guard) 2、性能黑科技&#xff1a;尾递归与异步双杀 2.1 尾调用优化(TCO) 2.2 异步任务重构 3、注释系统重构&#xff1a;annotationlib深度解析 3.1 延迟评估机制 3.2 类型推导增…...

前端资源加载失败后重试加载(CSS,JS等引用资源)

前端资源加载失败后的重试 .前端引用资源时出现了资源加载失败(这里针对的是路径引用异常或者url解析错误时) 解决这个问题首先要明确一下几个步骤 1.什么情况或者什么时候重试 2.如何重试 3.重试过程中的边界处理 这里引入里三个测试脚本&#xff0c;分别加载里三个不同的脚…...

【HDFS入门】联邦机制(Federation)与扩展性:HDFS NameNode水平扩展深度解析

目录 引言 1 NameNode水平扩展原理 1.1 传统HDFS架构的局限性 1.2 联邦机制的基本原理 1.3 联邦架构的关键组件 2 多个Namespace的路由规则配置 2.1 客户端挂载表概念 2.2 挂载表配置示例 2.3 挂载表匹配规则 2.4 配置示例 3 BlockPool与Namespace的映射关系 3.1 B…...

C#学习第16天:聊聊反射

什么是反射&#xff1f; 定义&#xff1a;反射是一种机制&#xff0c;允许程序在运行时获取关于自身的信息&#xff0c;并且可以动态调用方法、访问属性或创建实例。用途&#xff1a;常用于框架设计、工具开发、序列化、代码分析和测试等场景 反射的核心概念 1. 获取类型信息…...

论文阅读:2024 arxiv AI Safety in Generative AI Large Language Models: A Survey

总目录 大模型安全相关研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Safety in Generative AI Large Language Models: A Survey https://arxiv.org/pdf/2407.18369 https://www.doubao.com/chat/3262156521106434 速览 研究动机&#x…...

AI推荐系统的详细解析 +推荐系统中滤泡效应(Filter Bubble)的详细解析+ 基于Java构建电商推荐系统的分步实现方案,结合机器学习与工程实践

以下是AI推荐系统的详细解析&#xff1a; 一、核心概念 定义 推荐系统是通过分析用户行为、物品特征或用户画像&#xff0c;向用户推荐个性化内容的技术&#xff0c;广泛应用于电商、视频、社交等领域。 目标 提升用户留存与转化率增强用户体验实现精准营销 二、技术原理 1…...

CSS 美化页面(五)

一、position属性 属性值‌‌描述‌‌应用场景‌static默认定位方式&#xff0c;元素遵循文档流正常排列&#xff0c;top/right/bottom/left 属性无效‌。普通文档流布局&#xff0c;默认布局&#xff0c;无需特殊定位。relative相对定位&#xff0c;相对于元素原本位置进行偏…...

java 设计模式之模板方法模式

简介 模板方法模式&#xff1a;定义一个算法的基本流程&#xff0c;将一些步骤延迟到子类中实现。模板方法模式可以提高代码的复用性&#xff0c; 模板方法中包含的角色&#xff1a; 抽象类&#xff1a;负责给出一个算法的基本流程&#xff0c;它由一个模板方法和若干个基本…...

基于大模型的腹股沟疝诊疗全流程风险预测与方案制定研究报告

目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与创新点 二、大模型技术概述 2.1 大模型基本原理 2.2 常用大模型类型及特点 2.3 大模型在医疗领域的应用潜力 三、腹股沟疝诊疗流程分析 3.1 腹股沟疝的发病机制与分类 3.2 传统术前评估方法与局…...

无约束最优化问题的求解算法--梯度下降法(Gradient Descent)

文章目录 梯度下降法梯度下降法原理&#xff08;通俗版&#xff09;梯度下降法公式学习率的设置**如何选择学习率&#xff1f;** 全局最优解梯度下降法流程损失函数的导函数三种梯度下降法**梯度下降法核心步骤回顾****优缺点详解****1. 全量梯度下降 (Batch Gradient Descent,…...

Python全功能PDF工具箱GUI:支持转换、加密、旋转、图片提取、日志记录等多功能操作

使用Python打造一款集成 PDF转换、编辑、加密、解密、图片提取、日志追踪 等多个功能于一体的桌面工具应用&#xff08;Tkinter ttkbootstrap PyPDF2 等库&#xff09;。 ✨项目背景与开发动机 在日常办公或学习中&#xff0c;我们经常会遇到各种关于PDF文件的操作需求&#…...

[密码学实战]国密算法面试题解析及应用

以下是密码学领域常见的面试题及其详细解析,涵盖基础理论、算法实现与应用场景,帮助系统化备战技术面试 一、基础概念类 1. 密码学的主要目标是什么? 答案: 确保数据的机密性(加密防止窃听)、完整性(哈希校验防篡改)、认证性(数字签名验证身份)和不可否认性(签名防…...

React 受控表单绑定基础

React 中最常见的几个需求是&#xff1a; 渲染一组列表绑定点击事件表单数据与组件状态之间的绑定 受控表单绑定是理解表单交互的关键之一。 &#x1f4cd;什么是受控组件&#xff1f; 在 React 中&#xff0c;所谓“受控组件”&#xff0c;指的是表单元素&#xff08;如 &l…...

计算机视觉---相机标定

相机标定在机器人系统中的作用 1.确定相机的内部参数 相机的内部参数包括焦距、主点坐标、像素尺寸等。这些参数决定了相机成像的几何关系。通过标定&#xff0c;可以精确获取这些参数&#xff0c;从而将图像中的像素坐标与实际的物理坐标建立联系。例如&#xff0c;已知相机…...

LeetCode 443 压缩字符串

字符数组压缩算法详解&#xff1a;实现与分析 一、引言 在处理字符数组时&#xff0c;我们常常遇到需要对连续重复字符进行压缩的场景。这不仅可以节省存储空间&#xff0c;还能提升数据传输效率。本文将深入解析一个经典的字符数组压缩算法&#xff0c;通过详细的实现步骤和…...

datasheet数据手册-阅读方法

DataSheet Datasheet&#xff08;数据手册&#xff09;&#xff1a;电子元器件或者芯片的数据手册&#xff0c;一般由厂家编写&#xff0c;格式一般为PDF&#xff0c;内容为电子分立元器件或者芯片的各项参数&#xff0c;电性参数&#xff0c;物理参数&#xff0c;甚至制造材料…...

AI绘制流程图,方法概述

1 deepseek 生成图片的mermaid格式代码&#xff0c;在kimi中进行绘图或在jupter notebook中绘制&#xff1a; 或在draw.io中进行绘制&#xff08;mermaid代码&#xff09; 2 svg是矢量图&#xff0c;可以插入到word """mermaid graph TDA[基线解算] --> B[北…...

ObjectOutputStream 深度解析

ObjectOutputStream 深度解析 ObjectOutputStream 是 Java IO 体系中的一个关键类,用于序列化(将对象转换为字节流),通常与 ObjectInputStream 配合使用,实现对象的持久化存储或网络传输。 1.作用:完成对象的序列化过程 2.它可以将JVM当中的Java对象序列化到文件中/网…...

git回滚指定版本并操作

你可以通过以下步骤切换到第三个版本。根据你的需求&#xff0c;有两种主要方法&#xff1a; 方法 1&#xff1a;临时查看第三个版本&#xff08;不修改当前分支&#xff09; 适用于仅查看或测试旧版本&#xff0c;不保留后续修改&#xff1a; 找到第三个版本的提交哈希&#…...

【AI插件开发】Notepad++ AI插件开发实践:支持配置界面

一、引用 此前的系列文章已基本完成了Notepad的AI插件的功能开发&#xff0c;但是此前使用的配置为JSON配置文件&#xff0c;不支持界面配置。 本章在此基础上集成支持配置界面&#xff0c;这样不需要手工修改配置文件&#xff0c;直接在界面上操作&#xff0c;方便快捷。 注…...

polkitd服务无法启动导致docker无法启动问题解决

问题docker服务无法启动&#xff0c;溯源发现是polkit服务没有正确运行 systemctl status polkit可以看到类似提示 Sep 18 02:58:24 server1 dbus[897]: [system] Failed to activate service org.freedesktop.PolicyKit1: timed out Sep 18 02:59:29 server1 systemd[1]: po…...

软件工程中数据一致性的探讨

软件工程中数据一致性的探讨 引言数据一致性&#xff1a;软件工程中的业务正确性与性能的权衡数据一致性为何重要业务正确性&#xff1a;事务的原子性与一致性ACID原则的基石分布式事务的挑战一致性级别&#xff1a;从强一致到最终一致 实践中的一致性权衡金融系统&#xff1a;…...

数据库原理及应用mysql版陈业斌实验四

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。” 目录 实验四索引与视图 1.实验数据如下 student 表&#xff08;学生表&…...

华为OD机试真题——最长的顺子(2025A卷:100分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 100分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析&#xff1b; 并提供Java、python、JavaScript、C、C语言、GO六种语言的最佳实现方式&#xff01; 本文收录于专栏&#xff1a;《2025华为OD真题目录全流程解析/备考攻略/经验…...

【HTML】html文件

HTML文件全解析&#xff1a;搭建网页的基石 在互联网的广袤世界里&#xff0c;每一个绚丽多彩、功能各异的网页背后&#xff0c;都离不开HTML文件的默默支撑。HTML&#xff0c;即超文本标记语言&#xff08;HyperText Markup Language&#xff09;&#xff0c;作为网页创建的基…...

使用 XWPFDocument 生成表格时固定列宽度

一、XWPFDocument XWPFTable个性化属性 1.初始默认写法 XWPFTable table document.createTable(n, m); //在文档中创建一个n行m列的表格 table.setWidth("100%"); // 表格占页面100%宽度// 通过getRow获取行进行自定义设置 XWPFTableRow row table.getRow(0); XW…...

足球AI模型:一款用数据分析赛事的模型

2023 年欧冠决赛前&#xff0c;某体育数据平台的 AI 模型以 78% 的概率预测曼城夺冠 —— 最终瓜迪奥拉的球队首次捧起大耳朵杯。当足球遇上 AI&#xff0c;那些看似玄学的 "足球是圆的"&#xff0c;正在被数据与算法拆解成可计算的概率命题。今天我们就来聊聊&#…...