如何通过k8s注释更新AWS NLB设置以将日志存储在S3存储桶中

问题描述

我想配置AWS NLB以将日志存储在S3存储桶中? 我有

我已将这些注释添加到我的terraform代码中,以将其添加Nginx入口:

set {
  name  = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/aws-load-balancer-access-log-enabled"
  value = "true"
}
set {
  name  = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/aws-load-balancer-access-log-s3-bucket-name"
  value = "nlb-logs-bucket"
}
set {
  name  = "controller.service.annotations.service\\.beta\\.kubernetes\\.io/aws-load-balancer-access-log-s3-bucket-prefix"
  value = "/nlblogs"
}

我看到注释已添加到控制器,但在AWS控制台中,NLB设置没有更改(日志未保存到存储桶中)。

解决方法

我找到了解决方案。希望对大家有帮助。

据我了解,上述注释仅适用于ELB,而不适用于NLB。我试图将EKS更新为1.16和1.17。它适用于ELB,但不适用于NLB。

因此,解决方案是-在Terraform中为k8使用local-exec配置。至少对我有用。

代码如下:

resource "null_resource" "enable_s3_bucket_logging_on_nlb" {
  triggers = { <TRIGGERS> }
  provisioner "local-exec" {
    command = <<EOS
for i in $(aws elbv2 describe-load-balancers --region=<REGION> --names=$(echo ${data.kubernetes_service.nginx_ingress.load_balancer_ingress.0.hostname} |cut -d- -f1) | \
jq ".[][] | { LoadBalancerArn: .LoadBalancerArn }" |awk '{print $2}' |tr -d '"'); do \
aws elbv2 modify-load-balancer-attributes --region=<REGION> --load-balancer-arn $i --attributes Key=access_logs.s3.enabled,Value=true \
Key=access_logs.s3.bucket,Value=nlb-logs-bucket Key=access_logs.s3.prefix,Value=nlblogs;\
done; \
EOS
  }
}

其中:

  • -触发条件
  • -您的NLB区域
,

我非常喜欢上面的答案 - 我只是修改了 terraform 代码以减少对任何 cli 处理的依赖:

data "kubernetes_service" "nginx" {
  metadata {
    name      = "${local.k8s_nginx_name}-controller"
    namespace = local.k8s_nginx_namespace
  }
}

locals {
  nlb_hostname = data.kubernetes_service.nginx.status.0.load_balancer.0.ingress.0.hostname
  nlb_name     = split("-",local.nlb_hostname)[0]

  # S3 log bucket needs:
  #  https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-access-logs.html#access-logging-bucket-permissions
  nlb_attributes_json = jsonencode([
    { Key = "deletion_protection.enabled",Value = "true" },{ Key = "load_balancing.cross_zone.enabled",{ Key = "access_logs.s3.enabled",{ Key = "access_logs.s3.bucket",Value = var.s3_log_name },{ Key = "access_logs.s3.prefix",Value = "nlblogs" },])
}

data "aws_lb" "nginx-nlb" {
  name = local.nlb_name
}

resource "null_resource" "enable_s3_bucket_logging_on_nlb" {
  triggers = {
    nlb_arn             = data.aws_lb.nginx-nlb.arn
    nlb_attributes_json = local.nlb_attributes_json
  }
  provisioner "local-exec" {
    command = <<EOS
    aws elbv2 modify-load-balancer-attributes \
      --region=${var.aws_region} \
      --load-balancer-arn ${data.aws_lb.nginx-nlb.arn} \
      --attributes '${local.nlb_attributes_json}'\
    EOS
  }
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...