求可获取AKS集群Pod/Node运行详情及请求统计的C#代码
解决方案
获取Pod/Node运行信息
Kubernetes提供了Downward API让Pod内的应用轻松获取自身及所在节点的元数据,最简便的方式是通过环境变量注入:
第一步:配置Deployment注入元数据
在你的AKS Deployment YAML中添加以下配置,将Pod和Node的核心信息注入为容器环境变量:
spec: containers: - name: your-app-container image: your-app-image:tag env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_UID valueFrom: fieldRef: fieldPath: metadata.uid - name: NODE_NAME valueFrom: fieldRef: fieldPath: spec.nodeName - name: NODE_UID valueFrom: fieldRef: fieldPath: spec.nodeUid
请求次数统计实现
使用ASP.NET Core中间件实现全局请求计数,通过Interlocked类保证多线程场景下的计数准确性。
完整C#代码示例
1. 读取Pod/Node元数据的工具类
public class KubernetesMetadata { public string PodName => Environment.GetEnvironmentVariable("POD_NAME") ?? "Unknown"; public string PodUid => Environment.GetEnvironmentVariable("POD_UID") ?? "Unknown"; public string NodeName => Environment.GetEnvironmentVariable("NODE_NAME") ?? "Unknown"; public string NodeUid => Environment.GetEnvironmentVariable("NODE_UID") ?? "Unknown"; }
2. 请求统计中间件
public class RequestCountMiddleware { private static long _requestCount = 0; private readonly RequestDelegate _next; public RequestCountMiddleware(RequestDelegate next) { _next = next; } public async Task InvokeAsync(HttpContext context, ILogger<RequestCountMiddleware> logger) { // 线程安全地增加请求计数 Interlocked.Increment(ref _requestCount); logger.LogInformation("当前Pod累计请求次数: {Count}, Pod名称: {PodName}", _requestCount, Environment.GetEnvironmentVariable("POD_NAME") ?? "Unknown"); await _next(context); } // 对外暴露当前计数的静态方法 public static long GetRequestCount() => Interlocked.Read(ref _requestCount); } // 中间件扩展注册方法 public static class RequestCountMiddlewareExtensions { public static IApplicationBuilder UseRequestCount(this IApplicationBuilder builder) { return builder.UseMiddleware<RequestCountMiddleware>(); } }
3. Program.cs中注册服务与中间件
var builder = WebApplication.CreateBuilder(args); // 注册元数据工具类为单例 builder.Services.AddSingleton<KubernetesMetadata>(); // 添加日志服务 builder.Services.AddLogging(); var app = builder.Build(); // 启用请求统计中间件 app.UseRequestCount(); // 示例接口:返回当前Pod信息与请求计数 app.MapGet("/status", (KubernetesMetadata metadata) => { return Results.Ok(new { PodName = metadata.PodName, PodUid = metadata.PodUid, NodeName = metadata.NodeName, NodeUid = metadata.NodeUid, TotalRequests = RequestCountMiddleware.GetRequestCount() }); }); app.Run();
注意事项
- 必须确保Deployment已配置Downward API环境变量注入,否则应用会返回"Unknown"值
- 内存中的请求计数会在Pod重启后重置,如需持久化统计,可将计数同步至Redis、数据库等外部存储
- 若需要更复杂的Kubernetes资源信息,可使用官方
KubernetesClient库调用API,但需为Pod的ServiceAccount配置对应权限
内容的提问来源于stack exchange,提问作者AshwinGandla
相关产品推荐
相关产品推荐

