AKS部署Elastic Stack后.NET6 WebApi无法创建索引写入日志问题
问题背景
参考Elastic官方示例,在Azure Kubernetes Service(AKS)上部署Elastic Stack,用于采集自研.NET6 WebApi日志,日志框架选用Serilog。开发环境通过docker-compose在本地Docker容器中运行Elastic Stack完成测试,所有功能运行正常。
部署到AKS后出现异常:
- Kubernetes集群内所有服务运行状态正常,可通过curl访问Elasticsearch的9200端口
- 生产环境请求该端口时服务返回空响应
- 可正常访问Kibana仪表盘
- 从本地PC使用指向AKS部署的Elastic服务的生产配置启动应用时,无法创建任何索引,也观测不到任何数据变更
现有配置
生产环境配置文件
{ "ApplicationName": "identity-service", "Serilog": { "MinimiumLevel": { "Default": "Information", "Ovveride": { "Microsoft": "Information", "System": "Warning" } } }, "ElasticConfiguration": { "URI": "https://elasic-cloud-ip:9200" } }
开发环境可正常运行的Serilog接入代码
var env = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT"); builder.Host.UseSerilog((context, configuration) => { Console.Out.WriteLine($"{Assembly.GetExecutingAssembly().GetName().Name.ToLower()}-{env.ToLower().Replace(".", "-")}-{DateTime.UtcNow:yyyy-MM}"); configuration.Enrich.FromLogContext() .Enrich.WithMachineName() .WriteTo.Console() .WriteTo.Elasticsearch( new ElasticsearchSinkOptions(new Uri(context.Configuration["ElasticConfiguration:URI"])) { IndexFormat = $"{context.Configuration["ApplicationName"].ToLower()}-{env.ToLower().Replace(".", "-")}-{DateTime.UtcNow:yyyy-MM}", AutoRegisterTemplate = true, NumberOfShards = 1, NumberOfReplicas = 2 }) .Enrich.WithProperty("Environment", context?.HostingEnvironment?.EnvironmentName?.ToLowerInvariant()) .ReadFrom.Configuration(context.Configuration); });
问题原因与排查解决步骤
- 优先修正配置中的拼写错误,这类低级错误会直接导致功能失效:
- Serilog配置节点的
MinimiumLevel拼写错误,正确名称为MinimumLevel - 日志级别覆盖节点
Ovveride拼写错误,正确名称为Override - Elasticsearch服务地址中的
elasic拼写错误,正确应为elastic,地址拼写错误会直接导致请求发送到错误目标
- Serilog配置节点的
- 排查协议与连通性问题:
- 先在本地PC执行带详细输出的curl命令
curl -v 修正后的Elasticsearch地址,验证连通性:如果返回空响应,先确认AKS对外暴露Elasticsearch的服务类型(LoadBalancer/Ingress)对应的NSG网络安全组是否放通本地出口IP,负载均衡规则是否正确映射9200端口 - 核对协议:如果部署的Elasticsearch默认未开启HTTPS,需要把配置里的URI头从
https://改为http://,强制HTTPS访问HTTP端口会触发SSL握手失败,直接返回空响应;如果是自签名证书,测试环境可在ElasticsearchSink配置中添加DisableCertificateValidation = true跳过证书校验,生产环境建议替换为受信任的CA签发证书 - 检查认证配置:如果Elasticsearch开启了基础认证,需要在Sink配置中通过
ModifyConnectionSettings参数添加用户名密码,未携带合法认证信息的请求会被Elasticsearch直接断开,返回空响应
- 先在本地PC执行带详细输出的curl命令
- 排查索引创建失败问题:
代码中配置NumberOfReplicas = 2,如果AKS上部署的是单节点Elasticsearch集群,索引创建时要求2个副本会直接触发创建失败,单节点环境需要将副本数改为0,或保证集群至少有3个可分配分片的合格节点。 - 开启Serilog自诊断定位具体错误:
在应用启动代码中添加Serilog内部日志输出,可直接看到写入Elasticsearch的具体报错,无需盲目排查:Serilog.Debugging.SelfLog.Enable(msg => File.AppendAllText("serilog-internal-errors.log", msg));
内容的提问来源于stack exchange,提问作者Vladimir Petukhov
相关产品推荐
相关产品推荐

