ECS vs EKS: AWS 컨ν μ΄λ μλΉμ€ μ ν κ°μ΄λ
ν΄λΌμ°λ νκ²½μμ 컨ν μ΄λνλ μ ν리μΌμ΄μ μ λ°°ν¬νκ³ κ΄λ¦¬νλ κ²μ νλμ μΈ μννΈμ¨μ΄ κ°λ°μ ν΅μ¬μ λλ€. AWSμμ μ 곡νλ λ κ°μ§ μ£Όμ 컨ν μ΄λ μ€μΌμ€νΈλ μ΄μ μλΉμ€μΈ ECSμ EKS μ€ μ΄λ€ κ²μ μ νν΄μΌ ν μ§ κ³ λ―Όμ΄μ κ°μ?
κ° μλΉμ€λ κ³ μ ν μ₯μ κ³Ό νΉμ§μ κ°μ§κ³ μμΌλ©°, νλ‘μ νΈμ κ·λͺ¨, νμ μ λ¬Έμ±, μ₯κΈ°μ μΈ λͺ©νμ λ°λΌ μ΅μ μ μ νμ΄ λ¬λΌμ§λλ€. μ΄ κΈμμλ λ μλΉμ€μ ν΅μ¬ μ°¨μ΄μ μ λͺ νν λΆμνκ³ , μ€λ¬΄μμ μ΄λ€ μν©μμ μ΄λ€ μλΉμ€λ₯Ό μ νν΄μΌ νλμ§ κ΅¬μ²΄μ μΈ κ°μ΄λλ₯Ό μ 곡ν©λλ€.
컨ν μ΄λνμ μ€μΌμ€νΈλ μ΄μ μ κΈ°λ³Έ κ°λ
컨ν μ΄λνλ μ ν리μΌμ΄μ κ³Ό κ·Έ μμ‘΄μ±μ νλμ ν¨ν€μ§λ‘ λ¬Άμ΄ μ΄λ€ νκ²½μμλ μΌκ΄λκ² μ€νν μ μλλ‘ νλ κΈ°μ μ λλ€. Dockerμ κ°μ 컨ν μ΄λ κΈ°μ μ ν΅ν΄ κ°λ°μλ€μ "λ΄ μ»΄ν¨ν°μμλ λλλ°"λΌλ λ¬Έμ λ₯Ό ν΄κ²°ν μ μκ² λμμ£ .
νμ§λ§ μ€μ νλ‘λμ νκ²½μμλ μμ, μλ°± κ°μ 컨ν μ΄λλ₯Ό κ΄λ¦¬ν΄μΌ νλ μν©μ΄ λ°μν©λλ€. μ΄λ νμν κ²μ΄ λ°λ‘ 컨ν μ΄λ μ€μΌμ€νΈλ μ΄μ μ λλ€. 컨ν μ΄λ μ€μΌμ€νΈλ μ΄μ μ 컨ν μ΄λμ λ°°ν¬, μ€μΌμΌλ§, λ€νΈμνΉ, κ°μ©μ±μ μλμΌλ‘ κ΄λ¦¬νλ μμ€ν μ λ§ν©λλ€.
컨ν μ΄λ μ€μΌμ€νΈλ μ΄μ μ μ£Όμ κΈ°λ₯μ λ€μκ³Ό κ°μ΅λλ€:
- 컨ν μ΄λμ μλ λ°°ν¬ λ° κ΅μ²΄
- λ‘λ λ°Έλ°μ±κ³Ό μλΉμ€ λμ€μ»€λ²λ¦¬
- μ€ν λ¦¬μ§ μ€μΌμ€νΈλ μ΄μ
- μλνλ λ‘€μμκ³Ό λ‘€λ°±
ECS (Elastic Container Service) μ¬ν μ΄ν΄
AWS ECSλ AWSμμ κ°λ°ν μμ κ΄λ¦¬ν 컨ν μ΄λ μ€μΌμ€νΈλ μ΄μ μλΉμ€μ λλ€. Dockerλ₯Ό μ§μνλ©°, AWS μνκ³μμ κΈ΄λ°ν ν΅ν©μ΄ κ°μ₯ ν° νΉμ§μ΄μμ.
ECSμ ν΅μ¬ κ΅¬μ± μμ
νμ€ν¬(Task)λ ECSμμ 컨ν μ΄λκ° λμνλ μ΅μ μ€ν λ¨μμ λλ€. νλ μ΄μμ 컨ν μ΄λλ‘ κ΅¬μ±λλ©°, μ€μ μ ν리μΌμ΄μ μ΄ μ€νλλ μ»΄ν¬λνΈλΌκ³ μκ°νμλ©΄ λ©λλ€.
νμ€ν¬ μ μ(Task Definition)λ νμ€ν¬λ₯Ό μμ±νλ JSON νμμ ν νλ¦Ώμ λλ€. λ°°ν¬ν 컨ν μ΄λ μ΄λ―Έμ§, ν λΉν CPUμ λ©λͺ¨λ¦¬, IAM μν , CloudWatch Logs μ€μ λ±μ μ μν©λλ€:
{
"family": "my-app",
"taskRoleArn": "arn:aws:iam::123456789012:role/ECSTaskRole",
"networkMode": "awsvpc",
"containerDefinitions": [
{
"name": "web-server",
"image": "nginx:latest",
"memory": 512,
"cpu": 256,
"essential": true,
"portMappings": [
{
"containerPort": 80,
"protocol": "tcp"
}
]
}
]
}
**μλΉμ€(Service)**λ μ§μ λ μλ§νΌμ νμ€ν¬λ₯Ό μ μ§νλ μ€μΌμ€λ¬ μν μ ν©λλ€. νμ€ν¬κ° μ’ λ£λλ©΄ μλμΌλ‘ μλ‘μ΄ νμ€ν¬λ₯Ό μμ±ν΄ μνλ μνλ₯Ό μ μ§νμ£ .
**ν΄λ¬μ€ν°(Cluster)**λ μλΉμ€μ νμ€ν¬λ₯Ό μ€ννλ λ Όλ¦¬μ κ·Έλ£Ήμ λλ€. EC2 μΈμ€ν΄μ€λ Fargateλ₯Ό ν΅ν΄ μ€μ μ»΄ν¨ν 리μμ€λ₯Ό μ 곡λ°μ΅λλ€.
ECSμ μ£Όμ μ₯μ
ECSλ AWS μ½μμμ 볡μ‘ν YAML κ΅¬μ± μμ΄ κ°λ¨ν μ€μ λ§μΌλ‘ 컨ν μ΄λλ₯Ό λ°°ν¬ν μ μμ΅λλ€. CodePipeline, CloudWatch κ°μ AWS μλΉμ€μμ ν΅ν©μ΄ λ§€μ° μννλ©°, μ΄μ μλνμ λͺ¨λν°λ§μ΄ μ¬μμ§λλ€.
νΉν Fargateλ₯Ό μ§μνλ―λ‘ μΈνλΌλ₯Ό μ§μ κ΄λ¦¬νμ§ μκ³ λ 컨ν μ΄λλ₯Ό μ€νν μ μμ΄ μ΄μ λΆλ΄μ΄ ν¬κ² μ€μ΄λλλ€. ν΄λ¬μ€ν° κ΄λ¦¬ λΉμ©μ΄ μκ³ μ λ°μ μΈ κ΄λ¦¬ ν¨μ¨μ±μ΄ λλ€λ μ λ ν° λ§€λ ₯μ΄μμ.
EKS (Elastic Kubernetes Service) μ¬ν μ΄ν΄
AWS EKSλ AWSμμ μ 곡νλ μμ κ΄λ¦¬ν μΏ λ²λ€ν°μ€ μλΉμ€μ λλ€. μ€νμμ€ μΏ λ²λ€ν°μ€λ₯Ό κΈ°λ°μΌλ‘ νμ¬ μΏ λ²λ€ν°μ€ μνκ³μ λͺ¨λ λꡬμ κΈ°λ₯μ νμ©ν μ μμ΅λλ€.
EKSμ ν΅μ¬ κ΅¬μ± μμ
μΏ λ²λ€ν°μ€ μ μ΄ νλ μΈ(Control Plane)μ ν΄λ¬μ€ν°μ μ λ°μ μΈ κ΄λ¦¬λ₯Ό λ΄λΉνλ ν΅μ¬ κ΅¬μ± μμμ λλ€. API μλ², etcd, μ€μΌμ€λ¬, 컨νΈλ‘€λ¬ λ§€λμ λ±μ΄ ν¬ν¨λλ©°, EKSμμλ AWSκ° μ΄λ₯Ό μμ ν κ΄λ¦¬ν©λλ€.
μ컀 λ Έλ(Worker Nodes)λ μ€μ μν¬λ‘λκ° μ€νλλ κ³³μ λλ€. EC2 μΈμ€ν΄μ€λ‘ ꡬμ±νκ±°λ Fargateλ₯Ό μ νν μ μμ΄μ:
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: app-container
image: my-app:latest
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"
ports:
- containerPort: 8080
EKSμ μ£Όμ μ₯μ
EKSμ κ°μ₯ ν° μ₯μ μ μΏ λ²λ€ν°μ€ μνκ³μ μμ ν νμ©μ λλ€. Helm, Istio, Prometheus κ°μ λ€μν λꡬλ€μ μμ λ‘κ² μ¬μ©ν μ μμ΄μ. AWSκ° κ΄λ¦¬νλ κ³ κ°μ©μ± μ μ΄ νλ μΈμΌλ‘ μ΄μ νΈμμ±κ³Ό μλΉμ€ μμ μ±μ΄ λ°μ΄λ©λλ€.
λν EC2 κΈ°λ° λ Έλ μ΄μμ΄λ Fargateλ₯Ό ν΅ν μλ²λ¦¬μ€ λ°©μ μ€μμ μ νν μ μλ μ μ°μ±μ μ 곡ν©λλ€. 볡μ‘ν λ§μ΄ν¬λ‘μλΉμ€ ꡬ쑰λ λκ·λͺ¨ μΈνλΌ νκ²½μ μ ν©ν νμ₯μ±κ³Ό μΈλ°ν μ μ΄ κΈ°λ₯μ κ°μΆκ³ μμ΅λλ€.
ECSμ EKSμ ν΅μ¬ μ°¨μ΄μ
μ μ΄ νλ μΈ κ΄λ¦¬ λ°©μ
ECSλ AWSμμ μ체 κ°λ°ν μ€μΌμ€νΈλ μ΄μ μμ§μ μ¬μ©νλ―λ‘ μ€μ μ΄ μλμ μΌλ‘ κ°λ¨ν©λλ€. λ°λ©΄ EKSλ μΏ λ²λ€ν°μ€μ μ μ΄ νλ μΈμ AWSκ° κ΄λ¦¬νμ§λ§, μΏ λ²λ€ν°μ€ μ체μ 볡μ‘μ±μ μ¬μ ν μ‘΄μ¬ν©λλ€.
μ€μΌμ€νΈλ μ΄μ λ°©μ
ECSλ AWS κ³ μ μ μ€μΌμ€νΈλ μ΄μ λ°©μμ μ¬μ©νλ©°, AWS μλΉμ€μμ ν΅ν©μ μ΅μ νλμ΄ μμ΅λλ€. EKSλ μΏ λ²λ€ν°μ€ νμ€μ λ°λ₯΄λ―λ‘ λ€λ₯Έ μΏ λ²λ€ν°μ€ νκ²½κ³Ό νΈνμ±μ΄ λ°μ΄λμ£ .
μνκ³μ λꡬ μ§μ
EKSλ λ°©λν μΏ λ²λ€ν°μ€ μνκ³λ₯Ό νμ©ν μ μμ§λ§, ECSλ AWS μ€μ¬μ μΈ λꡬμ μλΉμ€μ μμ‘΄ν©λλ€. μ΄λ μ νμ νμμλ EKSκ° μ 리νμ§λ§, AWS λ΄μμμ ν΅ν©μ±μμλ ECSκ° λ μ°μν©λλ€.
ECSλ₯Ό μ νν΄μΌ νλ κ²½μ°
μ μμ±κ³Ό λ¨μν¨μ΄ μ°μ μΈ νλ‘μ νΈ
μ€ννΈμ μ΄λ κ°λ¨ν ꡬ쑰μ μλΉμ€λΌλ©΄ ECSκ° μ ν©ν©λλ€. λͺ μκ° λ§μ 컨ν μ΄λ κΈ°λ° μλΉμ€λ₯Ό λ°°ν¬ν μ μμ μ λλ‘ λΉ λ₯΄κ³ κ°λ¨ν΄μ.
νμ€ν¬ μ μλ₯Ό μμ±ν ν λ°λ‘ μ€ννκΈ°λ§ νλ©΄ λλ λ¨μν¨μ΄ ν° μ₯μ μ λλ€:
# ECSμμ μλΉμ€ μμ± μμ
aws ecs create-service \
--cluster my-cluster \
--service-name my-service \
--task-definition my-app:1 \
--desired-count 2
AWS μνκ³ μ€μ¬μ κ°λ° νκ²½
μ΄λ―Έ AWS μλΉμ€λ₯Ό κ΄λ²μνκ² μ¬μ©νκ³ μλ€λ©΄ ECSμ ν΅ν© μ΄μ μ μ΅λν νμ©ν μ μμ΅λλ€. CodePipelineμ ν΅ν CI/CD, CloudWatchλ₯Ό ν΅ν λͺ¨λν°λ§, IAMμ ν΅ν κΆν κ΄λ¦¬κ° λ§€λλ½κ² μ°λλ©λλ€.
λΉμ© ν¨μ¨μ±μ΄ μ€μν μκ·λͺ¨ λ°°ν¬
ν΄λ¬μ€ν° κ΄λ¦¬ λΉμ©μ΄ μμ΄ μκ·λͺ¨ λ°°ν¬μμ λΉμ© ν¨μ¨μ μ λλ€. Fargateλ₯Ό μ ννλ©΄ μ΄μλΉμ©κΉμ§ μ€μΌ μ μμ΄ κΈ°λ₯ κ°λ°μλ§ μ§μ€ν μ μμ΄μ.
EKSλ₯Ό μ νν΄μΌ νλ κ²½μ°
κΈ°μ‘΄ μΏ λ²λ€ν°μ€ μμ°μ ν΄λΌμ°λ λ§μ΄κ·Έλ μ΄μ
μ¨νλ λ―Έμ€μμ μΏ λ²λ€ν°μ€λ₯Ό μ¬μ©νκ³ μκ±°λ EC2μμ μ체 κ΄λ¦¬νλ μΏ λ²λ€ν°μ€λ₯Ό EKSλ‘ μ΄μ νλ €λ κ²½μ°μ μ΅μ μ λλ€. κΈ°μ‘΄μ μΏ λ²λ€ν°μ€ λ§€λνμ€νΈλ₯Ό κ·Έλλ‘ μ¬μ©ν μ μμ΄ λ§μ΄κ·Έλ μ΄μ λΉμ©μ ν¬κ² μ μ½ν μ μμ΄μ.
λ§μ½ μΏ λ²λ€ν°μ€λ₯Ό ECSλ‘ λ³κ²½νλ €λ©΄ λͺ¨λ ꡬμ±μ AWS μλΉμ€μ λ§κ² λ€μ μμ±ν΄μΌ νλ―λ‘ λΉμ©μ΄ λ§€μ° ν΄ μ λ°μ μμ΅λλ€.
μΏ λ²λ€ν°μ€ μνκ³ νμ©μ΄ νμν κ²½μ°
볡μ‘ν λ§μ΄ν¬λ‘μλΉμ€ μν€ν μ²λ λ€μν μ€νμμ€ λꡬμ νμ©μ΄ νμνλ€λ©΄ EKSκ° μ ν©ν©λλ€:
# Helmμ μ¬μ©ν 볡μ‘ν λ°°ν¬ μμ
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/my-org/my-app
targetRevision: HEAD
path: helm-chart
νμ΄λΈλ¦¬λ λ° λ©ν°ν΄λΌμ°λ νκ²½
μΏ λ²λ€ν°μ€μ νμ€νλ μΈν°νμ΄μ€ λλΆμ λ€λ₯Έ ν΄λΌμ°λ νκ²½μ΄λ μ¨νλ λ―Έμ€μμ νΈνμ±μ΄ λ°μ΄λ©λλ€. κΈλ‘λ² νμ₯μ΄λ λ²€λ λ½μΈμ νΌνλ €λ μ λ΅μ΄ μλ€λ©΄ EKSλ₯Ό κ³ λ €ν΄λ³΄μΈμ.
μ€λ¬΄ μ μ© μ κ³ λ €μ¬ν
νμ κΈ°μ μ μλ
μΏ λ²λ€ν°μ€ κ²½νμ΄ νλΆν νμ΄λΌλ©΄ EKSμ κ°λ ₯ν κΈ°λ₯μ μΆ©λΆν νμ©ν μ μμ΅λλ€. νμ§λ§ λΉ λ₯Έ λ°°ν¬μ μ΄μ νΈμμ±μ΄ λ μ€μνλ€λ©΄ ECSκ° νμ€μ μΈ μ νμΌ μ μμ΄μ.
μ΄μ 볡μ‘λ κ΄λ¦¬
EKSλ λ Έλ ꡬμ±κ³Ό μ μ§λ³΄μκ° νμν΄ μ΄μ 볡μ‘λκ° λμ΅λλ€. ECSλ ν΄λ¬μ€ν° κ΄λ¦¬κ° λΆνμνκ³ , Fargate μ¬μ© μ μΈνλΌ λΆλ΄μ μ΅μνν μ μμ΅λλ€.
λΉμ© ꡬ쑰μ μ°¨μ΄
EKSλ κΈ°λ³Έ ν΄λ¬μ€ν° λΉμ©μ΄ λ°μνλ―λ‘ μκ·λͺ¨ νκ²½μμλ λΆλ΄μ΄ λ μ μμ΅λλ€. ECSλ ν΄λ¬μ€ν° λΉμ©μ΄ μμ΄ μκ·λͺ¨ νκ²½μμ λΉμ© ν¨μ¨μ μ΄μ£ .
μ μ ν μ νμ μν κ²°λ‘
ECSμ EKSλ κ°κ° λλ ·ν μ₯λ¨μ μ κ°μ§ μ°μν 컨ν μ΄λ μ€μΌμ€νΈλ μ΄μ μλΉμ€μ λλ€.
ECSλ λΉ λ₯΄κ³ κ°λ¨ν λ°°ν¬, AWS μνκ³μμ μλ²½ν ν΅ν©, μ΄μ 볡μ‘λ μ΅μνλ₯Ό μνλ νμκ² μ΄μμ μ λλ€. νΉν μ€ννΈμ μ΄λ λΉ λ₯Έ νλ‘ν νμ΄νμ΄ νμν νλ‘μ νΈμμ κ·Έ μ§κ°λ₯Ό λ°νν©λλ€.
EKSλ μΏ λ²λ€ν°μ€ μνκ³ νμ©, 볡μ‘ν μ€μΌμ€νΈλ μ΄μ μꡬμ¬ν, λ©ν°ν΄λΌμ°λ μ λ΅μ΄ μ€μν μ‘°μ§μ μ ν©ν©λλ€. κΈ°μ‘΄ μΏ λ²λ€ν°μ€ μμ°μ΄ μκ±°λ λκ·λͺ¨ νμ₯μ κ³ννκ³ μλ€λ©΄ EKSκ° λ λμ μ νμΌ μ μμ΄μ.
μ€μν κ²μ νμ¬ νμ μλ, νλ‘μ νΈμ μꡬμ¬ν, μ₯κΈ°μ μΈ κΈ°μ μ λ΅μ μ’ ν©μ μΌλ‘ κ³ λ €νμ¬ κ²°μ νλ κ²μ λλ€. λ μλΉμ€ λͺ¨λ λ°μ΄λ μ±λ₯κ³Ό μμ μ±μ μ 곡νλ―λ‘, μ¬λ°λ₯Έ μ νμ νλ€λ©΄ μ±κ³΅μ μΈ μ»¨ν μ΄λ μ΄μ νκ²½μ ꡬμΆν μ μμ κ±°μμ.