๋๊ตฌ๋ ํ๋ฒ ์ฏค์ ์๋ขฐ๋ฉ๊ฑฐ์ ๊ณ ์์ด์ ๋ํด์ ๋ค์๊ฑฐ๋ ๊ด๋ จ ๋ฐ์ ๋ณด์ จ์ ๊ฒ๋๋ค.
๊ทธ๋๋ ํน์ ๋ชจ๋ฅด์๋ ๋ถ๋ค์ ์ํด ๊ฐ๋จํ ์๋ ค๋๋ฆฌ์ฃ .
๊ณ ์์ด๋ฅผ ๋ณด์ด์ง ์๋ ์์์ ๋ฃ๊ณ , ๊ทธ ์์ 50:50 ํ๋ฅ ๋ก ๊ณ ์์ด๋ฅผ ์ฃฝ์ด๋ ๋ ๊ทน๋ฌผ์ ๋ฃ์์ ๋ ๊ณ ์์ด๋ ์ฃฝ์๊น์? ์ด๊น์?
์ผ๋ฐ ์ธ๊ณ์์๋ ์ฃฝ์๋ค, ์ด์๋ค ๋ผ๊ณ ํํํ์ง๋ง ์์์ญํ ์ธ๊ณ์์๋ ์ด๋ฅผ ์ฃฝ์๊ณผ ์ถ์ด ์ค์ฒฉ๋ ์ํ๋ผ๊ณ ํํํฉ๋๋ค.
์ฆ, ์ด์์์ผ๋ฉด์ ์ฃฝ์ด์๋ค ๋ผ๊ณ ํฉ๋๋ค.
์ค๋ ๊ธ์์ ์๊ฐํ Fargate (ํ๊ฒ์ดํธ) ๋ํ ์๋ขฐ๋ฉ๊ฑฐ์ ๊ณ ์์ด์ ๋น์ทํ ๊ฐ๋ ์ ๋๋ค. (๋๋ง ๊ทธ๋ ๊ฒ ์๊ฐํ ์๋..)
Fargate ๋ ๋ฌด์์ผ๊น?
์ฐ๋ฆฌ๋ ๋ณดํต AWS ๋ฅผ ์ด์ฉํด์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ค๊ณ ํ๋ฉด EC2 ๋ฅผ ํตํด ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์ธ์คํด์ค ๋ด๋ถ์ ์ปจํ ์ด๋๋ ์ง์ ํ๋ก์ธ์ค๋ก ๋์ฐ๊ฒ ๋ฉ๋๋ค.
EC2 ์ธ์คํด์ค ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ธ์คํด์ค ์ ํ์ ์ ํํ๊ณ , ์ปจํ ์ด๋์ ์ผ์ ์ ๊ด๋ฆฌํ๊ณ , ํด๋ฌ์คํฐ ์ฌ์ฉ๋ฅ ์ ์ต์ ํํด์ผํ์ต๋๋ค.
ํ์ง๋ง Fargate ๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ๋ฒ๊ฑฐ๋ก์ด ์์ ์์ ๋ฒ์ด๋ ์ ์์ฃ .
Fargate ๋ํ EC2 ์ธ์คํด์ค์ฒ๋ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋๋ก ์คํ์์ผ์ค๋๋ค. ๋ค๋ง, EC2 ์ ๋ค๋ฅด๊ฒ ์ปจํ ์ด๋๋ฅผ ์คํ์์ผ์ค ์ ์๋ ํ๊ฒฝ์ ํ๋ก๋น์ ๋ ํ ํ์๊ฐ ์์ต๋๋ค. ์ฆ, Fargate ๋ฅผ ์ฌ์ฉํ๋ค๋ฉด ์ธ์คํด์ค ํ๋ก๋น์ ๋ ์์ด ๋ฐ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ปจํ ์ด๋๋ก ์คํ์ํฌ ์ ์์ฃ .
์ฌ๊ธฐ์ ์ด์ง ์ด๋ฐ ์๋ฌธ์ ๊ฐ์ง ์ ์์ต๋๋ค.
์ปจํ ์ด๋๋ฅผ ์คํํ ๊ฐ์ ๋จธ์ ์ด๋ ์ปดํจํ ๋ฆฌ์์ค๊ฐ ์๋๋ฐ ์ด๋ป๊ฒ ๊ทธ๊ฒ ๊ฐ๋ฅํ์ง?
์ฌ์ค Fargate ๋ํ EC2 ์ธ์คํด์ค ์์์ ์คํ๋ฉ๋๋ค. ํ์ง๋ง ์ด ์ธ์คํด์ค๋ ์ฌ์ฉ์๊ฐ ์์ฑํ ๊ฒ์ด ์๋๊ณ , AWS ์์ ๊ด๋ฆฌํ๋ ์ธ์คํด์ค์ ๋๋ค. AWS ๊ฐ ๊ด๋ฆฌํ๋ ์ธ์คํด์ค ์์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๋ ์ธ์คํด์ค๋ฅผ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๋ ๊ฑฐ์ฃ .
์ฌ์ฉ์๊ฐ ์ธ์คํด์ค๋ฅผ ์ง์ ๊ด๋ฆฌ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ง์นจ ์ธ์คํด์ค๊ฐ ์๋ ํ๊ฒฝ์์ ์ปจํ ์ด๋๊ฐ ์คํ๋๋ ๋ฏํ ๋๋์ ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋๋์ AWS ์์ ์๋ฒ๋ฆฌ์ค ๋ผ๊ณ ์ง์นญํ์ฃ .
๋ ธ๋๊ฐ ์๋๋ฐ์ ์์ด์!
๊ทธ๋์ Fargate ๋ ์๋ฒ๋ฆฌ์ค ์ปจํ ์ด๋ ์ปดํจํ ์์ง์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค.
Fargate ์ ์ฅ์ ์ ์๋์ ๊ฐ์ต๋๋ค.
- ์๋ฒ๋ฅผ ๊ด๋ฆฌํ์ง ์๊ณ ๋ ์ปจํ ์ด๋๋ฅผ ๋ฐฐํฌํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค (์ฌ๊ธฐ์ ์๋ฒ๋ EC2)
- ECS, EKS ์ ํธํ๋๋ฉฐ ํ์ํ ์ปจํ ์ด๋(ํ๋) ์ฌ์์ ๋ง๊ฒ ์คํ ๊ฐ๋ฅํ๋ค
- ์ธํ๋ผ๊ฐ ์๋ ์ ํ๋ ์ผ์ด์ ์ ์ง์คํ ์ ์๋ค
EKS ์์์ Fargate
๊ทธ๋ผ ์ค์ ๋ก Fargate ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋ ์ง EKS ํ๊ฒฝ์์ ํ์ธํด๋ณด์ฃ !
๋ ์ธ ๋๋์ฝ๋!
ํ ์คํธ ํ๊ฒฝ
- Terraform v1.2.7
- EKS v1.23
EKS ํ๊ฒฝ์์ Fargate ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด EKS ์์ ํ๋๋ฅผ ์คํ์ํฌ ์ ์๋๋ก IAM Role ์ ์์ฑํ๊ณ , ์ด๋ฅผ Role ์ ๋ถ์ฌํ์ฌ Fargate ํ๋กํ์ ํ์ฑํ ํ๋ฉด ๋ฉ๋๋ค.
Fargate ํ๋กํ์ Fargate ๋ฅผ ์ด์ฉํ์ฌ ํ๋ ๋ฐฐํฌ๋ฅผ ๊ฐ๋ฅ์ผ ํด์ค๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. ์ฌ๊ธฐ ์ฐธ๊ณ
ํ ๋ผํผ์ผ๋ก ์งํํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก AWS ์น์์ ํด์ค ๊ฒ์ ์์ต๋๋ค. EKS ๋ชจ๋์ ์ฐธ์กฐํ๋ ค๋ฉด ์ฌ๊ธฐ !
terraform main.tf ์๋์ ๊ฐ์ด Fargate ํ๋กํ ๊ด๋ จ ๋ถ๋ถ์ ์ถ๊ฐํ์ต๋๋ค.
# Active Fargate Profile
fargate_profiles = {
default = {
name = "default"
selectors = [
{
namespace = "default"
labels = {
WorkerType = "fargate"
}
}
]
tags = {
Owner = "kingbj0429"
}
timeouts = {
create = "20m"
delete = "20m"
}
}
}
์ดํ terraform apply ๋ฅผ ํตํด EKS ์ ์ ์ฉ์์ผ๋ณด์ฃ .
Fargate ํ๋กํ์ ํ์ํ IAM Role ์ด ์์ฑ๋์๊ณ ,
# module.eks.module.fargate_profile["default"].aws_iam_role_policy_attachment.this["arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy"] will be created
+ resource "aws_iam_role_policy_attachment" "this" {
+ id = (known after apply)
+ policy_arn = "arn:aws:iam::aws:policy/AmazonEKSFargatePodExecutionRolePolicy"
+ role = (known after apply)
}
# module.eks.module.fargate_profile["default"].aws_iam_role_policy_attachment.this["arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"] will be created
+ resource "aws_iam_role_policy_attachment" "this" {
+ id = (known after apply)
+ policy_arn = "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy"
+ role = (known after apply)
}
# module.eks.module.fargate_profile["default"].aws_iam_role.this[0] will be created
+ resource "aws_iam_role" "this" {
+ arn = (known after apply)
+ assume_role_policy = jsonencode(
{
+ Statement = [
+ {
+ Action = "sts:AssumeRole"
+ Effect = "Allow"
+ Principal = {
+ Service = "eks-fargate-pods.amazonaws.com"
}
+ Sid = ""
},
]
+ Version = "2012-10-17"
}
)
+ create_date = (known after apply)
+ description = "Fargate profile IAM role"
+ force_detach_policies = true
+ id = (known after apply)
+ managed_policy_arns = (known after apply)
+ max_session_duration = 3600
+ name = (known after apply)
+ name_prefix = "default-"
+ path = "/"
+ tags = {
+ "Owner" = "kingbj0429"
}
+ tags_all = {
+ "Owner" = "kingbj0429"
}
+ unique_id = (known after apply)
+ inline_policy {
+ name = (known after apply)
+ policy = (known after apply)
}
}
Fargate ํ๋กํ์ด ํ์ฑํ๋์์ต๋๋ค.
# module.eks.module.fargate_profile["default"].aws_eks_fargate_profile.this[0] will be created
+ resource "aws_eks_fargate_profile" "this" {
+ arn = (known after apply)
+ cluster_name = "eks"
+ fargate_profile_name = "default"
+ id = (known after apply)
+ pod_execution_role_arn = (known after apply)
+ status = (known after apply)
+ subnet_ids = [
+ "subnet-xxxx",
+ "subnet-xxxx",
+ "subnet-xxxx",
+ "subnet-xxxx",
]
+ tags = {
+ "Owner" = "kingbj0429"
}
+ tags_all = {
+ "Owner" = "kingbj0429"
}
+ selector {
+ labels = {
+ "WorkerType" = "fargate"
}
+ namespace = "default"
}
+ timeouts {
+ create = "20m"
+ delete = "20m"
}
}
๊ทธ๋ผ ์ค์ ๋ก ์์ฑ๋์๋์ง AWS ์น์์ ํ์ธํด๋ณด๊ฒ ์ต๋๋ค.
์ฐ์ ์์ฑ๋ IAM Role ์ ๋๋ค.
Policy ๋ AmazonEKS_CNI_Policy ์ AmazonEKSFargatePodExecutionRolePolicy ์ ๋๋ค.
์ด ๋๊ฐ์ Policy ๋ AWS ๊ด๋ฆฌํ์ด๊ธฐ ๋๋ฌธ์ AWS ์์ ์ฝ๊ฒ ์ ์ฑ ๋ด์ฉ์ ํ์ธํ ์ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฑ๋ ํ๋กํ์ ํ์ธํด์ค๋๋ค.
ํฌ๋ ์ ํ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
default ๋ค์์คํ์ด์ค์ WorkerType: fargate ๋ ์ด๋ธ์ ๊ฐ์ง ํ๋๋ฅผ ๋ฐฐํฌํ๊ฒ ๋๋ฉด ์์ปค๋ ธ๋๊ฐ ์๋ Fargate ์์ ์คํ๋ฉ๋๋ค.
ํฌ๋ ์ ํ๊ธฐ์ ๊ฐ์ ๊ตฌ์ฑ ์์๋ฅผ ํ์ธํ๋ ค๋ฉด ์ฌ๊ธฐ ์ฐธ์กฐ !
๋ค ์ ์์ ์ผ๋ก ์์ฑ๋ ๊ฒ ๊ฐ์ผ๋ ํ๋ฒ ํ๋๋ ์คํํด๋ณด์ฃ .
๋ค์์คํ์ด์ค๋ default, WorkerType: fargate ๋ ์ด๋ธ์ ๊ฐ์ง๋ ํ๋ yaml ์ ๋๋ค.
apiVersion: v1
kind: Pod
metadata:
creationTimestamp: null
labels:
run: fargate-pod
WorkerType: fargate
name: fargate-pod
spec:
containers:
- image: nginx
name: fargate-pod
resources: {}
dnsPolicy: ClusterFirst
restartPolicy: Always
status: {}
ํน์ด์ ์ด ์๋ค๋ฉด Node ๊ฐ ์์ปค๋ ธ๋๊ฐ ์๋ Fargate ์ ๋๋ค.
EKS ์น์์๋ ๋ ธ๋ ์ ๋ณด์ Fargate ๊ฐ ๋ณด์ ๋๋ค.
์ด๋ ๊ฒ EKS ํด๋ฌ์คํฐ ํ๊ฒฝ์ Fargate ๋ฅผ ์คํ์์ผ๋ณด์์ต๋๋ค.
์ด์ธ ์์๋๋ฉด ์ข์ ์ ๋ณด
๋ฉ๋ชจ๋ฆฌ ์ ํ๊ธฐ
vCPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์กฐํฉ์ ์ง์ ํ์ง ์์ผ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฅ ์์ ์กฐํฉ(.25 vCPU ๋ฐ 0.5GB ๋ฉ๋ชจ๋ฆฌ)์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ฌ๊ธฐ์ฐธ๊ณ
...
annotations:
CapacityProvisioned: 0.25vCPU 0.5GB
...
Fargate ์คํ ๋ฆฌ์ง
ํ๋ก๋น์ ๋๋๋ฉด Fargate์์ ์คํ๋๋ ๊ฐ pod๊ฐ 20GB์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ๊ณ์ธต ์คํ ๋ฆฌ์ง๋ฅผ ๋ฐ์ต๋๋ค. ํฌ๋ ์คํ ๋ฆฌ์ง๋ ํ๋ฐ์ฑ์ ๋๋ค. pod๊ฐ ์ค์ง๋ ํ์๋ ์คํ ๋ฆฌ์ง๊ฐ ์ญ์ ๋ฉ๋๋ค.
AWS EKS์์ Fargate๋ฅผ ์ฌ์ฉํ๋ฉด EBS ๋ณผ๋ฅจ์ ์ง์ ๋ง์ดํธํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ๊ทธ๋ฌ๋ EKS์์๋ Fargate์์ Amazon EFS(Elastic File System)๋ฅผ ๋ง์ดํธํ ์ ์์ต๋๋ค.
Amazon EFS๋ ๊ฐ์ฉ์ฑ๊ณผ ๋ด๊ตฌ์ฑ์ด ๋ฐ์ด๋๋ฉฐ ๋ค์์ Fargate ํ์คํฌ์์ ๋์์ ๊ณต์ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฌ๋ฌ Fargate ํ์คํฌ๊ฐ ๊ณต์ ํ๋ ๋ฐ์ดํฐ๊ฐ ํ์ํ ๊ฒฝ์ฐ์๋ EFS๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๊ทธ๋ฌ๋ EFS๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ์๋ Fargate ํ์คํฌ์์ ์ฌ์ฉํ ์ ์๋ ๋ค๋ฅธ AWS ์คํ ๋ฆฌ์ง ์๋น์ค์ธ Amazon S3 ๋๋ Amazon DynamoDB๋ฅผ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์, EBS๋ฅผ Fargate์์ ๋ง์ดํธํ๋ ค๋ฉด Kubernetes ํด๋ฌ์คํฐ์์ EBS ๋ณผ๋ฅจ์ ๋ง์ดํธํ๊ณ , Fargate๋ฅผ ์ฌ์ฉํ๋ ์ํฌ๋ก๋์ ๋ํด ์ด๋ฅผ ์ฐธ์กฐํ๋ PV์ PVC(Persistent Volume Claim)์ ๋ง๋ค์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Fargate๋ EC2์ ๋ฌ๋ฆฌ ์์ ๋ง๋ค ๊ณ ์ ํ ์ธํ๋ผ๋ฅผ ๊ฐ์ง ์๊ธฐ ๋๋ฌธ์ Fargate์์ EBS๋ฅผ ์ง์ ๋ง์ดํธํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
GPU ๊ธฐ๋ฐ์ Fargate
์์ฝ๊ฒ๋ GPU๋ ํ์ฌ Fargate์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ GPU ๊ธฐ๋ฐ์ ๋ ธ๋๋ฅผ Fargate ์ฒ๋ผ ์ ๋์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด Karpenter ๋ฅผ ์ด์ฉํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ์ค๋์ ์ฌ๊ธฐ๊น์ง!