You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
});
问题原因与排查解决步骤
  • 优先修正配置中的拼写错误,这类低级错误会直接导致功能失效:
    1. Serilog配置节点的MinimiumLevel拼写错误,正确名称为MinimumLevel
    2. 日志级别覆盖节点Ovveride拼写错误,正确名称为Override
    3. Elasticsearch服务地址中的elasic拼写错误,正确应为elastic,地址拼写错误会直接导致请求发送到错误目标
  • 排查协议与连通性问题:
    1. 先在本地PC执行带详细输出的curl命令curl -v 修正后的Elasticsearch地址,验证连通性:如果返回空响应,先确认AKS对外暴露Elasticsearch的服务类型(LoadBalancer/Ingress)对应的NSG网络安全组是否放通本地出口IP,负载均衡规则是否正确映射9200端口
    2. 核对协议:如果部署的Elasticsearch默认未开启HTTPS,需要把配置里的URI头从https://改为http://,强制HTTPS访问HTTP端口会触发SSL握手失败,直接返回空响应;如果是自签名证书,测试环境可在ElasticsearchSink配置中添加DisableCertificateValidation = true跳过证书校验,生产环境建议替换为受信任的CA签发证书
    3. 检查认证配置:如果Elasticsearch开启了基础认证,需要在Sink配置中通过ModifyConnectionSettings参数添加用户名密码,未携带合法认证信息的请求会被Elasticsearch直接断开,返回空响应
  • 排查索引创建失败问题:
    代码中配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 02:48:32