728x90
반응형
1. EKS 란?
- EKS는 Elastic Kuberneetes Service의 약자로 AWS에서 제공하는 관리형 서비스이며, 컨트롤 플레인 또는 노드를 설치, 운영 및 유지 관리할 필요 없이 Kubernetes 실행 및 사용이 가능하다.
- EKS를 사용하면 컨트롤 플레인을 따로 구성하지 않아도 AWS에서 관리해주기 때문에 간편하게 이용 가능하다.
- 여러 AWS 가용 영역에 걸쳐 컨트롤 플레인을 실행하고 크기를 조정하여 높은 가용성을 보장한다.
- 지원 버전 : 보통 4개의 마이너 버전 지원(현재 1.22~1.26), 평균 3개월마다 새 버전 제공, 각 버전은 12개월 정도 지원
v1.24.2 → Major.Minor.Patch ⇒ Major(Breaking Changes) . Minor(New Features) . Patch(Bug fixes Security)
2. EKS Cluster & Node Group 생성 (w. Terraform)
- EKS를 구축하기 위해서는 EKS Cluster 와 Node Group을 생성하여야 한다.
- EKS 클러스터 생성을 위한 VPC 고려 사항
- VPC는 DNS hostnames와 DNS resolution을 모두 지원하여야 한다. 그렇지 않을 경우 Node Group의 Worker Node가 Cluster에 등록X
Terraform EKS Public module을 사용하여 EKS 구성
- EKS Public module이란 Hashicorp에서 제공해주는 EKS Cluster 및 관련 리소스를 생성할 수 있는 Module이다.
- 참고 링크)https://github.com/terraform-aws-modules/terraform-aws-eks
- 다음과 같은 Code로 EKS를 생성할 수 있다.
- EKS 구성 코드 참고) https://github.com/junho102/DOIK-Study
- 코드 구성은 EKS를 생성하기 위해 VPC 및 Subnet 등을 생성하기 위한 Network Module, EKS를 생성하기 위한 EKS Module 로 구성되어 있다.
2-1) EKS 생성을 위한 VPC 및 네트워크 생성 (Network Module)
코드 참고) https://github.com/junho102/DOIK-Study/blob/main/Network/README.md
- 해당 Network Module 은 3-tier achitecture로 구성되어 있으며, 다음과 같은 code로 해당 모듈 사용이 가능하다.
- 모듈을 실행하고 나면 VPC, Subnet, igw, nat gw, routing 이 생성한다.
module "network" {
source = "./modules/Network"
project_name = "eks"
subnet_name = "sbn"
env = "dev"
vpc_name = "vpc"
igw_name = "igw"
natgw_name = "nat"
rt_name = "rt"
vpc_cidr = "10.0.0.0/16"
pub_cidr = ["10.0.1.0/24", "10.0.2.0/24"]
pri_cidr = ["10.0.3.0/24", "10.0.4.0/24"]
db_cidr = ["10.0.5.0/24", "10.0.6.0/24"]
}
2-2) EKS 생성 (EKS Module)
코드 참고) https://github.com/junho102/DOIK-Study/blob/main/EKS/README.md
- 해당 EKS Module 은 EKS 및 EKS를 접속할 수 있는 bastion server, EKS Add on을 생성한다. (EKS Add on 아래에 설명)
- 다음과 같은 code로 해당 모듈 사용이 가능하다.
module "eks" {
source = "./modules/EKS"
eks_cluster_name = "eks_cluster"
eks_cluster_node_group_name = "eks_cluster-nodegroup"
eks_cluster_version = "1.24"
ec2_key_pair = "my_aws_key"
worker_node_instance_type = ["m5.xlarge"]
worker_node_max_size = 4
worker_node_desired_size = 2
worker_node_min_size = 2
aws_region = "ap-northeast-2"
var_subnet_1_az = "ap-northeast-2a"
var_subnet_2_az = "ap-northeast-2c"
vpc_id = module.network.vpc_id
pri_subnets_ids = module.network.pri_subnet.*.id
pub_subnets_ids = module.network.pub_subnet.*.id
}
- 해당 코드를 실행하여 EKS를 생성하였다면 bastion에 접속하여 다음 명령어를 통해 EKS에 접근하여 Kubernetes를 사용할 수 있다.
aws eks --region $AWS_DEFAULT_REGION update-kubeconfig --name $CLUSTER_NAME --kubeconfig ~/.kube/config
3. EKS Add on 생성 - ebs csi driver & loadbalancer controller (w. Terraform)
3-1) Helm 이란?
- 쿠버네티스 오픈 소스 패키지 매니저로, k8s용으로 구축된 소프트웨어를 제공, 공유 및 사용할 수 있는 기능을 제공한다.
- Helm 은 리소스 집합을 설명하는 파일 모음인 chart라는 패키지 형식을 사용한다.
3-2) Terraform Helm Provider 란?
- IaC 도구인 Terraform은 인프라스트럭처 리소스를 선언할 수 있는 도구로서 다양한 서비스들을 지원하고 있는데 이를 Provider라고 부르며, Helm provider를 사용하면 Kubernetes에 소프트웨어 패키지를 배포하는데 사용할 수 있다.
3-3) ebs csi driver 란?
- EKS Add on 기능으로 AWS EKS 클러스터가 영구 볼륨을 위해 Amazon EBS 볼륨의 수명 주기를 관리할 수 있게 한다.
- 해당 기능을 사용할 수 있는 방안은 2가지이며, EKS Add on 또는 자체 관리형 Add on 으로 EBS CSI Driver를 설치해야 한다.
- ebs csi driver 생성 Terraform Code
- 참고) https://github.com/junho102/DOIK-Study/blob/main/EKS/eks-ebscsidrivercontroller.tf
provider "helm" {
kubernetes {
host = module.eks.cluster_endpoint
cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
token = data.aws_eks_cluster_auth.eks_cluster.token
}
}
locals {
values_aws-ebs-csi-driver = <<VALUES
controller:
extraCreateMetadata: true
serviceAccount:
name: "ebs-csi-driver"
annotations:
eks.amazonaws.com/role-arn: ${module.ebs_csi_driver_controller_iam_role.iam_role_arn}
VALUES
}
resource "helm_release" "ebs_csi_driver" {
count = var.ebs_csi_driver ? 1 : 0
name = "ebs-csi-driver"
namespace = "kube-system"
chart = "aws-ebs-csi-driver"
repository = "https://kubernetes-sigs.github.io/aws-ebs-csi-driver"
values = [
local.values_aws-ebs-csi-driver
]
}
-> 위와 같이 provider helm 블럭을 통해 helm을 사용하며 helm_release 블럭을 통해 ebs csi driver 공식 helm chart로 설치한다.
provider "kubernetes" {
host = module.eks.cluster_endpoint
cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
token = data.aws_eks_cluster_auth.eks_cluster.token
}
resource "kubernetes_storage_class" "aws-ebs-csi-driver-sc-gp3" {
count = var.ebs_csi_drivce_sc_gp3 ? 1 : 0
metadata {
name = "gp3"
}
storage_provisioner = "ebs.csi.aws.com"
volume_binding_mode = "WaitForFirstConsumer"
allow_volume_expansion = true
parameters = merge(
{
type = "gp3"
allowAutoIOPSPerGBIncrease = "true"
encrypted = "true"
}
)
}
-> 위와 같이 provider kubernetes 블럭을 사용하여 terraform code를 통해 k8s에서 지원하는 리소스를 컨트롤 가능하다.
-> kubernetes_storage_class 리소스 블럭을 사용하기 위해서는 provider kubernetes 블럭이 필요하다.
-> kubernetes_storage_class 리소스 블럭을 통해 gp3 타입의 storageClass를 생성한다.
3-4) 생성된 ebs csi driver 및 StorageClass 확인
3-5) Loadbalancer Controller란?
- loadbalancer는 kubernetes 클러스터의 Elastic Load Balancer 관리를 톱는 컨트롤러
- Ingress Type의 리소스를 통해 Application Load Balancer를 프로비저닝
- Service Type의 리소스를 통해 Network Load Balancer를 프로비저닝
- Load Balacner Controller 생성 Terraform Code
resource "helm_release" "helm_AWSLoadBalancerController" {
depends_on = [module.eks]
name = "aws-load-balancer-controller"
repository = "https://aws.github.io/eks-charts"
chart = "aws-load-balancer-controller"
namespace = "kube-system"
set {
name = "image.repository"
value = "602401143452.dkr.ecr.us-east-1.amazonaws.com/amazon/aws-load-balancer-controller"
}
set {
name = "serviceAccount.create"
value = "true"
}
set {
name = "serviceAccount.name"
value = "aws-load-balancer-controller"
}
set {
name = "serviceAccount.annotations.eks\\.amazonaws\\.com/role-arn"
value = aws_iam_role.AWSLoadBalancerController_iam_role.arn
}
set {
name = "vpcId"
value = local.vpc_id
}
set {
name = "region"
value = local.aws_region
}
set {
name = "clusterName"
value = local.eks_cluster_name
}
}
-> 위와 같이 helm_release 리소스 블럭을 통해 aws loadbalancer controller 공식 helm chart로 설치한다.
3-6) 생성된 Load balacer Controller 확인
728x90
반응형
'Terraform' 카테고리의 다른 글
[Terraform] Resource Block 구문 문법(lifecycle, depends_on) (0) | 2024.05.12 |
---|---|
[테라폼] ECS배포 및 revision관리 (1) | 2023.12.03 |
[테라폼] Workflow & gitlab runner 프로비저닝 파이프라인 (0) | 2023.08.20 |
[테라폼] State & Module (1) | 2023.07.29 |
[Terraform] 조건문 - 3항 연산자 (0) | 2023.07.22 |