[AWS EKS] CoreDNS Addon을 FARGATE로 띄우기 (w. Terraform)
# 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
를 수정해줘야 한다.
끝!