ํฐ์คํ ๋ฆฌ ๋ทฐ
EKS Custom Networking ๋์ ์ Security Group, ์ด ๋ถ๋ถ์ ๋์น๋ฉด ์๋น์ค๊ฐ ์ฃฝ๋๋ค
kimub 2026. 4. 9. 23:07
๐ค AI Assisted Content
์ด ๊ธ์ AI(Claude, Anthropic)์ ๋์์ ๋ฐ์ ์์ฑ๋์์ต๋๋ค.
์์ฑ์๊ฐ ๋ด์ฉ์ ๊ฒํ ํ๊ณ ํธ์งํ์ผ๋, AI๊ฐ ์ด์ ์์ฑ ๋ฐ ๊ตฌ์ฑ์ ์ฐธ์ฌํ์์ ๋ฐํ๋๋ค.
๋ค์ด๊ฐ๋ฉฐ
EKS ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ๋ค ๋ณด๋ฉด IP ๊ณ ๊ฐ ๋ฌธ์ ๋ก Secondary CIDR์ ๋ถ์ด๊ณ VPC CNI์ Custom Networking์ ๋์ ํ๋ ์์ ์ด ์ต๋๋ค. Pod๋ฅผ ๋ณ๋ ์๋ธ๋ท์ผ๋ก ๋นผ์ Primary CIDR์ IP๋ฅผ ์๋ผ๋ ๊ตฌ์ฑ์ด์ฃ .
๊ทธ๋ฐ๋ฐ ๋ง์ ์ ํํ๊ณ ๋๋ฉด ์ด๋ฐ ์ฆ์์ด ์ค์ค์ด ํฐ์ง๊ธฐ ์์ํฉ๋๋ค.
- Pod๊ฐ MongoDB์ ๋ถ์ง ๋ชปํจ
- Pod์์ S3, ECR, STS ๊ฐ์ AWS API ํธ์ถ์ด ํ์์์
- ๋ฉ์ฉกํ๋ ์๋น์ค ๊ฐ ํต์ ์ด ์ ์ ์๋ ์ด์ ๋ก ๋๊น
๋๋ถ๋ถ์ ์์ธ์ ๋ณด์๊ทธ๋ฃน(SG)์ ๋๋ค. ๊ทธ๊ฒ๋ "๋ถ๋ช ์ด์ด๋๋๋ฐ ์ ์ ๋์ง?" ์ถ์ ๋ฌํ ํํ๋ก ๋งํ๋๋ค. ์ด ๊ธ์ ๊ทธ ์ด์ ๋ฅผ VPC CNI์ SNAT ๋์ ์๋ฆฌ๋ถํฐ ์ค์ SG ๋ณ๊ฒฝ ํฌ์ธํธ๊น์ง ํ ๋ฒ์ ์ ๋ฆฌํฉ๋๋ค.
ํต์ฌ ์๋ฆฌ: VPC CNI๋ "VPC ๋ฐ"์ผ๋ก๋ง SNAT ํ๋ค
AWS ๊ณต์ ๋ฌธ์ ์๋ฌธ๋ถํฐ ๋ณด๊ฒ ์ต๋๋ค.
By default, when a pod communicates to any IPv4 address that isn't within a CIDR block that's associated to your VPC, the VPC CNI translates the pod's IPv4 address to the primary private IPv4 address of the primary ENI of the node.
ํ์ด ๋งํ๋ฉด ์ด๋ ์ต๋๋ค.
- Pod โ ์ธํฐ๋ท(VPC ๋ฐ): ๋ ธ๋์ Primary ENI IP๋ก SNAT ๋จ
- Pod โ VPC ๋ด๋ถ ๋ฆฌ์์ค: SNAT ๋์ง ์์. Pod IP(Secondary CIDR)๊ฐ ๊ทธ๋๋ก Source IP
์ฌ๊ธฐ์ ํจ์ ์ด ์์๋ฉ๋๋ค. MongoDB, VPC Endpoint, ALB, ๋ค๋ฅธ Pod... ์ด ๋ชจ๋ ๋ชฉ์ ์ง๊ฐ VPC ๋ด๋ถ์ ๋๋ค. ์ฆ Pod๊ฐ ์ด๋ค์๊ฒ ๋ง์ ๊ฑธ ๋ Source IP๋ ๋ ธ๋ IP๊ฐ ์๋๋ผ Secondary CIDR์ ์ํ Pod IP์ ๋๋ค.
์ ์๋น์ค๊ฐ ์ฃฝ๋๊ฐ
๊ธฐ์กด Security Group ๊ท์น์ ํ ๋ฒ ๋ ์ฌ๋ ค๋ณด์ธ์. ๊ฑฐ์ ๋๋ถ๋ถ ์ด๋ ๊ฒ ์๊ฒผ์ ๊ฒ๋๋ค.
ingress {
from_port = 27017
to_port = 27017
protocol = "tcp"
cidr_blocks = [data.aws_vpc.this.cidr_block] # โ ์ด๊ฒ!
description = "MongoDB from VPC"
}
data.aws_vpc.this.cidr_block์ Primary CIDR ๋ฑ ํ๋๋ง ๋ฐํํฉ๋๋ค. Secondary CIDR์ ํฌํจ๋์ง ์์ต๋๋ค. ์ฆ, ์ด ๊ท์น์ ์ฌ์ค์ ์ด๋ ๊ฒ ํด์๋ฉ๋๋ค.
"Primary CIDR ๋์ญ์ ํด๋ผ์ด์ธํธ๋ง MongoDB์ ์ ๊ทผ ๊ฐ๋ฅ"
๊ทธ๋ฐ๋ฐ Custom Networking ์ดํ Pod IP๋ Secondary CIDR์ด๊ณ , SNAT๋ ๋์ง ์์ ๊ทธ๋๋ก ํจํท์ ์ฐํ๋๋ค. ๊ฒฐ๊ณผ๋ ๋ช ํํฉ๋๋ค. ์ ๋ถ ์ฐจ๋จ.
๋ณ๊ฒฝ์ด ํ์ํ SG ์ฒดํฌ๋ฆฌ์คํธ
์๋ ๊ธฐ์ค์ผ๋ก ํ์ผ๋ฉด ๋ฉ๋๋ค.
"์ด SG๋ฅผ ํฅํด Pod๊ฐ ๋จผ์ ๋ง์ ๊ฑฐ๋๊ฐ?" โ Yes๋ฉด ์์ ํ์.
โ ๏ธ ๋ฐ๋์ ์์ ํด์ผ ํ๋ SG
1. VPC Endpoint SG
Pod๊ฐ S3, ECR, STS, Logs, SSM ๋ฑ์ ํธ์ถํ ๋ ์ฌ์ฉ. ์ ๋ถ Pod๊ฐ ํด๋ผ์ด์ธํธ.
Before: TCP 443 from VPC Primary CIDR
After : TCP 443 from VPC Primary CIDR + Pod CIDR
(๋๋ Source = ๋
ธ๋ SG)2. MongoDB / RDS / ElastiCache ๋ฑ DB SG
DB ํด๋ผ์ด์ธํธ๋ 100% Pod์
๋๋ค. ์ฌ๊ธฐ์ ๋งํ๋ฉด ์๋น์ค ์ฅ์ ์ง๊ฒฐ.
Before: TCP 27017 from VPC Primary CIDR
After : TCP 27017 from VPC Primary CIDR + Pod CIDR๐ค ์ผ์ด์ค ๋ฐ์ด ์ผ์ด์ค๋ก ํ๋จํ SG
3. ๋ด๋ถ ALB Frontend SG
์ธ๋ถ ์ฌ์ฉ์๋ง ํธ์ถํ๋ค๋ฉด ๊ทธ๋๋ก ๋ฌ๋ ๋ฉ๋๋ค. ๋จ Pod ๊ฐ ํธ์ถ์์ ๋ด๋ถ ALB๋ฅผ ๊ฒฝ์ ํ๋ ๊ตฌ์กฐ(MSA์์ ํํจ)๋ผ๋ฉด Source IP๊ฐ Pod CIDR์ด ๋ฉ๋๋ค. ์ด ๊ฒฝ์ฐ Pod CIDR ์ถ๊ฐ ํ์.
4. EKS Node SGSelf(Node SG) ์ฐธ์กฐ๋ก ๊ฑธ๋ ค์๋ Pod-to-Pod, CoreDNS ๋ฃฐ์ Pod ENI๊ฐ ๋
ธ๋ SG๋ฅผ ์์ํ๋ค๋ ์ ์ ์์ ๊ทธ๋๋ก ์ ํจํฉ๋๋ค. VPC CNI 1.8.0 ์ด์์ด๋ฉด ENIConfig์ securityGroups๋ฅผ ์ง์ ํ์ง ์์ ๋ ์๋์ผ๋ก ๋
ธ๋ SG๊ฐ Pod ENI์ ์์๋ฉ๋๋ค.
๐ก ๋ง์ฝ Pod ENI์ ๋ณ๋ SG(
SG-POD-01๋ฑ)๋ฅผ ๋ถ๋ฆฌํ๊ธฐ๋ก ํ๋ค๋ฉด Self ์ฐธ์กฐ ๋ฃฐ์ ์ ๋ถ ์ฌ์ค๊ณํด์ผ ํฉ๋๋ค.
5. Admission Webhook Pod๋ก ๋ค์ด์ค๋ 9443
Webhook์ ํธ์ถํ๋ ์ฃผ์ฒด๋ API Server(EKS Managed ENI)์ด๊ณ , EKS Managed ENI๋ Primary CIDR ์์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด Source = VPC CIDR ๊ท์น์ผ๋ก๋ ๋์์ ํฉ๋๋ค. ๋ค๋ง ์๋ฏธ์ Source = Cluster SG ์ฐธ์กฐ๋ก ๋ฐ๊พธ๋ ๊ฒ์ด ๋ ์ ํํ ๊ด๋ก์
๋๋ค.
โ ๊ฑด๋๋ฆฌ์ง ์์๋ ๋๋ SG
6. ALB Backend SG
AWS Load Balancer Controller๊ฐ IP Target ๋ชจ๋์์ Pod ENI SG(๊ธฐ๋ณธ๊ฐ: ๋
ธ๋ SG)์ from ALB SG ์ธ๋ฐ์ด๋๋ฅผ ๋์ ์ผ๋ก ์ฃผ์
ํฉ๋๋ค. ์ด๊ฑด ์ปจํธ๋กค๋ฌ๊ฐ ์์์ ํด์ค๋๋ค.
๊ถ์ฅ ํจํด: CIDR ๋์ SG ์ฐธ์กฐ
Pod CIDR์ ์ผ์ผ์ด ๋์ดํ๋ ๋ฐฉ์์ ๋น์ฅ์ ๊ฐ๋จํ์ง๋ง, Secondary CIDR์ ํ์ฅํ๊ฑฐ๋ Pod ์๋ธ๋ท์ ์ถ๊ฐํ ๋๋ง๋ค SG ๋ฃฐ์ ๋ค์ ์๋ด์ผ ํ๋ ๋ถ๋ด์ด ์์ต๋๋ค. ๊ฐ๋ฅํ๋ฉด SG ์ฐธ์กฐ ๋ฐฉ์์ผ๋ก ํต์ผํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
# Before (CIDR ๋์ด)
cidr_blocks = [
"10.0.0.0/16", # Primary
"100.64.0.0/16", # Pod Secondary
]
# After (SG ์ฐธ์กฐ)
security_groups = [aws_security_group.eks_node.id]
SG ์ฐธ์กฐ ๋ฐฉ์์ ์ฅ์ ์ ๋ช ํํฉ๋๋ค. Pod ENI์ ๋ ธ๋ SG๊ฐ ์๋์ผ๋ก ๋ถ๊ธฐ ๋๋ฌธ์ "์ด SG ๋ฌ๊ณ ์๋ ์ ๋ ๋ค ํ์ฉ" ์ด๋ผ๋ ๊ท์น ํ๋๋ก Primary๋ Secondary๋ ์ ๋ถ ์ปค๋ฒ๋ฉ๋๋ค. ๋์ค์ Pod ์๋ธ๋ท์ ์๋ฌด๋ฆฌ ๋๋ ค๋ SG ๋ฃฐ์ ๊ทธ๋๋ก์ ๋๋ค.
ENIConfig securityGroups ๋์์ ์ค์ํ ํฉํธ
VPC CNI ๋ฒ์ ๋ณ๋ก ๊ธฐ๋ณธ ๋์์ด ๋ค๋ฆ ๋๋ค. ๊ณต์ ๋ฌธ์ ์๋ฌธ์ ๋๋ค.
If you don't specify a valid security group... version 1.8.0 or later of the Amazon VPC CNI plugin for Kubernetes, then the security groups associated with the node's primary elastic network interface are used.
์ ๋ฆฌํ๋ฉด,
- VPC CNI โฅ 1.8.0 โ ENIConfig์์
securityGroups์๋ต ์, ๋ ธ๋ Primary ENI์ SG๊ฐ Pod ENI์ ์์ - VPC CNI < 1.8.0 โ VPC ๊ธฐ๋ณธ SG๊ฐ ๋ถ์ (์์ ๋ชป ํ ๋์์ ์์ธ์ด ๋๊ธฐ ์ฌ์)
๋์ ์ ๋ฐ๋์ VPC CNI ์ ๋์จ ๋ฒ์ ์ ํ์ธํ์ธ์.
์ค์ ์ฒดํฌ๋ฆฌ์คํธ
Custom Networking ์ ํ ์ ์๋ ํญ๋ชฉ์ ๋ฏธ๋ฆฌ ์ ๊ฒํ๋ฉด ์ฅ์ ์์ด ๋์ด๊ฐ ์ ์์ต๋๋ค.
- VPC CNI ์ ๋์จ ๋ฒ์ ์ด 1.8.0 ์ด์์ธ๊ฐ
- VPC Endpoint SG์ Pod CIDR ๋๋ ๋ ธ๋ SG ์ฐธ์กฐ๊ฐ ์ถ๊ฐ๋๋๊ฐ
- MongoDB/RDS ๋ฑ DB SG์ Pod CIDR ๋๋ ๋ ธ๋ SG ์ฐธ์กฐ๊ฐ ์ถ๊ฐ๋๋๊ฐ
- ๋ด๋ถ ALB๋ฅผ Pod๊ฐ ํธ์ถํ๋ ํ๋ฆ์ด ์๋ค๋ฉด ALB SG์๋ Pod CIDR์ด ๋ฐ์๋๋๊ฐ
- Terraform์์
data.aws_vpc.*.cidr_block๋ง ์ฐธ์กฐํ๋ SG ๋ฃฐ์ด ๋จ์์์ง ์์๊ฐ - Pod ENI์ ๋ณ๋ SG๋ฅผ ์ธ ๊ณํ์ด๋ผ๋ฉด, Self ์ฐธ์กฐ ๊ธฐ๋ฐ ๋ฃฐ์ ์ ๋ถ ์ฌ์ค๊ณํ๋๊ฐ
๋ง๋ฌด๋ฆฌ
Custom Networking ์์ฒด๋ IP ๊ณ ๊ฐ ๋ฌธ์ ์ ๋ํ ๊น๋ํ ํด๋ต์ด์ง๋ง, Pod์ Source IP๊ฐ ๋ฐ๋๋ค๋ ๋จ ํ๋์ ์ฌ์ค ๋๋ฌธ์ ๊ธฐ์กด SG ์ค๊ณ ์ ๋ฐ์ ๋ค์ ๋ค์ฌ๋ค๋ด์ผ ํ๋ ์์
์
๋๋ค. ํนํ Terraform์์ ๊ด์ฉ์ ์ผ๋ก ์จ์ค๋ data.aws_vpc.this.cidr_block์ด Primary CIDR๋ง ๋ฐํํ๋ค๋ ์ , ๊ทธ๋ฆฌ๊ณ VPC CNI๊ฐ VPC ๋ด๋ถ ํธ๋ํฝ์ SNAT ํ์ง ์๋๋ค๋ ์ ๋ ๊ฐ์ง๋ง ๊ธฐ์ตํด๋ ๋๋ถ๋ถ์ ์ฅ์ ๋ฅผ ์๋ฐฉํ ์ ์์ต๋๋ค.
ํต์ฌ ํ ์ค ์์ฝ:
"Pod๊ฐ ํด๋ผ์ด์ธํธ๋ก ์ฐธ์ฌํ๋ ๋ชจ๋ SG์, Pod์ Secondary CIDR(๋๋ ๋ ธ๋ SG ์ฐธ์กฐ)๋ฅผ ์ถ๊ฐํ๋ผ."
๋ค์ ๋จ๊ณ๋ก๋ AWS_VPC_K8S_CNI_EXTERNALSNAT ์ค์ ๊ณผ NAT Gateway ๋น์ฉ ์ต์ ํ, ๊ทธ๋ฆฌ๊ณ SecurityGroupPolicy(Security Groups for Pods)๋ฅผ ํ์ฉํ Pod๋ณ SG ๋ถ๋ฆฌ ์ ๋ต๋ ํจ๊ป ์ดํด๋ณด๋ฉด ์ข์ต๋๋ค.
