在 Kubernetes 中管理 .NET 应用的配置,核心是利用 Kubernetes 原生的配置资源,结合 .NET 自身的配置体系,实现配置的外部化、动态化管理,避免将配置硬编码到应用代码中。

Kubernetes 配置资源介绍
Kubernetes 提供了两种主要的配置资源,分别适用于不同的配置场景:
- ConfigMap:用于存储非敏感的配置数据,比如应用的业务配置、服务地址、功能开关等,数据以键值对的形式存储。
- Secret:用于存储敏感配置数据,比如数据库密码、API 密钥、证书等,数据会进行 base64 编码存储,相对 ConfigMap 有更高的安全性。
使用 ConfigMap 管理非敏感配置
创建 ConfigMap
可以通过 YAML 文件定义 ConfigMap,以下是一个存储 .NET 应用业务配置的示例:
apiVersion: v1
kind: ConfigMap
metadata:
name: dotnet-app-config
namespace: default
data:
# 键值对形式的配置
AppSettings__MaxRequestCount: "100"
AppSettings__CacheExpireMinutes: "30"
# 也可以存储多行配置内容
appsettings.override.json: |
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
在 Pod 中挂载 ConfigMap
有两种常用的方式让 .NET 应用读取 ConfigMap 中的配置:环境变量注入和文件挂载。
方式一:环境变量注入
在 Pod 的 YAML 定义中,通过 env 字段将 ConfigMap 的键值对注入为环境变量:
apiVersion: v1
kind: Pod
metadata:
name: dotnet-app-pod
spec:
containers:
- name: dotnet-app
image: my-dotnet-app:latest
env:
- name: AppSettings__MaxRequestCount
valueFrom:
configMapKeyRef:
name: dotnet-app-config
key: AppSettings__MaxRequestCount
- name: AppSettings__CacheExpireMinutes
valueFrom:
configMapKeyRef:
name: dotnet-app-config
key: AppSettings__CacheExpireMinutes
方式二:文件挂载
将 ConfigMap 中的多行配置内容挂载为应用目录下的配置文件,适合存储完整的配置文件内容:
apiVersion: v1
kind: Pod
metadata:
name: dotnet-app-pod
spec:
containers:
- name: dotnet-app
image: my-dotnet-app:latest
volumeMounts:
- name: config-volume
mountPath: /app/config
volumes:
- name: config-volume
configMap:
name: dotnet-app-config
items:
- key: appsettings.override.json
path: appsettings.override.json
.NET 应用读取 ConfigMap 配置
.NET 应用的配置系统会自动读取环境变量和指定路径的配置文件,无需额外编写大量适配代码。如果是环境变量注入的配置,.NET 会自动将环境变量转换为配置键值,双下划线会被识别为配置层级分隔符,和 JSON 配置中的冒号层级效果一致。如果是文件挂载的配置,只需要在应用启动时指定配置文件路径即可:
var builder = WebApplication.CreateBuilder(args);
// 加载挂载路径下的配置文件
builder.Configuration.AddJsonFile("/app/config/appsettings.override.json", optional: true, reloadOnChange: true);
var app = builder.Build();
// 读取配置示例
var maxRequestCount = builder.Configuration.GetValue<int>("AppSettings:MaxRequestCount");
var cacheExpireMinutes = builder.Configuration.GetValue<int>("AppSettings:CacheExpireMinutes");
app.MapGet("/config", () => new {
MaxRequestCount = maxRequestCount,
CacheExpireMinutes = cacheExpireMinutes
});
app.Run();
使用 Secret 管理敏感配置
创建 Secret
Secret 中的数据需要先做 base64 编码,以下是创建存储数据库密码的 Secret 示例:
apiVersion: v1 kind: Secret metadata: name: dotnet-app-secret namespace: default type: Opaque data: # 原始值为 MyDbPassword123,base64 编码后的值 DbPassword: TXlEYlBhc3N3b3JkMTIz # 原始值为 mydbuser DbUser: bXlkYnVzZXI=
在 Pod 中使用 Secret
Secret 的使用方式和 ConfigMap 类似,同样支持环境变量注入和文件挂载,以下是环境变量注入的示例:
apiVersion: v1
kind: Pod
metadata:
name: dotnet-app-pod
spec:
containers:
- name: dotnet-app
image: my-dotnet-app:latest
env:
- name: Db__User
valueFrom:
secretKeyRef:
name: dotnet-app-secret
key: DbUser
- name: Db__Password
valueFrom:
secretKeyRef:
name: dotnet-app-secret
key: DbPassword
.NET 应用读取 Secret 配置
Secret 注入的环境变量读取方式和普通环境变量一致,.NET 配置系统会自动识别:
var builder = WebApplication.CreateBuilder(args);
var dbUser = builder.Configuration.GetValue<string>("Db:User");
var dbPassword = builder.Configuration.GetValue<string>("Db:Password");
// 使用配置连接数据库
var connectionString = $"Server=127.0.0.1;User Id={dbUser};Password={dbPassword};";
app.MapGet("/db-config", () => new {
DbUser = dbUser,
HasPassword = !string.IsNullOrEmpty(dbPassword)
});
app.Run();
配置更新与生效
ConfigMap 和 Secret 更新后,通过文件挂载方式使用的配置会自动更新到 Pod 中,如果 .NET 应用开启了配置文件的 reloadOnChange 选项,配置会在短时间内自动生效,无需重启应用。如果是通过环境变量注入的配置,更新后需要重启 Pod 才能生效,因此非敏感配置优先使用文件挂载的方式,更便于动态更新。
注意事项
- 不要将 Secret 的 base64 编码内容当作加密,base64 可以很容易解码,生产环境建议结合 Kubernetes 的加密提供者对 Secret 进行加密存储。
- ConfigMap 和 Secret 的大小有限制,单个资源不能超过 1MiB,过大的配置不建议放在这两个资源中。
- 挂载配置文件时,注意文件的权限设置,避免应用没有读取权限导致启动失败。
Kubernetes.NET_应用ConfigMapSecret配置管理修改时间:2026-07-09 23:51:34