簡體   English   中英

如何通過 k8s 注釋更新 AWS NLB 設置以將日志存儲在 S3 存儲桶中

[英]How to update AWS NLB setting to store logs in S3 bucket by k8s annotations

我想配置 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"
}

我看到注釋已添加到 controller,但在 AWS 控制台中 NLB 設置沒有更改(日志未保存到存儲桶)。

我找到了解決方案。 我希望,它會幫助任何人。

據我了解,上面提到的注釋僅適用於ELB,不適用於NLB。 我嘗試將 EKS 更新到 1.16 和 1.17。 它適用於 ELB,但不適用於 NLB。

因此,解決方案是 - 在 Terraform 中為 k8s 使用 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
  }
}

在哪里:

  • <TRIGGERS> - 觸發條件
  • <REGION> - 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", Value = "true" },
    { Key = "access_logs.s3.enabled", Value = "true" },
    { 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
  }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM