Kubernetes 部署
更新: 2026-10-16 15:20:09 字数: 0 字 时长: 0 分钟
Aspire 可以把应用部署到 Kubernetes:既支持自管理的集群,也支持 Azure Kubernetes Service(AKS)。Aspire 会根据 AppHost 中声明的 Kubernetes 环境,决定每个计算资源如何映射为 Kubernetes 对象,然后生成 Helm Chart 或直接完成基础设施预配。
选择目标
| 目标 | 说明 |
|---|---|
| Kubernetes(自有集群) | 从 AppHost 模型生成 Helm Chart,部署到任意已有集群。 |
| Azure Kubernetes Service | 完整预配:Aspire 负责创建集群、容器注册表与所需的 Azure 资源。 |
前置条件
- 已完成 环境准备。
- 已安装 Aspire CLI。
- 已安装
kubectl并在PATH中可用。 - 已安装 Helm 4.2.0 或更高版本,并在
PATH中可用。
Helm 版本要求
Helm 版本过低会导致发布失败。请先执行 helm version 确认。
声明部署目标
csharp
var builder = DistributedApplication.CreateBuilder(args);
builder.AddKubernetesEnvironment("env");
var cache = builder.AddRedis("cache");
builder.AddProject<Projects.Api>("api")
.WithReference(cache)
.WithExternalHttpEndpoints();
builder.Build().Run();资源如何映射到 Kubernetes
| Aspire 资源 | Kubernetes 对象 |
|---|---|
| 项目 / 容器 / 可执行文件 | Deployment + Service |
| 端点 | Service 端口与 Ingress |
| 数据卷 | PersistentVolumeClaim |
| 参数与机密 | Secret / ConfigMap |
| 环境变量注入 | 容器的 env(来自 Service 与 Secret) |
服务发现仍然成立
被引用的资源会通过 Kubernetes 的 Service DNS 名称注入。如果 Service 是 Headless(clusterIP: None),还可以启用 DNS SRV 解析来访问命名端点,见服务发现。
发布与部署
bash
# 只生成 Helm Chart 与相关产物
aspire publish
# 生成产物并部署到当前 kubectl 上下文所在的集群
aspire deploy
# 拆除
aspire destroy产物结构大致如下:
text
aspire-output/
├── chart/
│ ├── Chart.yaml
│ ├── values.yaml
│ └── templates/
│ ├── api-deployment.yaml
│ ├── api-service.yaml
│ └── ...
└── ...持久卷
数据卷会映射为 PersistentVolumeClaim。在 values.yaml 中可以调整:
| 配置项 | 说明 |
|---|---|
storageClass | 使用的存储类(云上通常是默认 StorageClass)。 |
size | 容量。 |
accessModes | 访问模式,例如 ReadWriteOnce。 |
生产环境请显式指定 StorageClass
依赖集群默认 StorageClass 在不同环境之间迁移时容易出问题。
入口与网关
对外暴露的端点需要 Ingress 或 Gateway 资源。Aspire 提供了对应的托管 API:
| API | 说明 |
|---|---|
AddKubernetesIngress(name) | 添加 Ingress 资源。 |
AddKubernetesGateway(name) | 添加 Gateway API 资源。 |
csharp
var builder = DistributedApplication.CreateBuilder(args);
builder.AddKubernetesEnvironment("env");
var ingress = builder.AddKubernetesIngress("ingress");
builder.AddProject<Projects.Web>("web")
.WithExternalHttpEndpoints()
.WithReference(ingress);Helm Chart 自定义
生成的 Chart 可以通过 values.yaml 覆盖。推荐做法:
- 用
aspire publish生成 Chart。 - 把 Chart 纳入 Git 仓库。
- 在 CI 中用
helm upgrade --install -f values.prod.yaml部署。
这样可以把「Aspire 生成的结构」与「环境特定的值」分离。
CI/CD 集成
bash
aspire publish
helm upgrade --install my-app ./aspire-output/chart \
--namespace my-app --create-namespace \
-f values.prod.yaml详见 CI/CD。
常见问题
部署后 Pod 一直 CrashLoopBackOff
- 先看
kubectl logs <pod>,通常能直接找到原因。 - 检查机密是否已正确注入(
kubectl get secret)。 - 检查依赖资源(数据库、缓存)是否在同一命名空间且已就绪。
服务之间调不通
- 确认被引用资源确实生成了
Service。 - 确认消费方使用了服务发现而不是硬编码地址。
- 检查是否遗漏
WaitFor导致启动竞态。





