728x90
EKS 생성 방법
- AWS Console GUI 환경에서 생성
- IaC를 통해 생성 (Cloud Formation, AWS CDK, RANCHER)
- 전용 명령 tool (eksctl)
- AWS Console GUI
- 장점 : GUI에서 클릭클릭으로 생성하므로 매우 쉽다
- 단점 : 별도 로그, 코드를 남기기 않기 때문에 이력 확인이 어렵다. (콘솔 상의 설정 값으로 유추해야함)
- EKSCTL 사용
- 장점 : Conosle과 마찬가지로 배포가 쉽다. 코드로 이력을 남길 수 있어 관리가 수월하다.
- 단점 : EKS에만 타겟된 도구이므로 AWS 자원 전체를 관리하기에는 불편하다.
- IaC 사용
- Terraform : 전체적인 사용 빈도가 가장 많고 대중화되어 있으며, EKS 생성이 간편하도록 별도 모듈도 제공한다.
- CDK : Terraform은 자체 언어를 통해서만 사용할 수 있지만 TS, JS, Python, GO에 녹일 수 있다. 배포하면 AWS CloudFormation에서 치환해서 자원이 생성된다.
단, AWS에 대한 전반적인 이해가 반드시 필요하다.
- AWS Console GUI
Terraform으로 EKS 생성하기
※ VPC와 같은 Network 설정은 완료되어 있는 상태로 가정하고, EKS만 Terraform으로 생성
- 사전 준비
- AWS 계정
- IAM User 생성
- IDE
- Kubectl
- github 계정
Terraform file tree는 아래와 같으며, Terraform의 EKS 모듈을 이용하여 생성함
- Module 사용을 위한 기본 설정
- backend.tf 파일
# tfstate를 저장할 s3를 지정
terraform {
backend "s3" {
bucket = "tf-state"
key = "terraform.state"
region = "ap-northeast-2"
profile = "hoon"
}
}
- data.tf 파일
# AWS config를 처리하기 위한 설정
data "aws_caller_identity" "current" {}
- main.tf 파일
module "eks" {
# eks 모듈에서 사용할 변수 정의
source = "./modules/eks-cluster"
cluster_name = "hoon-cluster"
cluster_version = "1.24" ## CRI가 Containerd로 변경된 버전으로 지정함
vpc_id = "<VPCID>"
private_subnets = ["<private-subnetID-1>", "<private-subnetID-2>"]
public_subnets = ["<public-subnetID-1>", "<public-subnetID-2>"]
- output.tf
# 모듈의 응답값 출력
output "cluster_id" {
value = module.eks.cluster_id
}
output "cluster_primary_security_group_id" {
value = module.eks.cluster_primary_security_group_id
- provider.tf
# terraform 버전 및 Provider 설정
terraform {
required_version = "~> 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.46"
}
}
}
provider "aws" {
profile = "hoon"
region = "ap-northeast-2"
}
modules/eks-cluster 하위 파일 코드
- data.tf
# 변수 처리
data "aws_eks_cluster" "cluster" {
name = module.eks.cluster_id
}
data "aws_eks_cluster_auth" "cluster" {
name = module.eks.cluster_id
}
data "aws_caller_identity" "current" {}
data "aws_partition" "current" {}
data "aws_availability_zones" "available" {}
data "aws_ecrpublic_authorization_token" "token" {
provider = aws.virginia
- main.tf
locals {
cluster_name = var.cluster_name
cluster_version = var.cluster_version
region = "ap-northeast-2"
vpc_id = var.vpc_id
public_subnets = var.public_subnets
private_subnets = var.private_subnets
tag = {
Environment = "test"
Terraform = "true"
}
}
module "eks" {
# <https://registry.terraform.io/modules/terraform-aws-modules/eks/aws/latest>
source = "terraform-aws-modules/eks/aws"
version = "18.31.0"
# Cluster Name Setting
cluster_name = local.cluster_name
cluster_version = local.cluster_version
# Cluster Endpoint Setting
cluster_endpoint_private_access = true
cluster_endpoint_public_access = true
# Network Setting
vpc_id = local.vpc_id
subnet_ids = local.private_subnets
# IRSA Enable / OIDC 구성
enable_irsa = true
node_security_group_additional_rules = {
ingress_nodes_karpenter_port = {
description = "Cluster API to Node group for Karpenter webhook"
protocol = "tcp"
from_port = 8443
to_port = 8443
type = "ingress"
source_cluster_security_group = true
}
}
# Tag Node Security Group
node_security_group_tags = {
"karpenter.sh/discovery" = local.cluster_name
}
eks_managed_node_groups = {
initial = {
instance_types = ["t3.large"]
create_security_group = false
create_launch_template = false # do not remove
launch_template_name = "" # do not remove
min_size = 2
max_size = 3
desired_size = 2 # worker node 수
iam_role_additional_policies = [
# Required by Karpenter
"arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
]
}
}
# console identity mapping (AWS user)
# eks configmap aws-auth에 콘솔 사용자 혹은 역할을 등록
manage_aws_auth_configmap = true
aws_auth_users = [
{
userarn = "arn:aws:iam::<aws어카운트id>:user/admin"
username = "admin"
groups = ["system:masters"]
},
]
aws_auth_accounts = [
"<aws어카운트id>"
]
}
## 프라이빗 서브넷 태그
resource "aws_ec2_tag" "private_subnet_tag" {
for_each = toset(local.private_subnets)
resource_id = each.value
key = "kubernetes.io/role/internal-elb"
value = "1"
}
resource "aws_ec2_tag" "private_subnet_cluster_tag" {
for_each = toset(local.private_subnets)
resource_id = each.value
key = "kubernetes.io/cluster/${local.cluster_name}"
value = "owned"
}
resource "aws_ec2_tag" "private_subnet_karpenter_tag" {
for_each = toset(local.private_subnets)
resource_id = each.value
key = "karpenter.sh/discovery/${local.cluster_name}"
value = local.cluster_name
}
## 퍼블릭 서브넷 태그
resource "aws_ec2_tag" "public_subnet_tag" {
for_each = toset(local.public_subnets)
resource_id = each.value
key = "kubernetes.io/role/elb"
value = "1"
}%
</aws어카운트id></aws어카운트id>
- output.tf
output "cluster_id" {
value = module.eks.cluster_id
}
output "cluster_primary_security_group_id" {
value = module.eks.cluster_primary_security_group_id
}
- provider.tf
terraform {
required_version = "~> 1.0"
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.46"
}
helm = {
source = "hashicorp/helm"
version = "~> 2.5"
}
kubectl = {
source = "gavinbunney/kubectl"
version = "~> 1.14"
}
}
}
provider "aws" {
profile = "fastc"
region = "us-east-1"
alias = "virginia"
}
provider "kubernetes" {
host = data.aws_eks_cluster.cluster.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority.0.data)
token = data.aws_eks_cluster_auth.cluster.token
}
provider "helm" {
kubernetes {
host = data.aws_eks_cluster.cluster.endpoint
cluster_ca_certificate = base64decode(data.aws_eks_cluster.cluster.certificate_authority[0].data)
token = data.aws_eks_cluster_auth.cluster.token
}
}
provider "kubectl" {
apply_retry_count = 5
host = module.eks.cluster_endpoint
cluster_ca_certificate = base64decode(module.eks.cluster_certificate_authority_data)
load_config_file = false
exec {
api_version = "client.authentication.k8s.io/v1beta1"
command = "aws"
args = ["eks", "get-token", "--cluster-name", module.eks.cluster_id]
}
}
- variables.tf
variable "cluster_name" {
}
variable "cluster_version" {
}
variable "vpc_id" {
}
variable "public_subnets" {
}
variable "private_subnets" {
}
- EKS Config update
aws eks --region ap-northeast-2 update-kubeconfig --name hoon-cluster --profile hoon
728x90
'Cloud > AWS' 카테고리의 다른 글
[AWS] Terraform으로 Karpenter 설치하고 노드 증설하기 (2) | 2024.11.05 |
---|---|
[AWS] Oracle RDS 엔진 업그레이드 하기 (0) | 2024.07.17 |