์๋
๋ถํฐ ์์ํ Kubernetes ์ ํ ์์
์ด ์กฐ๊ธ์ฉ ์งํ๋๊ณ ์์ต๋๋ค.
์ด๋ฒ์๋ Azure Kubernetes Service์ ์ด์ด Amazon EKS ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ฉฐ ๊ฒช์๋ ์ด์๋ค์ ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
2๋ฒ ํ์, AWS
AWS๋ ์ฌ๋ด ์ฃผ ํด๋ผ์ฐ๋ ํ๊ฒฝ์ผ๋ก ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๋ฏธ ๊ธฐ์กด์๋ ๋ง์ ์๋น์ค๊ฐ AWS ๊ธฐ๋ฐ์ด์๊ณ , ์๋ฌด๋๋ AWS ํ๊ฒฝ์ด ๋ง์ ๊ฐ๋ฐ์์๊ฒ ์ต์ํ๊ธฐ ๋๋ฌธ์ Azure๋ณด๋ค๋ ๋น๊ต์ ์์ํ๊ฒ ์งํํ ์ ์์ ๊ฒ์ด๋ผ ๊ธฐ๋ํ์ต๋๋ค.
๋ค๋ง ์์์ ์งํํ Azure ํ๊ฒฝ์ด ๋ ์ฐ์ ์์๊ฐ ๋์๊ณ , AWS์์๋ 4์๋ถํฐ Infra Team EKS ํด๋ฌ์คํฐ๋ฅผ ์์์ผ๋ก Kubernetes ํ๊ฒฝ์ ๊ตฌ์ถํ๊ธฐ ์์ํ์ต๋๋ค.
Infra Team EKS
Infra Team EKS ํด๋ฌ์คํฐ๋ ๋ค์๊ณผ ๊ฐ์ ๋ชฉ์ ์ ๊ฐ์ง๊ณ ๊ตฌ์ฑ๋์์ต๋๋ค.
- ์ญํ ๋ถ๋ฆฌ๋ฅผ ๋ช ํํ๊ฒ ํ๊ณ ์ถ์์ต๋๋ค.
- ํ์์ ์ฌ์ฉํ๋ ๋๊ตฌ๋ค์ ํน์ฑ์ ๊ฑฐ์ ๋ด๋ถ์์๋ง ์ฌ์ฉ๋๊ณ ์ธ๋ถ์๋ ์ ํ์ ์ผ๋ก๋ง ๋ ธ์ถ๋๊ธฐ ๋๋ฌธ์, ๋ถ๋ฆฌํด ๋๋ ๊ฒ ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค.
- ํํธํ๋์ด ์๋ ์ธํ๋ผ ํ์ ๊ด๋ฆฌ ๋ฒ์๋ฅผ ์ค์ด๊ณ ์ถ๊ธฐ๋ ํ์ต๋๋ค.
์ฌ๊ธฐ์ ๋ฐฐ์ด ์ ๋ค์ ํ์ฉํ์ฌ ์ดํ EKS ํด๋ฌ์คํฐ๋ฅผ ๋ ์ฝ๊ฒ ๊ตฌ์ฑํ๊ณ ์ถ์๊ธฐ ๋๋ฌธ์, ์ต๋ํ ๋ง์ ๊ฒ์ ์กฐ์ฌํ๊ณ ํ ์คํธํ๋ ๊ณผ์ ์ด ์์์ต๋๋ค.
AWS ํ๊ฒฝ์ผ๋ก ๋์ด์ค๋ฉฐ ๋ฌ๋ผ์ง ์ ์ด ์๋ค๋ฉด, Azure ์ง์์์๋ ํด๋ฌ์คํฐ ๊ตฌ์ฑ์ ํ ๋ Terraform ์ฝ๋๋ฅผ ์ง์ ์์ฑํ๊ฑฐ๋ ๋ชจ๋๋ ์ ํ์ ์ผ๋ก ์ฌ์ฉํ์ง๋ง, AWS๋ ๋ชจ๋์ด ์ ์ ๋ฆฌ๋์ด ์์ด ํ์ฉํ๊ธฐ๊ฐ ๋งค์ฐ ์ข์์ต๋๋ค. ํนํ terraform-aws-eks ๋ชจ๋์ Karpenter ์์ 1๋ฅผ ๋ณํํ์ฌ ์ฌ์ฉํ๋๋ฐ, ์ฝ๊ฐ์ ์์ ๋ง์ผ๋ก ์ด๊ธฐ ํ๊ฒฝ์ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์์์ต๋๋ค.
๋ค๋ง Karpenter๋ ์ถ๊ฐ ์์ ์ด ํ์ํ๋๋ฐ ์ด๋ ๋์ค์ ์ค๋ช ํ๊ฒ ์ต๋๋ค.
VPC ๊ตฌ์ฑํ๊ธฐ
EKS ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ ๋ ๊ฐ์ฅ ์ ๊ฒฝ ์ผ๋ ๋ถ๋ถ์ ๋คํธ์ํฌ ๊ตฌ์ฑ์ด์์ต๋๋ค.
์ฐ์ VPC ์ค์ ์ด ํ์ํ๋๋ฐ, ์ด๋ VPC ๋ชจ๋์ ํ์ฉํ์ฌ ๊ตฌ์ฑํ์ต๋๋ค. VPC ๋ชจ๋์ ์ ์ฌ์ฉํ๋ฉด ๋คํธ์ํฌ ๊ด๋ จ ์ค์ ์ ์๋นํ ์์ถํ ์ ์๊ณ , ์ต์
๋ ๋งค์ฐ ๋ง๊ธฐ ๋๋ฌธ์ README๋ฅผ ์ค์ฌ์ผ๋ก ์์ธํ๊ฒ ํ์ธํด ๋ณด์๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
EKS์์ ์ฌ์ฉํ Public, Private ์๋ธ๋ท์ ๋ชจ๋ ์ ์ํ๊ณ , ๋น์ฉ ํจ์จ์ฑ์ ์ํด Single NAT ๊ตฌ์ฑ์ ์ฑํํ์ต๋๋ค. ๋ํ ์ด๊ฑด Karpenter ์์ ์๋ ์๋ ๋ด์ฉ์ธ๋ฐ, AWS Load Balancer Controller์ Karpenter๋ฅผ ์ํ ์๋ธ๋ท ํ๊ทธ ์ค์ ์ด ํ์ํฉ๋๋ค.
public_subnet_tags = {
"kubernetes.io/role/elb" = 1
}
private_subnet_tags = {
"kubernetes.io/role/internal-elb" = 1
"karpenter.sh/discovery" = var.name
}
ํน๋ณํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ณ๊ฒฝ๋ ์ผ์ด ์๊ฒ ์ง๋ง ์ค์ํ ๋ถ๋ถ์ ๋๋ค. ์ด ๋ถ๋ถ์ด ์์ผ๋ฉด Load balancer๋ Karpenter ๋ ธ๋๊ฐ ๋ฐฐํฌ๋๋ฉฐ ์๋์ผ๋ก ์๋ธ๋ท์ ์ฐพ์ ์ฐ๊ฒฐํ์ง ๋ชปํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
ํธ๋ํฝ ํ๋ฆ ๊ตฌ์ฑ
์ ํฌ๋ ๊ธฐ๋ณธ์ ์ผ๋ก 2๊ฐ์ง ์๋๋ฆฌ์ค๋ฅผ ๊ตฌ์ํ์ต๋๋ค.
- ์ธ๋ถ ํธ๋ํฝ: AWS Load Balancer Controller๋ก ์์ฑ๋ ALB(Application Load Balancer) ์ฌ์ฉ
- ์ธ๋ถ ํธ๋ํฝ > ALB > Ingress > Service > Pod
- ๋ด๋ถ ํธ๋ํฝ: NGINX Ingress Controller + NLB(Network Load Balancer) ์ฌ์ฉ
- ๋ด๋ถ ํธ๋ํฝ > NLB > NGINX Ingress > Service > Pod
Azure ํ๊ฒฝ์ ๊ตฌ์ฑํ ๋ ์ธ๋ถ ๋ก๋ ๋ฐธ๋ฐ์๋ L7 ๋ก๋ ๋ฐธ๋ฐ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ 2์ ๋ฐฐ์ ๊ธฐ ๋๋ฌธ์ ALB๋ฅผ ์ฌ์ฉํ์๊ณ , ๋ด๋ถ ํธ๋ํฝ์ ๊ฐํธํ๊ฒ NLB + NGINX Ingress Controller๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํ์ต๋๋ค.
์ด์ธ์ ์ฌ๋ด VPN์ ๋ด๋ถ ํต์ ์ ์ฐ๋ํ๋ ์์ ๋ ์์์ง๋ง ์ด ๊ธ์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ธฐ ๋๋ฌธ์ ์๋ตํ๊ฒ ์ต๋๋ค.
Karpenter ๊ฐ์ ํ๊ธฐ
๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ์ ํ๊ณ , ํ
์คํธ ์ฑ์ ๋ฐฐํฌํด ๋ณด๋ฉด์ ๋คํธ์ํฌ ํ
์คํธ์ ๊ธฐ๋ณธ์ ์ธ Karpenter ๋์์ ํ์ธํ์ต๋๋ค.
์ด๋๋ก ๋ฌธ์ ๊ฐ ์๋ค๊ณ ์๊ฐํ์ง๋ง, ๋ณธ๊ฒฉ์ ์ผ๋ก ์ค์ ์๋น์ค ๋ฐฐํฌ ๊ณผ์ ์์ ๋ถ์กฑํ ๋ถ๋ถ๋ ์์๊ณ , ์ํ์ฐฉ์ค๋ ์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ์ค์ฌ์๋ ์์ ์ฝ๋๋๋ก๋ง ๊ตฌ์ฑํ๋ Karpenter๊ฐ ์์์ต๋๋ค.
Karpenter๋?
์์์ ๋ช ๋ฒ ์ธ๊ธํ๊ธด ํ์ง๋ง, ์ฌ๊ธฐ์๋ถํฐ ์ ๋๋ก ์ ๋ฆฌํด ๋๋ ค ํฉ๋๋ค.
Karpenter๋ Kubernetes ํด๋ฌ์คํฐ์ ๋
ธ๋๋ฅผ ๋์ ์ผ๋ก ํ๋ก๋น์ ๋ํ๋ ์คํ ์ค์ผ์ผ๋ฌ์
๋๋ค. ๊ธฐ์กด์ Cluster Autoscaler์ ๋ฌ๋ฆฌ, Karpenter์ ๋
ธ๋ ๊ด๋ฆฌ ๋ฐฉ์์ ๋ ํจ์จ์ ์ด๊ณ ์ ์ฐํฉ๋๋ค.
- Karpenter๋ ์ง์์ ์ผ๋ก Pod์ ์ํ๋ฅผ ๊ด์ฐฐํ์ฌ ์ค์ผ์ค๋ง๋ ํ ์ํ์ ์ค์ผ์ค๋ง์ด ๋์ง ์๋ ๋ฆฌ์์ค๋ฅผ ํ์ ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ฐํ์ผ๋ก ์กฐ๊ฑด ๋ด์ ์ต์ ์ VM์ ์ ์ ํ์ฌ ํ๋ก๋น์ ๋ํฉ๋๋ค. ๊ทธ๋์ ์ต๋ํ ๋ฒ๋ฆฌ๋ ๋ฆฌ์์ค๋ฅผ ์ค์ด๊ณ , Spot ์ธ์คํด์ค๋ฅผ ํ์ฉํ๋ ๋ฑ ๋น์ฉ ๋ฉด์์๋ ์ด์ ์ ๊ฐ์ง๋๋ค.
- ๋ํ Karpenter๋ EC2 API๋ฅผ ์ง์ ํธ์ถํ์ฌ ์ธ์คํด์ค๋ฅผ ํ๋ก๋น์ ๋ํ๊ธฐ ๋๋ฌธ์ ์๋๋ ๋งค์ฐ ๋น ๋ฆ ๋๋ค. ์ค์ ๋ก ์ผ๋ฐ์ ์ธ ์ํฉ์์ Karpenter๊ฐ ํ์ํ ์ธ์คํด์ค๋ฅผ ํ๋จํ๊ณ ํ๋ก๋น์ ๋ํ๋๋ฐ 1๋ถ์ด ๊ฑธ๋ฆฌ์ง ์์์ต๋๋ค. Azure์์ ์ฌ์ฉํ๋ Cluster Autoscaler๊ฐ 3~4๋ถ ์ ๋์ ์๊ฐ์ด ๊ฑธ๋ ธ๋ ๊ฒ์ ๊ฐ์ํ๋ฉด ๋งค์ฐ ๋น ๋ฅด๋ค๊ณ ํ ์ ์์ต๋๋ค.
์ ํฌ ํ์ฌ๋ ํ์ฌ๋ ํด๋ผ์ฐ๋ ๋น์ฉ์ผ๋ก ์ธํ ์ง์ถ์ด ๋ง์ ๋น์ฉ์ ๋งค์ฐ ๋ฏผ๊ฐํ๊ณ , EKS๋ฅผ ์ด๋ค๋ฉด Karpenter๋ ๊ผญ ์ฌ์ฉํด์ผ ํ๋ค๋ ํ์๋ค์ ๊ธ์ ์ ์ธ ์๊ฒฌ๋ ์์์ต๋๋ค.
Karpenter์ ๋์ ๋ฐฉ์

Image: Karpenter Overview from Karpenter official homepage, Apache 2.0
์์ธํ ๊ตฌ์กฐ๋ ๋ ๋ณต์กํ๊ฒ ์ง๋ง, Karpenter์ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ด ์๊ฐํ ์ ์์ต๋๋ค.
- ๋ ธ๋๋ฅผ ์กฐ์จํ๋ Karpenter controller๊ฐ ์๊ณ ,
- Karpenter controller๊ฐ ์ ์๋ EC2NodeClass์ NodePool์ ๋ฐํ์ผ๋ก Self-managed ๋ ธ๋ ํ์ ์ ์ํ๊ณ ๊ด๋ฆฌํฉ๋๋ค.
์ด๋ฌํ Karpenter์ ๋์ ๋ฐฉ์์ ์ฒ์์๋ ์ดํดํ์ง ๋ชปํ์ต๋๋ค. ํนํ ์คํดํ๋ ๋ด์ฉ์ ํฌ๊ฒ 2๊ฐ์ง์์ต๋๋ค.
- Karpenter controller๊ฐ ๋ฐฐ์น๋๋ ๊ณณ์ ๊ด๋ฆฌ ๋ ธ๋ ํ์ด๋ผ๋ ๊ฒ, ๊ทธ๋์ ์์คํ ์์ ๊ด๋ฆฌํ๊ณ , Auto-scaling๋ Managed ๋ ธ๋ ํ์ ์ค์ ์ ๋ฐ๋ผ๊ฐ๋ค๋ ์
- Karpenter๊ฐ ์์ฑํ๋ ๋
ธ๋๋ ๋ณ๋์ NodePool๊ณผ EC2NodeClass ๋ฆฌ์์ค ์ ์๋ฅผ ์ฐธ์กฐํ๊ณ , ๊ด๋ฆฌ ๋
ธ๋ ํ๊ณผ๋ ๊ด๋ จ์ด ์๋ค๋ ์
- ์ฐธ๊ณ ๋ก ์ด๋ ๊ฒ Karpenter ๋ ธ๋ ํ์ด Self-managed ํํ๋ก ๊ด๋ฆฌ๋๋ ๊ฒ์ ์๋๋ ๊ฒ์ด๊ณ , System์์ ๊ด๋ฆฌ๋์ง ์๋ ๊ฒ์ด ์ ์์ ๋๋ค.
- ํ์ง๋ง ์์ ์ ๋ฆฌ์์ค๋ ์ผ๋ฐ์ ์ธ ์ผ์ด์ค๋ก ์ ์๋์ด ์๊ธฐ ๋๋ฌธ์ ์ต์ ํ์ ์์ ์์ ์ด ํ์ํ์ต๋๋ค.
์ฑ์ ๋ฐฐํฌํ๋ ๊ณผ์ ์์ Karpenter ๋ ธ๋๊ฐ ๋ณผ๋ฅจ ์ค์ ๊ณผ Auto-scaling์ด ์ํํ๊ฒ ์๋ํ์ง ์๋๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ์ ๋, ์ฒ์์๋ Managed ๋ ธ๋ ํ์ ์ค์ ์ ๋ณ๊ฒฝํ๋ฉด ํด๊ฒฐ๋ ๊ฒ์ด๋ผ ์๊ฐํด์ ํผ์ ์ด ์์์ต๋๋ค. ์์ธํ ์กฐ์ฌ๋ฅผ ํ๊ณ ๋์์ผ ๊ณ ์ณ์ผ ํ ๋ถ๋ถ์ ์ ์ ์์๊ณ , ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ์ค์ ์ ๋ณ๊ฒฝํ์ต๋๋ค.
gp3 ๋ณผ๋ฅจ ์ฌ์ฉํ๊ธฐ
gp3 ๋ณผ๋ฅจ์ ์ฐจ์ธ๋ EBS ๋ณผ๋ฅจ์ผ๋ก, ๊ธฐ์กด gp2 ๋ณผ๋ฅจ์ ๋นํด IOPS๊ฐ ๋๊ณ ๋น์ฉ๋ ๋ ์ ๋ ดํฉ๋๋ค.
๊ทธ๋์ ๋ณดํต์ gp3 ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์๋ฐ, EKS๋ ๋ณ๋ ์ค์ ์ ํ์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก gp2 ๋ณผ๋ฅจ์ ์ฌ์ฉํฉ๋๋ค.
์ด์ ๋ ๋ง๊ณ ์๋น์ค๋ฅผ ๋ฐฐํฌํ ๋ gp3 ๋ณผ๋ฅจ์ ๊ฐ์ ํ๊ณ StorageClass๋ฅผ ์ค์ ํ๋ ๊ฒฝ์ฐ๋ ๋ง๊ธฐ ๋๋ฌธ์, gp3 ๋ณผ๋ฅจ์ ๋ช
์์ ์ผ๋ก ์ฌ์ฉํ๋๋ก ์ค์ ํด์ผ ํ์ต๋๋ค.
์์์ ์ค๋ช
ํ ๊ฒ์ฒ๋ผ Karpenter ๋
ธ๋์ gp3 ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋๋ก ์ค์ ํ๋ ค๋ฉด ํด๋น ๋
ธ๋๊ฐ ์ฐธ๊ณ ํ๋ EC2NodeClass ๊ฐ์ฒด๋ฅผ ์์ ํด์ผ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํด์ผ ํฉ๋๋ค.
blockDeviceMappings:
- deviceName: /dev/xvda
ebs:
volumeSize: 100Gi
volumeType: gp3
iops: 3000
throughput: 125
encrypted: true
deleteOnTermination: true
- deviceName: /dev/xvdb
ebs:
volumeSize: 20Gi
volumeType: gp3
iops: 3000
throughput: 125
encrypted: true
deleteOnTermination: true
์ฌ๊ธฐ์ /dev/xvda, /dev/xvdb๋ ๊ฐ๊ฐ ํ์ผ ์์คํ
ํํฐ์
์ ์๋ฏธํ๋๋ฐ,
/dev/xvda๋ ๋ฃจํธ ํ์ผ ๋ณผ๋ฅจ,/dev/xvdb๋ ๋ฐ์ดํฐ ํ์ผ ๋ณผ๋ฅจ์ ์๋ฏธํฉ๋๋ค.
์ด ๋ณผ๋ฅจ์ ์ ์ ํ๊ฒ ์ค์ ํด ์ฃผ์ด์ผ ํ๋๋ฐ, ๋ณดํต์ ๋ฃจํธ ํ์ผ ๋ณผ๋ฅจ์ธ dev/xvda๋ฅผ ์ฌ์ฉํ์ง๋ง Bottlerocket AMI์ฒ๋ผ ๋ณผ๋ฅจ์ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ Docker ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ ธ์ค๋ ์์
๋ฑ์ ๋ฐ์ดํฐ ํ์ผ ๋ณผ๋ฅจ์ธ dev/xvdb๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.3
์ฐธ๊ณ ๋ก Managed ๋
ธ๋ ํ์ gp3 ๋ณผ๋ฅจ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
block_device_mappings = {
xvda = {
device_name = "/dev/xvda"
ebs = {
volume_size = 10
volume_type = "gp3"
iops = 3000
throughput = 125
encrypted = true
delete_on_termination = true
}
}
xvdb = {
device_name = "/dev/xvdb"
ebs = {
volume_size = 20
volume_type = "gp3"
iops = 3000
throughput = 125
encrypted = true
delete_on_termination = true
}
}
}
(06.09 ์ถ๊ฐ) ๋ณผ๋ฅจ์ ์ค์ ํ ๋ค ๋ค์๊ณผ ๊ฐ์ด Storage Class๋ฅผ ์ค์ ํด์ผ ๊ธฐ๋ณธ Storage Class๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gp3
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: ebs.csi.aws.com
volumeBindingMode: WaitForFirstConsumer
parameters:
type: gp3
encrypted: "true"
์ฌ๊ธฐ์ Provisioner๋ ebs.csi.aws.com์ด์ด์ผ EC2์์ ์ ๋๋ก PVC๊ฐ ํ ๋น๋ฉ๋๋ค.
IAM Role ์ค์ ํ๊ธฐ
Karpenter๊ฐ ์ ๋๋ก ์๋ํ๊ธฐ ์ํด์๋ ์ฌ๋ฌ IAM Role ์ค์ ์ด ํ์ํฉ๋๋ค.
- EBS CSI ๋๋ผ์ด๋ฒ์ IRSA Role์ ๋ถ์ฌํด์ผ ํฉ๋๋ค.
- ์ด Role์ด ์์ผ๋ฉด Karpenter ๋ ธ๋ ์์ฑ, ๋๋ ๋ ธ๋๊ฐ ์ฌ๋ผ์ง๊ณ ์์ฌ ๋ณผ๋ฅจ์ ์ ๋ฆฌํ ๋ ๋ฌธ์ ๊ฐ ์๊น๋๋ค.
- ์ค์ ๋ก EBS ๋ณผ๋ฅจ์ ์ฌ์ฉํ๋ PVC๊ฐ Karpenter ๋ ธ๋๊ฐ ์์ด์ง ๋ค์๋ ํ์๋์ง ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
- Role์ ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ์์ฑํ ์ ์์ต๋๋ค.4
module "ebs_csi_irsa_role" {
source = "terraform-aws-modules/iam/aws//modules/iam-role-for-service-accounts-eks"
role_name = "${var.name}-ebs-csi-role"
attach_ebs_csi_policy = true
oidc_providers = {
ex = {
provider_arn = module.eks.oidc_provider_arn
namespace_service_accounts = ["kube-system:ebs-csi-controller-sa"]
}
}
tags = var.tags
}
- Karpenter controller์ IRSA Role์ ๋ถ์ฌํด์ผ ํฉ๋๋ค.
- ์ด Role์ Karpenter๊ฐ EC2 ์ธ์คํด์ค๋ Launch template ๋ฑ์ ์์ฑํ๊ณ ์คํํ ์ ์๋๋ก ํด ์ค๋๋ค.
- Karpenter ๋ชจ๋์์
enable_irsa๋ฅผtrue๋ก ์ค์ ํ๊ณ ๊ด๋ จ ์ค์ ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
- Karpenter node IAM role์ EBS CSI ๋๋ผ์ด๋ฒ ์ ์ฑ
์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
- ์ด๋ฅผ ํตํด Karpenter ๋ ธ๋์์ EBS ๋ณผ๋ฅจ์ ์์ฑํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
module "karpenter" {
create = var.enable_karpenter
source = "terraform-aws-modules/eks/aws//modules/karpenter"
enable_irsa = true
irsa_oidc_provider_arn = module.eks.oidc_provider_arn
irsa_namespace_service_accounts = [
"kube-system:karpenter"
]
node_iam_role_additional_policies = {
AmazonSSMManagedInstanceCore = "arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore"
AmazonEBSCSIDriverPolicy = "arn:aws:iam::aws:policy/service-role/AmazonEBSCSIDriverPolicy"
}
tags = var.tags
}
- ๋์ผ๋ก Karpenter ์๋น์ค ๊ณ์ ์ ์ญํ ARN์ ์ง์ ํด์ผ ํฉ๋๋ค.
serviceAccount:
annotations:
eks.amazonaws.com/role-arn: arn:aws:iam::123456789012:role/karpenter-controller-role
Spot ์ธ์คํด์ค ์ฌ์ฉํ๊ธฐ
Karpenter ๋ ธ๋๊ฐ Auto-scaling์ ํ์ง ๋ชปํ๋ ๋ฌธ์ ๋ฅผ ํ์ธํด ๋ณด๋, Spot ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ๋ชปํ๊ณ ์์์ต๋๋ค. Karpenter๋ Spot ์ธ์คํด์ค๋ฅผ ์ฐ์ ์ ์ผ๋ก ์ฌ์ฉํ๊ณ , ๋ณ๋ ๊ถํ์ด ์์ผ๋ฉด Spot ์ธ์คํด์ค๋ฅผ ์์ฑํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ๊ฐ์ง ์ค์ ์ ์ถ๊ฐํ์ต๋๋ค:
- ์๋น์ค ์ฐ๊ฒฐ ์ญํ ๋ก Spot ์ธ์คํด์ค ๊ถํ์ ๋ถ์ฌํ์ต๋๋ค.
resource "aws_iam_service_linked_role" "spot" {
aws_service_name = "spot.amazonaws.com"
}
- NodePool ๋ฆฌ์์ค์
karpenter.sh/capacity-type์์ฑ์ผ๋ก ์๊ตฌ์ฌํญ์ ์ถ๊ฐํ์ต๋๋ค. ์๋๋ ์ ํ ์์ด ๋ชจ๋ ์ธ์คํด์ค ํ์ ์ ์ฌ์ฉํ ์ ์๋๋ก ์ค์ ํ ์์์ ๋๋ค.
requirements:
- key: karpenter.sh/capacity-type
operator: In
values: ["spot", "on-demand", "reserved"]
๋ง์น๋ฉฐ
์ด๋ ๊ฒ ๋ชจ๋ ์ค์ ์ ์๋ฃํ ๋ค์๋ ์ค์ ์๋น์ค ๋ฐฐํฌ์๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.
๋ฌด์์ ๋์
ํ๋ค๊ฐ ์ ๋๋ก ์ฌ์ฉ์ ๋ชป ํ ์๋ ์์๋๋ฐ, ๋ฏธ๋ฆฌ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ํด๊ฒฐํ ์ ์์ด ๋คํ์ด์๋ค๊ณ ์๊ฐํ๋ค์.
๋น์ฐํ ํ์ฌ Karpenter ์ค์ ์ด ์๋ฒฝํ ๊ฒ์ ์๋๋๋ค. ๋ช ๊ฐ์ง ์ค์ ์ ์ถ๊ฐํ ๊ฒ ์ธ์๋ ํฌ๊ฒ ๋ณ๊ฒฝ์ ๊ฑฐ์น์ง ์์๊ธฐ ๋๋ฌธ์ ์ด์ ํ๊ฒฝ์์๋ ์ธ์คํด์ค ํ์ ์ด๋ ์ํคํ ์ฒ ๋ฑ์ ์ ํํ๋ ์ค์ ์ ์ถ๊ฐํด์ผ ํ ๊ฒ์ด๊ณ , ๊ถ๊ทน์ ์ผ๋ก๋ Weighted NodePool ์ค์ ์ ์ถ๊ฐํ๋ ๋ฑ5 ์ข ๋ ์ต์ ํ๋ ์ค์ ์ด ํ์ํ ๊ฒ์ ๋๋ค.
Karpenter๋ฅผ ํฌํจํด EKS๋ฅผ ๊ตฌ์ฑํ๋ ๊ณผ์ ์์ ๊ทธ๋๋ Azure์ ๋นํด ์ฐธ๊ณ ํ ์๋ฃ๊ฐ ๋ง์์ก์ง๋ง, ์ฌ์ ํ ์ด์ ํ๊ฒฝ์ ๋ค๋ฅด๋ค๋ ๊ฒ์ ํ ๋ฒ ๋ ๋๋ผ๊ธฐ๋ ํ์ต๋๋ค.
ํ ์ฐจ์์์ Cloud ํ๊ฒฝ์ Kubernetes ์ ์ฉ์ด ์ฒ์์ด๋ผ๋ ์ , ๊ทธ๋ฆฌ๊ณ ์ฌ๊ธฐ์ ๋ชจ๋ ์ ์ง๋ ์์์ง๋ง ๊ธฐ์กด ์๋น์ค์ ๋์ผํ ์กฐ๊ฑด์ ๊ฐ์ ธ๊ฐ๊ธฐ ์ํด ์ค์ ํ ๋ถ๋ถ๋ ๋ง์๊ธฐ ๋๋ฌธ์
๋๋ค. ๊ทธ๋๋ EKS ํด๋ฌ์คํฐ ํ๋๊ฐ ์จ์ ํ ๊ตฌ์ฑ๋์๊ณ , ์ด๋ฅผ ๋ฐํ์ผ๋ก ์ด์ ํ๊ฒฝ EKS๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐ๋ ์๋์ ์ผ๋ก ์ ์ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค.
์ด์ ์๋ก ๋ฐฐํฌํ๋ ์๋น์ค๋ EKS ํ๊ฒฝ์์ ๋ฐฐํฌ๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ํ๊ณ , ๊ธฐ์กด ์๋น์ค๋ค๋ ์ฎ๊ธฐ๋ ์์
์ ์งํํ๊ณ ์์ต๋๋ค.
๋ํ ํ ๋ด์์๋ Argo CD, Harbor ๋ฑ ๊ธฐ์กด์ ์ฌ์ฉํ์ง ๋ชปํ๋ ๋๊ตฌ๋ค์ ๊ฒ์ฆํ๊ณ ์ ์ฉํ์ฌ Cloud Native ํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ต์ข
์ ์ธ ๋ชฉํ์
๋๋ค.
๋ค์ ์๋๊ฐ ๋๋ ค์ง ์๋ ์์ง๋ง, ์์ ์ ์ด๊ณ ํ๋ ฅ์ ์ธ ํ๊ฒฝ์ ๊ตฌ์ฑํ ์ ์๋๋ก ์ฌ์ ๋ฅผ ๊ฐ์ง๊ณ ์งํํ๋ ค ํฉ๋๋ค.
๊ทธ ์ธ ์ฐธ๊ณ ์๋ฃ
- NodeClasses - Karpenter Documentation
- AWS EKS Terraform module ๋ฑ AWS ๋ชจ๋
Footnotes
-
https://github.com/terraform-aws-modules/terraform-aws-eks/tree/master/examples/karpenter โฉ
-
https://blog.haulrest.me/blog/250225-01/#azure-load-balancer%EC%99%80-azure-application-gateway โฉ
-
https://awslabs.github.io/data-on-eks/docs/bestpractices/scalability/preload-container-images โฉ
-
https://github.com/terraform-aws-modules/terraform-aws-iam/tree/master/examples/iam-role-for-service-accounts-eks โฉ
-
https://karpenter.sh/docs/concepts/scheduling/#weighted-nodepools โฉ