Sveltos:多集群Kubernetes应用分发与配置管理的核心利器

news2026/5/15 17:07:22
1. 项目概述Sveltos一个被低估的集群应用管理利器如果你和我一样长期在多集群的Kubernetes环境中摸爬滚打那你一定对“应用分发”这件事的复杂性深有体会。想象一下你手头有几十甚至上百个集群有的在公有云有的在本地机房环境标签从env: prod到env: dev各不相同。现在你需要确保所有生产环境的集群都装上Kyverno做策略管理所有开发环境的集群都部署好特定的监控栈同时某些金融业务的集群还需要额外的安全组件。传统的做法是什么写一堆Helm命令配合脚本或者依赖某个集群的GitOps工具链但跨集群的协调、依赖顺序、配置漂移检测这些“脏活累活”依然让人头疼。这就是我最初接触到Sveltos时眼前一亮的原因。它不是一个全新的编排引擎而是一个极其聪明的“胶水层”控制器。它的核心定位非常清晰运行在一个中心化的管理集群Management Cluster里帮你把各种形式的“附加组件”Add-ons和应用程序以一种声明式、可编程的方式分发并同步到下游任意数量的被管理集群Managed Clusters中。这里说的“附加组件”范围非常广可以是Helm Chart、原始的Kubernetes YAML清单、经过Kustomize加工的资源包甚至是Carvel ytt或Jsonnet这种高级配置语言生成的模板。Sveltos就像一个坐在指挥中心的调度员手里有一份详细的“部署清单”ClusterProfile清楚地知道哪个集群该有什么并且持续确保它们的状态符合预期。我之所以花时间深入研究并实践Sveltos是因为它精准地解决了多集群场景下的几个核心痛点配置的复用与差异化、部署的精确顺序控制、以及令人安心的配置漂移自愈能力。它不试图取代Helm或Kustomize而是让它们更好地在跨集群维度上协作。接下来我会结合大量实战细节带你彻底拆解Sveltos的设计哲学、核心机制并分享从零部署到高级用法中那些文档里不会写的“坑”和技巧。2. 核心架构与设计哲学深度解析在开始敲命令之前我们必须先理解Sveltos的“世界观”。这决定了你是否能用对、用好它。2.1 管理集群与被管理集群的角色定义Sveltos采用经典的“Hub-Spoke”模型但实现上更加轻量和Kubernetes原生。管理集群 (Management Cluster)这是Sveltos控制平面即addon-controller运行的地方。你只需要在这里安装一次Sveltos。它的核心职责是“想”和“指挥”。它存储了所有的部署策略ClusterProfile/Profile持续观察哪些被管理集群匹配这些策略并计算出需要执行的操作计划。关键一点管理集群本身也可以同时作为一个被管理集群这意味着你可以在同一个集群上部署全局性的基础设施组件。被管理集群 (Managed Cluster)这是实际运行工作负载的集群。它需要安装一个轻量级的Sveltos代理sveltos-agent。这个代理只做两件事与管理集群建立安全的通信通道接收来自管理集群的指令并在本地集群中执行具体的部署、更新或删除操作。代理的权限可以通过RBAC严格限制通常只授予其操作特定命名空间的权限安全性有保障。这种架构的好处是职责分离。管理集群集中了所有的逻辑和策略被管理集群无需关心复杂的协调逻辑只需忠实执行命令非常适合大规模环境。2.2 Profile与ClusterProfile多租户与全局管控的利器这是Sveltos进行资源隔离和权限划分的核心抽象理解它们的不同是设计多团队平台的关键。ClusterProfile集群作用域的资源。这意味着一旦在管理集群创建了一个ClusterProfile它的选择器clusterSelector可以匹配任何命名空间中的被管理集群。这通常是平台或SRE团队的专属工具。比如你可以创建一个名为global-security-baseline的ClusterProfile选择所有带有env: prod标签的集群为其统一部署安全审计工具、网络策略控制器等。ClusterProfile是进行全局、强制性基线配置的武器。Profile命名空间作用域的资源。它只能在创建它的那个命名空间内生效并且其选择器只能匹配绑定到该命名空间的被管理集群。这是为“租户”比如不同的业务团队设计的。团队管理员可以在自己的命名空间下创建Profile管理分配给他们的那些集群。例如team-a命名空间下的Profile只能管理标记为team: team-a的集群为它们部署团队特有的CI/CD工具链。这样就实现了基于命名空间的多租户隔离团队间互不干扰。实操心得在规划初期就要明确权限边界。我通常建议平台团队使用ClusterProfile部署跨所有业务线的、与稳定性/安全性强相关的底层服务如CNI、CSI、Ingress Controller基础版。而各业务团队则被授予特定命名空间的权限使用Profile来部署业务相关的中间件或应用配置如Redis、团队专属的监控Agent。这种模式清晰且易于审计。2.3 同步模式SyncMode应对不同生命周期的策略Sveltos提供了三种同步模式对应组件不同的生命周期阶段这是它比一些简单GitOps工具更细腻的地方。OneTime一次性注入模式。顾名思义Sveltos在集群首次匹配到策略时将Add-on部署到目标集群之后便不再管理。哪怕你在管理集群修改或删除了这个Add-on配置被管理集群中的对应资源也不会被更新或删除。这个模式的设计初衷是集群引导Bootstrapping。想象一下你需要先在被管理集群安装CNI插件集群网络才能通或者你需要先安装Flux CD后续的部署才能交给集群自身的GitOps流程。OneTime模式就是干这个的——完成基础的、一次性的搭建工作然后功成身退将后续管理权移交。Continuous持续同步模式。这是最常用、也是最符合GitOps思想的模式。Sveltos会持续监控管理集群中ClusterProfile/Profile的定义。任何修改比如Helm Chart版本升级、ConfigMap内容变化都会自动、持续地同步到所有匹配的被管理集群中。同时如果你从策略中移除了某个Add-onSveltos也会将其从目标集群中删除。这用于管理集群的“日常状态”确保所有集群的配置与中央声明的期望状态一致。ContinuousWithDriftDetection带漂移检测的持续同步模式。这是Continuous模式的增强版。除了持续同步它还会定期检查被管理集群中实际资源的状态是否被人为kubectl edit/delete或其他外部工具意外修改过。如果检测到“漂移”Sveltos会自动进行修复将资源状态拉回期望状态。这对于保障安全策略、关键配置的不可变性至关重要。注意事项ContinuousWithDriftDetection虽然强大但会带来额外的API查询开销。不建议对所有资源启用通常只用于那些对一致性要求极高、不允许手动变更的核心配置如安全策略、资源配额。对于频繁由内部CI/CD更新的业务应用使用Continuous模式可能更合适避免Sveltos与内部流程产生冲突。3. 从零到一完整部署与核心配置实战理论说得再多不如动手搭一遍。下面我将以一个完整的生产级沙箱环境为例展示从安装到部署第一个Add-on的全过程。3.1 环境准备与Sveltos安装假设我们有一个管理集群mgmt-cluster和两个被管理集群workload-cluster-1workload-cluster-2。所有集群均为Kubernetes 1.24。第一步在管理集群安装Sveltos控制平面Sveltos推荐使用Helm进行安装这是最方便管理依赖和升级的方式。# 添加Sveltos Helm仓库 helm repo add projectsveltos https://projectsveltos.github.io/helm-charts helm repo update # 安装Sveltos核心控制器到管理集群的sveltos命名空间 helm install sveltos projectsveltos/sveltos \ --namespace sveltos \ --create-namespace \ --set clusterProxy.adminNamespacesveltos \ --version 1.4.0 # 建议指定稳定版本安装完成后检查Pod状态kubectl get pods -n sveltos你应该看到类似以下的运行中的PodNAME READY STATUS RESTARTS AGE sveltos-addon-controller-xxxxx-yyyyy 1/1 Running 0 2m sveltos-cluster-api-proxy-xxxxx-yyyyy 1/1 Running 0 2m第二步在被管理集群注册并安装Agent被管理集群需要向管理集群“报到”。Sveltos使用Kubernetes的ServiceAccount和Token机制建立安全连接。我们需要在管理集群为每个被管理集群创建一个“集群凭证”ClusterRegistration。首先在被管理集群上创建一个专用于Sveltos的ServiceAccount和权限。# 在被管理集群上执行 kubectl create namespace sveltos-agent kubectl apply -f - EOF apiVersion: v1 kind: ServiceAccount metadata: name: sveltos-agent namespace: sveltos-agent --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: sveltos-agent-role rules: - apiGroups: [*] resources: [*] verbs: [*] # 生产环境应根据实际需要部署的Add-on范围细化此权限 --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: sveltos-agent-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: sveltos-agent-role subjects: - kind: ServiceAccount name: sveltos-agent namespace: sveltos-agent EOF然后获取这个ServiceAccount的Token和CA证书。# 获取Secret名称 SECRET_NAME$(kubectl get serviceaccount sveltos-agent -n sveltos-agent -o jsonpath{.secrets[0].name}) # 提取Token (Base64解码) TOKEN$(kubectl get secret $SECRET_NAME -n sveltos-agent -o jsonpath{.data.token} | base64 --decode) # 提取CA证书 (Base64解码) CA_CRT$(kubectl get secret $SECRET_NAME -n sveltos-agent -o jsonpath{.data.ca\.crt} | base64 --decode) # 获取APIServer地址 APISERVER$(kubectl config view --minify -o jsonpath{.clusters[0].cluster.server})现在切换到管理集群使用上述信息创建ClusterRegistration资源。# 在管理集群上执行 kubectl apply -f - EOF apiVersion: lib.projectsveltos.io/v1beta1 kind: ClusterRegistration metadata: name: workload-cluster-1 namespace: sveltos # 注意这个资源创建在sveltos命名空间 spec: clusterType: kubernetes kubernetes: apiServerEndpoint: $APISERVER # 替换为上面获取的workload-cluster-1的APIServer地址 kubeconfig: secretRef: name: workload-cluster-1-kubeconfig namespace: sveltos # 这里我们选择直接使用Token更安全的方式是使用secretRef kubeconfig # 为演示方便我们直接嵌入token和ca。生产环境务必使用secretRef。 authInfo: bearerToken: $TOKEN # 替换为上面获取的workload-cluster-1的Token tlsClientConfig: caBundle: $CA_CRT # 替换为上面获取的workload-cluster-1的CA证书 EOF创建后Sveltos控制器会自动根据ClusterRegistration的信息在对应的被管理集群中部署sveltos-agent。你可以在管理集群查看集群状态kubectl get clusterregistration -n sveltos kubectl get sveltoscluster -n sveltos # Sveltos自动生成的集群表示资源状态应为Provisioned或Ready。3.2 编写你的第一个ClusterProfile部署Kyverno现在我们有了管理集群和已注册的被管理集群。让我们实践一个经典场景为所有生产环境集群自动部署Kyverno策略引擎。首先给被管理集群打上标签。假设workload-cluster-1是生产集群。# 在管理集群通过Sveltos资源为集群打标签或直接在被管理集群操作。 # 这里演示通过Sveltos ClusterRegistration的label字段如果支持更简单的方式是直接编辑SveltosCluster资源。 kubectl label sveltoscluster -n sveltos workload-cluster-1 envprod然后创建如下ClusterProfile# kyverno-prod-clusterprofile.yaml apiVersion: config.projectsveltos.io/v1beta1 kind: ClusterProfile metadata: name: kyverno-for-prod spec: # 选择所有带有 envprod 标签的集群 clusterSelector: matchLabels: env: prod # 使用带漂移检测的持续同步确保安全策略不被篡改 syncMode: ContinuousWithDriftDetection helmCharts: - repositoryURL: https://kyverno.github.io/kyverno/ repositoryName: kyverno chartName: kyverno/kyverno chartVersion: v3.0.1 # 建议固定版本避免自动升级导致意外 releaseName: kyverno releaseNamespace: kyverno helmChartAction: Install # 或 Upgrade # Helm values配置可以很复杂。这里简单设置副本数。 values: | admissionController: replicas: 2 backgroundController: replicas: 1 # 我们还可以同时部署一些Kyverno的默认策略包通过ConfigMap引用 policyRefs: - name: kyverno-policies namespace: sveltos-policies kind: ConfigMap这里引入了policyRefs字段。它允许你引用一个ConfigMap或Secret其中包含需要部署的原始Kubernetes YAML资源。我们需要先创建这个ConfigMap# kyverno-policies-configmap.yaml apiVersion: v1 kind: ConfigMap metadata: name: kyverno-policies namespace: sveltos-policies data: disallow-privileged-containers.yaml: | apiVersion: kyverno.io/v1 kind: ClusterPolicy metadata: name: disallow-privileged-containers spec: validationFailureAction: Enforce background: true rules: - name: validate-privileged match: resources: kinds: - Pod validate: message: Privileged containers are not allowed. pattern: spec: containers: - (securityContext): (privileged): false将ClusterProfile和ConfigMap应用到管理集群kubectl create namespace sveltos-policies kubectl apply -f kyverno-policies-configmap.yaml kubectl apply -f kyverno-prod-clusterprofile.yaml应用后立刻观察ClusterProfile的状态和事件kubectl describe clusterprofile kyverno-for-prod在输出中你应该看到Status部分显示匹配到的集群列表以及每个Add-on的部署状态Provisioned,Deployed,Failed等。同时你可以去到workload-cluster-1上验证# 在workload-cluster-1上执行 kubectl get pods -n kyverno kubectl get clusterpolicies.kyverno.io如果一切顺利Kyverno的Pod和来自ConfigMap的策略都应该已经就绪。3.3 进阶使用Kustomize与GitRepository集成对于更复杂的、基于目录结构的配置Sveltos可以无缝集成Flux的GitRepository或OCIRepository资源直接部署Kustomize项目。假设你有一个Git仓库结构如下my-infra-config/ ├── base/ │ ├── kustomization.yaml │ └── deployment.yaml └── overlays/ └── production/ ├── kustomization.yaml └── patch-replicas.yaml首先在管理集群安装Flux的Source Controller并创建一个指向该仓库的GitRepository资源。# 安装Flux (如果尚未安装) flux install --namespaceflux-system # 创建GitRepository flux create source git my-infra-repo \ --urlhttps://github.com/your-org/my-infra-config \ --branchmain \ --interval1m \ --namespaceflux-system然后创建一个引用此GitRepository的ClusterProfileapiVersion: config.projectsveltos.io/v1beta1 kind: ClusterProfile metadata: name: deploy-custom-metrics spec: clusterSelector: matchLabels: component: monitoring syncMode: Continuous kustomizationRefs: - namespace: flux-system name: my-infra-repo kind: GitRepository path: ./overlays/production/ # 指定Kustomize overlay路径 targetNamespace: monitoring # 可选在部署前进行变量替换 # vars: # - name: METRICS_IMAGE # value: my-registry/metrics-agent:v2.0当这个ClusterProfile被应用后Sveltos会监视指定的GitRepository资源获取最新的代码。在内存中运行kustomize build ./overlays/production/生成最终的Kubernetes资源清单。将生成的资源部署到所有匹配的、标签为component: monitoring的集群的monitoring命名空间中。实操心得这种模式将配置的“源”Git仓库和“分发逻辑”ClusterProfile解耦了。基础设施团队维护Git仓库中的Kustomize配置平台团队则通过Sveltos控制这些配置在哪些集群生效。权限划分非常清晰。同时利用Git的版本控制和Code Review流程使得基础设施变更也实现了GitOps。4. 事件驱动框架让部署响应集群状态变化Sveltos最令我惊艳的特性之一是它的事件驱动框架。这超越了简单的“定时同步”或“配置即代码”实现了真正的“状态驱动部署”。4.1 核心概念AddonCompliance与事件源想象一个场景你只想在集群的节点数量超过10个时才部署一个高级的集群自动伸缩器。或者只有当某个特定的StorageClass存在时才部署依赖它的有状态应用。传统的GitOps工具很难优雅地处理这种条件依赖。Sveltos通过AddonCompliance和EventSource两个CRD来实现。EventSource定义“什么样的事件值得关注”。它可以监视集群内资源的变化如Deployment就绪、ConfigMap更新。集群本身属性的变化如节点数量、K8s版本。甚至外部系统的事件通过Webhook。AddonCompliance将EventSource与ClusterProfile/Profile绑定起来。它定义了一条规则“当某个事件发生时在匹配的集群上部署对应的Add-on配置”。4.2 实战根据节点规模动态部署监控组件假设我们有一个自定义的监控栈比如由Prometheus、Alertmanager和多个Exporter组成资源消耗较大。我们只想在“大型”集群节点数5中部署它。首先定义一个EventSource来监听集群节点数量。apiVersion: lib.projectsveltos.io/v1beta1 kind: EventSource metadata: name: large-cluster-detector spec: collectResources: true resourceSelectors: - namespace: * group: version: v1 kind: Node evaluate: | // 这是一个Lua脚本片段用于评估事件 function evaluate() hs {} // resources 变量包含了所有匹配resourceSelectors的资源 nodeCount 0 for _, resource in ipairs(resources) do if resource.status ~ nil and resource.status.conditions ~ nil then local ready false for _, condition in ipairs(resource.status.conditions) do if condition.type Ready and condition.status True then ready true break end end if ready then nodeCount nodeCount 1 end end end // 如果就绪节点数大于等于5则触发事件 if nodeCount 5 then hs.matching true hs.message Cluster has .. tostring(nodeCount) .. ready nodes. else hs.matching false hs.message Cluster has only .. tostring(nodeCount) .. ready nodes. end return hs end这个EventSource会收集所有Node资源并通过内嵌的Lua脚本计算就绪节点的数量。当数量5时evaluate函数返回matching true表示事件被触发。接着创建一个AddonCompliance来绑定事件和动作。apiVersion: lib.projectsveltos.io/v1beta1 kind: AddonCompliance metadata: name: deploy-monitoring-for-large-clusters spec: clusterSelector: matchLabels: env: prod # 可以进一步限定生产环境 eventSourceName: large-cluster-detector # 当事件触发时引用哪个ClusterProfile来部署Add-on policyRefs: - namespace: default name: advanced-monitoring-stack kind: ClusterProfile # 可选当事件不再匹配时节点数减少到5以下是否移除Add-on # oneForEvent: true 表示事件触发时部署事件消失时删除。false则只部署不删除。 oneForEvent: true最后确保名为advanced-monitoring-stack的ClusterProfile已经定义好其中包含了部署完整监控栈的Helm Chart或Kustomize配置。这样一来整个流程就自动化了当一个生产集群的节点数扩展到5个或以上时Sveltos会自动在其上部署高级监控栈。如果该集群缩容到5个节点以下监控栈会被自动清理因为oneForEvent: true。这实现了基于集群实时状态的、非常精细的自动化管理。避坑技巧Lua脚本的编写需要谨慎。脚本中resources变量是一个数组包含了所有匹配选择器的资源对象。务必处理好空值和错误情况。建议先在少量集群上测试脚本逻辑可以通过查看EventSource资源的status字段来调试脚本的输出。5. 生产环境运维、故障排查与性能调优将Sveltos用于生产环境除了功能我们更关心它的稳定性和可观测性。5.1 关键监控指标与健康检查Sveltos控制器和Agent都暴露了Prometheus指标。控制器指标在管理集群通过Servicesveltos-addon-controller-metrics-service可以获取到关于ClusterProfile同步状态、集群健康度、协调循环次数和延迟等核心指标。Agent指标在被管理集群通过Servicesveltos-agent-metrics-service可以获取到任务执行状态、与管理集群的连接状态等指标。我强烈建议采集这些指标并设置以下告警规则sveltos_cluster_status集群状态不是Ready的时间超过5分钟。sveltos_addon_deployment_duration_seconds_bucketAdd-on部署耗时P99超过一定阈值如300秒。sveltos_reconcile_errors_total协调错误率在短时间内飙升。5.2 常见问题排查清单以下是我在运维中遇到的一些典型问题及解决思路问题现象可能原因排查步骤ClusterProfile状态一直为Provisioning或Failed1. 目标集群未就绪或网络不通。2. 被管理集群的sveltos-agentPod异常。3. ClusterRegistration的认证信息Token/CA错误或过期。1.kubectl get sveltoscluster查看集群状态和详细信息。2. 在被管理集群检查sveltos-agentPod日志。3. 在管理集群检查对应ClusterRegistration的Eventskubectl describe clusterregistration name -n sveltos。Helm Chart部署失败1. Helm仓库网络不可达。2. Chart版本不存在或Values格式错误。3. 目标集群命名空间不存在或RBAC权限不足。1. 检查管理集群到互联网及被管理集群的网络。2. 查看ClusterProfile的Status字段通常会有详细的错误信息。3. 尝试手动在被管理集群用相同Values安装Helm Chart验证可行性。配置漂移未自动修复1. ClusterProfile的syncMode不是ContinuousWithDriftDetection。2. 资源被其他控制器如HPA、VPA频繁修改导致修复循环。3. 漂移检测间隔未到默认5分钟。1. 确认ClusterProfile的syncMode设置正确。2. 检查资源是否被多个控制器管理考虑调整或排除。3. 查看sveltos-agent日志确认漂移检测和修复任务是否正常执行。事件驱动部署未触发1. EventSource中的Lua脚本逻辑错误始终返回matchingfalse。2. EventSource选择的资源不存在或Label不匹配。3. AddonCompliance中的clusterSelector未匹配到任何集群。1. 查看EventSource资源的status字段里面有matching和message的当前值是调试脚本的关键。2. 检查EventSource的resourceSelectors是否正确。3. 确认目标集群的标签是否正确。5.3 性能调优建议当管理超过100个集群时需要考虑一些调优参数调整协调间隔Sveltos控制器默认的协调间隔是10秒。对于超大规模环境可以适当调大这个值以减少API Server压力。这可以通过修改Controller Manager的启动参数实现如--sync-period30s但需权衡配置变更的延迟。优化EventSource避免定义过于频繁触发或评估逻辑过于复杂的EventSource。每个EventSource的评估都会增加控制器的计算开销。资源限制与请求为sveltos-addon-controller和sveltos-agent设置合理的资源请求和限制特别是在管理大量集群或复杂Add-on时。防止因内存不足导致OOM。使用OneTime模式对于真正的“一次性”引导任务如安装CNI务必使用OneTime模式。完成后Sveltos将不再监控这些资源可以显著减少不必要的协调循环。6. 总结与个人实践建议经过一段时间的深度使用Sveltos已经成为了我们多云K8s平台不可或缺的“配置分发中枢”。它填补了单纯GitOps工具在跨集群协调、条件化部署和漂移修复方面的空白。它的设计非常“Kubernetes原生”所有概念都是CRD调试和集成都很方便。我个人最欣赏的几点是清晰的抽象Profile/ClusterProfile完美对应了多租户和全局管理的需求权限模型干净利落。强大的模板与引用能力支持多种主流配置工具并且能通过ConfigMap/Secret引用资源使得配置既可以被版本化Git又能在Sveltos层面被灵活组合和分发。事件驱动的智能化这是真正的亮点。它将部署从“静态配置”升级为“动态响应”为实现基于集群健康状况、资源容量甚至外部事件如告警的自动化运维打开了大门。给新手的最后建议从一个小而简单的场景开始比如用OneTime模式在所有集群部署一个统一的StorageClass。然后尝试Continuous模式部署一个简单的应用如nginx。等熟悉了基本流程再逐步引入Kustomize、EventSource等高级功能。务必关注日志和资源状态Sveltos在错误信息方面做得比较详细是排查问题的好帮手。它的社区也在不断成长遇到问题时Slack频道和GitHub Issues通常能得到及时的响应。如果你正在为管理成百上千个Kubernetes集群的配置一致性而发愁Sveltos绝对值得你投入时间评估和尝试。它可能不是解决所有问题的银弹但在“跨集群应用与组件管理”这个细分领域它提供了一套极其优雅和强大的解决方案。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…