공부/AWS

[AWS EKS] CoreDNS Addon을 FARGATE로 띄우기 (w. Terraform)

haejang 2024. 4. 28. 23:20
728x90
728x90

 

 

# 0. 서론

eks의 모든 노드들을 카펜터로 띄우기 시작했다.

카펜터가 아닌 노드가 없기 때문에 karpenter 자체는 fargate로 띄워야만 했다.

여기까지는 managed node group > karpenter로 마이그레이션하다가 알게 된 것이고..

 

카펜터만 띄우는 설정으로 새로 클러스터를 띄우다보니 coredns가 karpenter보다 먼저 떠야 한다는 것을 알게 되었다.

(카펜터도 내부 dns에 의존하는 무언가가 있나보다. 더 자세히 알아보진 않았다.)

 

따라서 karpenter와 마찬가지로 coredns도 fargate로 띄우도록 설정을 변경하게 되었다.

이 때 필요한 과정을 terraform으로 설명하겠다.

 

# 1. coredns fargate profile 생성

locals {
  cluster_name       = <클러스터 이름>
  fargate_subnet_ids = <fargate용 subnet id list>
  
  fargate_policy_list = [
    "AmazonEKS_CNI_Policy",
    "AmazonEKSFargatePodExecutionRolePolicy"
  ]
  
  module_tag = {} # 필요한 태그 추가
}

################################################################################
# IAM Role for FARGATE
################################################################################
## Create Assume Policy
data "aws_iam_policy_document" "this" {
  statement {
    effect  = "Allow"
    actions = ["sts:AssumeRole"]
    
    principals {
      type        = "Service"
      identifiers = ["eks-fargate-pods.amazonaws.com"]
    }
  }
}

## Create IAM Role
resource "aws_iam_role" "this" {
  name        = local.name
  description = local.tf_desc
  
  assume_role_policy    = data.aws_iam_policy_document.this.json
  force_detach_policies = true
  
  tags = local.module_tag
}

## Search IAM Policies
data "aws_iam_policy" "this" {
  for_each = toset(local.fargate_policy_list)
  name     = each.value
}

## Attach IAM Role - Policies
resource "aws_iam_role_policy_attachment" "this" {
  for_each = toset(local.fargate_policy_list)
  
  policy_arn = data.aws_iam_policy.this[each.key].arn
  role       = aws_iam_role.this.name
}

################################################################################
# Create Fargate Profile
################################################################################
resource "aws_eks_fargate_profile" "coredns" {
  cluster_name           = local.cluster_name
  fargate_profile_name   = "fargate-coredns"
  pod_execution_role_arn = aws_iam_role.this.arn
  subnet_ids             = local.fargate_subnet_ids

  selector {
    namespace = "kube-system"
    labels = {
      "k8s-app" = "kube-dns"
    }
  }

  tags = local.module_tag
}

 

실제 쓰던 코드를 조금 수정해서 가져와봤다.

fargate용 role은 만들 줄 모르는 사람도 있을 것 같아서 일단 코드에 포함시켰는데, 중요한건 fargate_profile 리소스의 selector이다.

coredns는 "k8s-app" = "kube-dns" 말고는 특별한 label이 없기 때문에 저거로 selector 를 걸어줘야 한다.

 

# 2. (필요한 경우) 보안그룹 설정

카펜터로 띄운 노드들 -> coredns (fargate)로 dns 질의가 가능해야 한다.

이미 열려있으면 상관없는데, fargate node의 보안그룹은 "클러스터 보안그룹" 이니까 참조하자.

(-> 이전 글 참조 : [AWS EKS] 클러스터 보안그룹 vs 추가 보안그룹 (Cluster SG vs Additional SG))

resource "aws_security_group_rule" "node_to_cluster" {
  security_group_id = aws_eks_cluster.this.vpc_config[0].cluster_security_group_id

  type                     = "ingress"
  from_port                = 0
  to_port                  = 0
  protocol                 = "all"
  source_security_group_id = <카펜터 노드의 sg id>
  description              = "NodeSG"
}

 

뭐 dns port만 열어줄수도 있겠지만.. 노드 <-> 클러스터 사이는 그냥 다 뚫어놔도 된다고 생각하기 때문에 화끈하게 all로 열어주었다.

 

# 3. coredns configuration 수정

locals {
  cluster_name    = <클러스터 이름>
  cluster_version = <클러스터 버전>
  
  module_tag = {} # 필요한 태그 추가
}

# 권장 버전 사용하는 방법
data "aws_eks_addon_version" "this" {
  addon_name         = "coredns"
  kubernetes_version = local.cluster_version
}

resource "aws_eks_addon" "this" {
  cluster_name                = local.cluster_name
  addon_name                  = "coredns"
  addon_version               = data.aws_eks_addon_version.this.version
  resolve_conflicts_on_update = "PRESERVE"
  configuration_values = jsondecode({
    computeType = "Fargate"
  })
  tags = local.module_tag
}

 

버전은 사실 그냥 알아서 하면 되고... 

eks_addon 리소스에서 configuration_values를 수정해줘야 한다.

 

 

끝!

 

 

728x90
728x90