拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Aspire Kubernetes 部署集成实战:用 Aspire.Hosting.Kubernetes 将工作负载发布到 Kubernetes 集群

Aspire Kubernetes 部署集成实战用 Aspire.Hosting.Kubernetes 将工作负载发布到 Kubernetes 集群【免费下载链接】aspireAspire is the tool for code-first, extensible, observable dev and deploy.项目地址: https://gitcode.com/GitHub_Trending/as/aspireAspire.Hosting.Kubernetes 是 Aspire 的 Kubernetes hosting 集成用于在分布式应用模型AppHost中以代码优先的方式建模、配置并部署 Aspire 计算资源到 Kubernetes。本文基于仓库中的 Kubernetes 集成文档 展开结合 集成源码 与 单元测试 深入讲解从添加集成、声明 Kubernetes 环境到配置临时卷与持久卷、最终通过 Helm 发布与部署的完整链路。读完本文你将能够在 AppHost 中声明 Kubernetes 计算环境为工作负载绑定具备跨环境一致语义的存储并掌握aspire publish、aspire deploy背后 Helm 部署引擎的工作方式。集成概览一个环境资源承载整套发布管线该集成将 Kubernetes 建模为 Aspire 应用模型中的一等资源——KubernetesEnvironmentResource源码见 KubernetesEnvironmentResource.cs。它实现了IComputeEnvironmentResource是一个计算环境资源资源通过WithComputeEnvironment归属到该环境后发布阶段会被翻译成 Kubernetes 的 Service、Deployment、StatefulSet、ConfigMap、Secret、Ingress、Gateway、PVC 等清单并打包成 Helm Chart 输出。从源码结构看集成内部自带了完整的 Kubernetes API 对象模型见 Resources 目录包含DeploymentV1、ServiceV1、StatefulSetV1、PersistentVolumeClaimV1、IngressV1、GatewayV1、HorizontalPodAutoscalerV2等一百余个类型以及一个自研的 YAML 序列化层见 Yaml 目录在发布时将应用模型渲染为真实可用的 Kubernetes 清单。前置条件Helm v4.2.0 及以上根据 README使用该集成的唯一硬性前置条件是Helm v4.2.0 或更高版本且位于PATH环境变量中。Aspire 通过调用helm upgrade --install来部署生成的 Helm Chart。集成会在部署前主动校验 Helm 版本因此 Helm 缺失或版本过旧时用户会看到清晰、可操作的错误提示而不是晦涩的 flag 解析失败例如unknown flag: --force-conflicts。版本校验的底层实现在 HelmVersionValidator.csMinimumHelmVersion被定义为new Version(4, 2, 0)与文档要求一致校验逻辑执行helm version --short用正则v?(?major\d)\.(?minor\d)\.(?patch\d)提取首个MAJOR.MINOR.PATCH版本号有意不锚定行首兼容 oh-my-zsh、asdf shim 等 shell 包装输出的横幅行校验器刻意不传 Helm 2/3 时代的--client参数因为该 flag 在 Helm 4 已被移除传了反而会产生 unknown flag 的晦涩错误Helm 二进制无法启动不在 PATH、权限不足时会抛出包装后的InvalidOperationException提示安装 Helm v4.2.0 或更高版本。添加集成从 AppHost 目录执行 Aspire CLI 命令即可添加集成aspire add Aspire.Hosting.Kubernetes该命令会将Aspire.Hosting.Kubernetes项目引用与相应包配置加入 AppHost 项目。集成项目本身定义在 Aspire.Hosting.Kubernetes.csprojIsPackabletrue包标签为aspire hosting kubernetes并引用核心的Aspire.Hosting项目。用法示例声明 Kubernetes 环境在 AppHost 中添加 Kubernetes 环境对应源码入口 KubernetesEnvironmentExtensions.AddKubernetesEnvironmentC#builder.AddKubernetesEnvironment(k8s);TypeScriptawait builder.addKubernetesEnvironment(k8s);该方法在运行模式下返回一个不会进入顶层资源列表的 builder在发布/部署模式下则将KubernetesEnvironmentResource注册为正式资源并默认挂载 Helm 部署引擎EnsureDefaultHelmEngine会将DeploymentEngineStepsFactory设为HelmDeploymentEngine.CreateStepsAsync。KubernetesEnvironmentResource携带一组可配置的默认值源码字段见 KubernetesEnvironmentResource.cs属性默认值说明HelmChartName应用名小写化生成的Chart.yaml中的图表名HelmChartVersion0.1.0图表版本HelmChartDescriptionAspire Helm Chart图表描述DashboardEnabledtrue是否随应用部署 Aspire DashboardDefaultStorageTypeemptyDir默认存储类型emptyDir/hostPath/pvcDefaultStorageClassNamenull默认存储类未设置时使用集群默认存储类DefaultStorageSize1Gi默认存储容量DefaultStorageReadWritePolicyReadWriteOnce默认访问模式DefaultImagePullPolicyIfNotPresent镜像拉取策略DefaultServiceTypeClusterIP默认 Service 类型KubeConfigPathnull显式 kubeconfig 路径设置后所有 helm/kubectl 命令携带--kubeconfig定制 Helm 部署选项通过WithHelm回调可以定制命名空间、release 名、图表版本、图表名与描述配置类型见 HelmChartOptions.csbuilder.AddKubernetesEnvironment(k8s) .WithHelm(helm { helm.WithNamespace(my-namespace); helm.WithReleaseName(my-release); helm.WithChartVersion(1.0.0); helm.WithChartName(my-app); helm.WithChartDescription(My Aspire workload); });这些方法都支持传入字符串或ParameterResource将值延迟到部署时解析。同时存在严格的格式校验namespace 与 release 名必须是 DNS 标签小写字母、数字、连字符以字母数字开头和结尾长度分别不超过 63 与 53 个字符chart 版本遵循 Helm 的宽松 SemVer 解析规则1.2.3、1.2.3-beta.1ef365、1、1.2、v1.2.3均可不允许前导零chart 名只允许字母数字与-、_、.最长 250 字符描述最长 1024 字符。附加能力Dashboard、节点池与入口WithDashboard(enabled)控制在集群中部署 Aspire Dashboard并自动为所有带 OTLP 支持的资源配置遥测端点ConfigureOtlp会注入OTEL_EXPORTER_OTLP_ENDPOINT、OTEL_EXPORTER_OTLP_PROTOCOL等环境变量见 KubernetesEnvironmentResource.csAddNodePool(gpu)WithNodePool(nodePool)为工作负载添加nodeSelector调度源码见 KubernetesEnvironmentExtensions.cs集成还提供 Ingress、GatewayGateway API、cert-manager 等资源扩展见 KubernetesIngressExtensions.cs 等文件。卷Volumes默认存储策略下的临时存储当 Kubernetes 环境的默认存储策略DefaultStorageType emptyDir足够时使用与目标无关的卷即可C#builder.AddProjectProjects.Api(api) .WithVolume(data, /data, env: DATA_PATH);TypeScriptconst api await builder.addNodeApp(api, ../api, server.js); await api.withVolume(/data, data, DATA_PATH);关于卷在两种模式下的行为README 给出了明确语义运行模式runProject 与 Executable 会获得一个工作负载作用域的 Aspire store 目录。该目录在多次 AppHost 运行之间复用无论进程是会话级还是持久级生命周期发布模式publish卷使用环境的DefaultStorageType即emptyDir——存储的生命周期与 Pod 一致Pod 重启或被重新调度时数据丢失DATA_PATH环境变量的值在部署后为/data。由于emptyDir是临时存储README 明确建议需要 Pod 重启后仍保留的数据应改用持久卷Persistent volumes。持久卷Persistent Volumes跨 Pod 生命周期的存储添加持久卷并通过环境变量暴露其有效路径API 定义见 KubernetesPersistentVolumeExtensions.csC#var k8s builder.AddKubernetesEnvironment(k8s); var data k8s.AddPersistentVolume(data) .WithCapacity(20Gi); builder.AddProjectProjects.Api(api) .WithPersistentVolume(data, /data, env: DATA_PATH);TypeScriptconst k8s await builder.addKubernetesEnvironment(k8s); const data await k8s.addPersistentVolume(data); await data.withCapacity(20Gi); const api await builder.addNodeApp(api, ../api, server.js); await api.withKubernetesPersistentVolumeMount(data, /data, { env: DATA_PATH });持久卷资源可配置项AddPersistentVolume返回的 builder 支持以下链式配置均支持字符串或参数化形式方法作用对应 Kubernetes 字段WithCapacity(20Gi)设置请求容量spec.resources.requests.storage如10Gi、500MiWithStorageClass(managed-csi)设置存储类spec.storageClassName未设置时用集群默认存储类WithAccessMode(PersistentVolumeAccessMode.ReadWriteMany)追加访问模式spec.accessModesWithVolumeAnnotation(key, value)添加元数据注解metadata.annotations供 CSI 驱动、external-secrets 等消费PersistentVolumeAccessMode枚举见 KubernetesPersistentVolumeResource.cs映射 Kubernetes 原生值ReadWriteOnce单节点读写适合块存储数据库、ReadOnlyMany多节点只读、ReadWriteMany多节点读写适合 Azure Files / NFS 等共享文件存储、ReadWriteOncePod单 Pod 读写需 Kubernetes 1.27。两种绑定方式名称匹配工作负载先声明WithVolume(name, /path)或集成帮助方法如 Postgres 的WithDataVolume()再调用WithPersistentVolume(volume)发布器按卷名将 Pod 的volumes[]条目改写为指向生成的 PVC。未设置访问模式时使用环境级DefaultStorageReadWritePolicy显式 mountPathWithPersistentVolume(volume, mountPath, isReadOnly: false)或带env的重载直接创建挂载因此对没有命名卷的工作负载包括ProjectResource同样适用。无论是哪种绑定绑定到持久卷的工作负载在生成清单时都会被提升为StatefulSet而非 Deployment因为共享命名 PVC 的 Pod 需要稳定标识与有序滚动——这是 Kubernetes 的硬性要求相关快照测试见 KubernetesPublisherTests.WithFirstClassPersistentVolume_BindsByName_PromotesToStatefulSet。生成的 Pod 还默认使用 Aspire 管理的fsGroup2000OnRootMismatch变更策略让非 root 容器无需匹配镜像主组即可访问支持的卷需要不同组或策略时可用PublishAsKubernetesService定制 Pod 安全上下文。运行模式与发布模式的路径语义README 对持久卷的路径语义做了关键说明本地运行DATA_PATH指向 AppHost Aspire store 下的持久目录。该 store 通常在 AppHost 的中间输出目录intermediate-output下因此清理构建产物可能删除本地数据。底层实现见 KubernetesPersistentVolumeLocalStorage.cs路径形如{store}/kubernetes/{environment}/volumes/{claimName}按环境名与 PVC 名生成稳定分段本地容器使用 worktree 作用域的容器卷前提是挂载指定了环境变量。未指定环境变量的挂载保留持久卷自身名称作为本地容器卷从而让旧版本 AppHost 写入的数据在升级后仍然挂载单个持久卷资源不能同时被本地容器与本地 Project/Executable 共享因为这两类执行体无法可靠共用一个后备存储相关校验见 KubernetesEnvironmentExtensions.cs发布/部署后DATA_PATH的值为挂载路径如/data因此应用可以在本地与集群两种环境使用同一个环境变量名isReadOnly挂载选项在部署后生效但 Aspire 无法对直接在宿主机上运行的进程将目录设为只读。发布命令将 Kubernetes 环境发布为 Helm Chart 产物aspire publish -o k8s-artifacts输出目录中包含Chart.yaml、values.yaml、templates/下的各资源清单可从测试快照看到结构Chart.verified.yaml、values.verified.yaml、templates/{Service}/deployment.verified.yaml等见 Snapshots 目录。部署引擎Helm 管线如何工作发布是部署的前半段部署则由 Helm 部署引擎驱动。从 HelmDeploymentEngine.cs 可以完整还原其管线步骤check-helm-prereqs-{env}通过IHelmRunner校验 Helm CLI 存在且版本 ≥ 4.2.0复用HelmVersionValidator测试见 HelmVersionValidatorTests.csprepare-{env}解析values.yaml中捕获的参数、密钥、跨资源引用与镜像引用写出环境专属的 values 覆盖文件values.{envName}.yaml命名对齐 Docker Compose 的.env.{envName}模式。参数值会被强制加引号避免 Helm 把01、1.0、True误解析为数值或布尔标量helm-deploy-{env}执行helm upgrade --install核心参数为helm upgrade --install {releaseName} {outputPath} --namespace {namespace} --create-namespace --wait [--kubeconfig {path}] [-f {outputPath}/values.yaml] [-f {outputPath}/values.{envName}.yaml]release 名默认取部署环境名aspire deploy -e name的小写形式namespace 默认default部署成功后会把 release 名与 namespace 持久化到部署状态供aspire destroy使用print-{env}-instructions输出访问指引——Dashboard 的kubectl port-forward命令与登录 token 获取方式、helm status、kubectl get all -l app.kubernetes.io/instance{release}以及helm uninstalldestroy-helm-{env} / helm-uninstall-{env}aspire destroy时确认后执行helm uninstall {release} --namespace {ns} --ignore-not-found幂等且遵循SkipDestroyCleanup处理集群已不存在的情形。此外若环境启用了 Dashboard 且存在带 TLS 的 Ingress/Gateway管线还会追加 TLS 自签引导与 Gateway FQDN 发现步骤。从源码与测试验证行为想深入了解清单生成的细节建议关注tests/Aspire.Hosting.Kubernetes.Tests下的快照与行为测试KubernetesPublisherTests.cs 覆盖卷默认存储、PVC 生成、hostPath 存储类型、CSI 卷、探针端口、Service 端口映射、自定义工作负载与资源类型、参数/密钥占位符解析等发布行为KubernetesEnvironmentResourceTests.cs 验证多 Kubernetes 环境并存、环境发布产物等KubernetesDeployTests.cs 覆盖端到端发布-解析流程包括条件参数、延迟值提供器等。例如快照 KubernetesPublisherTests.WithFirstClassPersistentVolume_EnvironmentUsesDeploymentMountPath 印证了部署后DATA_PATH等于挂载路径的语义PublishAppliesServiceCustomizations.verified.yaml 印证了 Service 定制注解的发布行为。小结Aspire.Hosting.Kubernetes 把建模、配置、部署到 Kubernetes收敛为 AppHost 中一段声明式代码AddKubernetesEnvironment声明环境WithVolume/WithPersistentVolume声明存储语义本地与集群共享同一环境变量路径aspire publish产出 Helm Chartaspire deploy通过版本校验后的helm upgrade --install完成落地。理解其卷的 run/publish 双模式语义、持久卷到 StatefulSet 的提升规则以及 Helm 部署引擎的管线顺序是在实际项目中可靠使用该集成、并规避清理构建产物导致本地数据丢失Pod 重启后 emptyDir 数据清空等陷阱的关键。【免费下载链接】aspireAspire is the tool for code-first, extensible, observable dev and deploy.项目地址: https://gitcode.com/GitHub_Trending/as/aspire创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门