- Fargate๋
- Fargate์ ์ฅ์
- Fargate ์ฌ์ฉ ์ ์ฃผ์ ์ฌํญ
- Fargate ๋ฐฐํฌ ์ค์ต
- AWS EKS Fargate ๊ธฐ๋ฐ ํด๋ฌ์คํฐ์ ๋์ ๋ฐฉ์
- K8s API Service - Endpoints
- EKS ํ์ฅ ๋ฉํธ๋ฆญ API์ ๋ฆฌ์์ค ์ ๋ณด
- kube-system ๋ค์์คํ์ด์ค ๋ด ConfigMap ๋ชฉ๋ก
- netshoot ๋ํ๋ก์ด๋จผํธ
- ํ๋ ๊ถํ ํ์ทจ ์๋
- AWS ALB๋ก ๊ฒ์ ๋ํ๋ก์ด๋จผํธ ๋ฐฐํฌ
- EKS Ingress๋ฅผ ํตํด ์์ฑ๋ AWS ALB ํ์ธ
- ๋ฆฌ์์ค ์ญ์
- Fargate job
- Fargate Logging
- ์ค์ต ๋ฆฌ์์ค ์ ๋ฆฌ
25๋ ๋ AWS EKS Hands-on Study ์คํฐ๋ ์ ๋ฆฌ ๋ด์ฉ์ ๋๋ค.
Fargate๋
AWS Fargate๋ ์ปจํ ์ด๋ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๊ธฐ ์ํ ์๋ฒ๋ฆฌ์ค ์ปดํจํ ์์ง์ผ๋ก ์ฌ์ฉ์๋ ์๋ฒ๋ ํด๋ฌ์คํฐ๋ฅผ ์ง์ ํ๋ก๋น์ ๋ํ๊ฑฐ๋ ๊ด๋ฆฌํ ํ์ ์์ด ์ปจํ ์ด๋๋ง ์ ์ํ๊ณ ์คํํ ์ ์๋๋ก ์ง์ํ๋ค.
๊ธฐ์กด Amazon ECS ๋๋ Amazon EKS์์ ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ๊ธฐ ์ํด EC2 ์ธ์คํด์ค๋ฅผ ์ง์ ๊ตฌ์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ์๊ณผ ๋ฌ๋ฆฌ Fargate๋ ์ด๋ฌํ ์ธํ๋ผ๋ฅผ ์์ ํ ์ถ์ํํ๊ณ ์ปจํ ์ด๋ ๋จ์์ ๋ฆฌ์์ค ํ ๋น๊ณผ ์คํ์ ์ ๊ณตํ๋ค.
Fargate๋ ์ปจํ ์ด๋ ํ๋ํ๋๋ฅผ ๋ ๋ฆฝ๋ ๊ฒฝ๋ ๊ฐ์ ๋จธ์ ์์ ์คํ๋๋๋ก ์ค๊ณ๋์ด ์๋๋ฐ AWS์์ "Firecracker"๋ผ๋ ์์ฒด ํ์ดํผ๋ฐ์ด์ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ตฌํํ์์ผ๋ฉฐ ์ด ๊ธฐ์ ๋๋ถ์ ๊ฐ Fargate ์์ (Pod ๋๋ Task)์ ์์ ํ ๋ถ๋ฆฌ๋ ํ๊ฒฝ์์ ์คํ๋๋ค.
์ด๋ฌํ ๊ตฌ์กฐ๋ ๋ฉํฐ ํ ๋์ ํ๊ฒฝ์์๋ ๋ณด์ ๋ฆฌ์คํฌ๋ฅผ ์ค์ด๋ ๋ฐ ์ ๋ฆฌํ๋ฉฐ ๋์์ ๋ฆฌ์์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ฉฐ ๋ถํธ ํ์ ์ธก๋ฉด์์๋ ๋ฐ์ด๋ ์ฑ๋ฅ์ ํ๋ณดํ ์ ์๋ค.
Fargate์ ์ฅ์
Fargate๋ฅผ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ํฐ ์ด์ ์ค ํ๋๋ ์คํ ์ค์ผ์ผ๋ง๊ณผ ๋น์ฉ ์ต์ ํ ์ธก๋ฉด์ด๋ค.
์ฌ์ฉ์๋ ์ปจํ ์ด๋๊ฐ ํ์ํ ๋ฆฌ์์ค(cpu, memory)๋ง ์ ์ํ๋ฉด ๋๊ณ ์ค์ ์ปดํจํ ์์์ Fargate๊ฐ ๊ทธ์ ๋ง๊ฒ ํ ๋นํ๋ค. ์ ํด์ง ๋ฆฌ์์ค๋ฅผ ์ด๊ณผํ๊ฑฐ๋ ์ ํด ์ธ์คํด์ค์ ๋ํ ๋น์ฉ์ ๊ณ ๋ฏผํ ํ์๊ฐ ์์ผ๋ฉฐ ์ฌ์ฉํ ๋งํผ๋ง ๊ณผ๊ธ๋๋ ๊ตฌ์กฐ์ด๊ธฐ ๋๋ฌธ์ ์คํ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ์ง ์๋๋ผ๋ ๋น์ฉ ์์ธก์ด ์ฉ์ดํ๋ค. ํนํ, ์ํฌ๋ก๋๊ฐ ์ผ์ ํ์ง ์๊ณ ์ผ์์ ์ผ๋ก ํญ์ฆํ๊ฑฐ๋ ๊ฐ์์ค๋ฝ๊ฒ ๊ฐ์ํ๋ ํ๊ฒฝ์์ Fargate๊ฐ ์ ํฉํ ์ํคํ ์ฒ๋ผ๊ณ ๋ณผ ์ ์๋ค.
EKS์์ Fargate๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ, ํด๋ฌ์คํฐ ๋ด ์ผ๋ถ ๋ค์์คํ์ด์ค๋ ํน์ ๋ ์ด๋ธ ์กฐ๊ฑด์ ๋ง๋ ํ๋๋ค๋ง Fargate์์ ์คํ๋๋๋ก ์ค์ ํ ์ ์๋ค. ์ด๋ฅผ ์ํด Fargate Profile์ ์ ์ํ๋ฉฐ ์ด ์์์ ์ด๋ค ๋ค์์คํ์ด์ค์ ์ด๋ค ๋ ์ด๋ธ ์ ๋ ํฐ๋ฅผ ๊ฐ์ง ํ๋๊ฐ Fargate์์ ์คํ๋ ์ง๋ฅผ ๋ช ์ํ๋ค.
Fargate ํ๋๋ ์ผ๋ฐ EC2 ๋ ธ๋์์ ๋์ํ๋ ํ๋์ ๋ฌ๋ฆฌ Pod๋น 1๊ฐ์ ๊ฒฝ๋ VM์ด ์๋์ผ๋ก ์์ฑ๋๊ณ , ๊ณ ์ ํ ENI(Elastic Network Interface)๊ฐ ํ ๋น๋๋ค. ์ด ๊ตฌ์กฐ๋ Pod ๊ฐ ๋คํธ์ํฌ ๊ฒฉ๋ฆฌ๋ฅผ ๊ฐํํ๋ฉฐ IP ์ถฉ๋ ์์ด ๋๊ท๋ชจ ๋ถ์ฐ ํ๊ฒฝ์์ ์์ ์ ์ธ ํต์ ์ด ๊ฐ๋ฅํ๋๋ก ํด์ค๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์ฃผ์ ์ํฌ๋ก๋๋ฅผ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๊ณ ์ ํ ๋ Fargate๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค. AWS Fargate๋ ์ธํ๋ผ์ ๋ณต์ก์ฑ์ ์ค์ด๊ณ ์ปจํ ์ด๋ ์ค์ฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด์์ ๋จ์ํํ๋ ๋ฐ ์ต์ ํ๋ ์๋น์ค๋ค.
๋ณด์, ์๋ํ, ํ์ฅ์ฑ, ๊ทธ๋ฆฌ๊ณ ๋น์ฉ ํจ์จ์ฑ ์ธก๋ฉด์์ ๋ฐ์ด๋ ์ด์ ์ ์ ๊ณตํ๋ฉฐ ํนํ DevOps๋ MLOps ํ๊ฒฝ์ฒ๋ผ ๋น ๋ฅธ ๋ฐฐํฌ์ ๋ฏผ์ฒฉ์ฑ์ด ์ค์ํ ๊ฒฝ์ฐ ํ์ฉ๋๊ฐ ๋์ฑ ๋์์ง๋ค.
Fargate ์ฌ์ฉ ์ ์ฃผ์ ์ฌํญ
ํ๋๋ ๋ฐ๋์ ์ง์ ๋ ๋ฆฌ์์ค(cpu, memory)๋ฅผ ๋ช ํํ ์ ์ธํด์ผ ํ๋ฉฐ ๋ณผ๋ฅจ ๋ง์ดํธ ๋ฐฉ์์ ์ ํ์ด ์์ด EFS ์ธ์ ํผ์์คํดํธ ๋ณผ๋ฅจ ์ฌ์ฉ์ด ์ด๋ ค์ธ ์ ์๋ค.
๋ ธ๋๋ณ๋ก ํ๋์ฉ ์คํ๋์ด์ผ ํ๋ ๋ก๊ทธ ์์ง ์์ด์ ํธ์ ๊ฐ์ ๋ฐ๋ชฌ์ ์ Fargate์์ ์ง์ ์คํํ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ์ํฌ๋ก๋๋ EC2 ๋ ธ๋ ๊ธฐ๋ฐ์ผ๋ก ๋ณํ ์ด์ํด์ผ ํ๋ค.
Fargate ๋ฐฐํฌ ์ค์ต
terraform state list
data.aws_availability_zones.available
module.vpc.aws_default_network_acl.this[0]
module.vpc.aws_default_route_table.default[0]
module.vpc.aws_default_security_group.this[0]
module.vpc.aws_eip.nat[0]
module.vpc.aws_internet_gateway.this[0]
module.vpc.aws_nat_gateway.this[0]
module.vpc.aws_route.private_nat_gateway[0]
module.vpc.aws_route.public_internet_gateway[0]
module.vpc.aws_route_table.private[0]
module.vpc.aws_route_table.public[0]
module.vpc.aws_route_table_association.private[0]
module.vpc.aws_route_table_association.private[1]
module.vpc.aws_route_table_association.private[2]
module.vpc.aws_route_table_association.public[0]
module.vpc.aws_route_table_association.public[1]
module.vpc.aws_route_table_association.public[2]
module.vpc.aws_subnet.private[0]
module.vpc.aws_subnet.private[1]
module.vpc.aws_subnet.private[2]
module.vpc.aws_subnet.public[0]
module.vpc.aws_subnet.public[1]
module.vpc.aws_subnet.public[2]
module.vpc.aws_vpc.this[0]
AWS EKS Fargate ๊ธฐ๋ฐ ํด๋ฌ์คํฐ์ ๋์ ๋ฐฉ์
aws ec2 describe-vpcs --filter 'Name=isDefault,Values=false' --output yaml
k get nodes
NAME STATUS ROLES AGE VERSION
fargate-ip-10-10-13-33.ap-northeast-2.compute.internal Ready <none> 7m34s v1.30.8-eks-2d5f260
fargate-ip-10-10-23-214.ap-northeast-2.compute.internal Ready <none> 7m33s v1.30.8-eks-2d5f260
fargate-ip-10-10-28-33.ap-northeast-2.compute.internal Ready <none> 7m43s v1.30.8-eks-2d5f260
fargate-ip-10-10-32-126.ap-northeast-2.compute.internal Ready <none> 7m34s v1.30.8-eks-2d5f260
4๊ฐ์ ๋ ธ๋๋ค์ Fargate ๊ธฐ๋ฐ Pod๊ฐ ์คํ๋ ๋ ๋ง๋ค ์์ฑ๋ Micro VM์ด๋ค.
INTERNAL-IP๊ฐ Pod IP์ 1:1๋ก ๊ฐ์๋ฐ Fargate์์๋ ํ๋๋น 1๊ฐ์ ENI๋ฅผ ํ ๋นํ๋ฏ๋ก, Pod = Node = ENI 1๊ฐ๋ก ๋งคํ๋๋ค.
k get po -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
kube-system aws-load-balancer-controller-849b7f6bbf-5q2wv 1/1 Running 0 8m7s 10.10.13.33 fargate-ip-10-10-13-33.ap-northeast-2.compute.internal <none> <none>
kube-system aws-load-balancer-controller-849b7f6bbf-zrl9f 1/1 Running 0 8m7s 10.10.28.33 fargate-ip-10-10-28-33.ap-northeast-2.compute.internal <none> <none>
kube-system coredns-64696d8b7f-4dxzj 1/1 Running 0 8m9s 10.10.23.214 fargate-ip-10-10-23-214.ap-northeast-2.compute.internal <none> <none>
kube-system coredns-64696d8b7f-7nczc 1/1 Running 0 8m9s 10.10.32.126 fargate-ip-10-10-32-126.ap-northeast-2.compute.internal <none> <none>
aws-load-balancer-controller ํ๋์ธ๋ฐ ํ๋์ ip๊ฐ ๋ ธ๋์ ๋์ผํ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Fargate๋ ํ๋ ๋จ์๋ก ๊ฒฉ๋ฆฌ๋ ๊ฒฝ๋ VM์ ์์ฑํ๋๋ฐ ๊ทธ VM์ด ๋ ธ๋๋ก ๋ฑ๋ก๋๋ฉฐ, ํ๋ IP = ๋ ธ๋ IP = ENI IP ๋ก ๊ฐ๋ค.
K8s API Service - Endpoints
kubectl get svc,ep
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 172.20.0.1 <none> 443/TCP 28m
NAME ENDPOINTS AGE
endpoints/kubernetes 10.0.44.211:443,10.0.7.38:443 28m
IP๋ค์ EKS์์ ๊ด๋ฆฌํ๋ ENI (Elastic Network Interface) ์ ๋ถ์ด์๋๊ฒ์ด๊ณ , EKS control plane์ด ์ฌ์ฉํ๋ IP์ด๋ฉฐ
Fargate ๋ ธ๋๋ค์ด๋์ ๋ณ๋์ ๊ฒ์ด๋ค.
k get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
csr-54dhq 7m52s kubernetes.io/kubelet-serving system:node:fargate-ip-10-10-32-126.ap-northeast-2.compute.internal <none> Approved,Issued
csr-9596h 8m1s kubernetes.io/kubelet-serving system:node:fargate-ip-10-10-28-33.ap-northeast-2.compute.internal <none> Approved,Issued
csr-kp54q 7m53s kubernetes.io/kubelet-serving system:node:fargate-ip-10-10-13-33.ap-northeast-2.compute.internal <none> Approved,Issued
csr-zwr9v 7m51s kubernetes.io/kubelet-serving system:node:fargate-ip-10-10-23-214.ap-northeast-2.compute.internal <none> Approved,Issued
kubectl describe node | grep eks.amazonaws.com/compute-type
eks.amazonaws.com/compute-type=fargate
Taints: eks.amazonaws.com/compute-type=fargate:NoSchedule
eks.amazonaws.com/compute-type=fargate
Taints: eks.amazonaws.com/compute-type=fargate:NoSchedule
eks.amazonaws.com/compute-type=fargate
Taints: eks.amazonaws.com/compute-type=fargate:NoSchedule
eks.amazonaws.com/compute-type=fargate
Taints: eks.amazonaws.com/compute-type=fargate:NoSchedule
kubectl get pdb -n kube-system
NAME MIN AVAILABLE MAX UNAVAILABLE ALLOWED DISRUPTIONS AGE
aws-load-balancer-controller N/A 1 1 72m
coredns N/A 1 1 79m
kubectl get apiservices.apiregistration.k8s.io | grep eks
v1.metrics.eks.amazonaws.com kube-system/eks-extension-metrics-api True 80m
EKS๊ฐ ์์ฒด์ ์ผ๋ก ์ค์นํ metrics.eks.amazonaws.com API๋ฅผ ํตํด ํ๋์ ๋ ธ๋์ ๋ฉํธ๋ฆญ์ ์์งํ๋ค.
ํ์ค metrics-server์ ๋น์ทํ ์ญํ ์ ํ๋ฉฐ, kubectl top pod, kubectl top node ๊ฐ์ ๋ช ๋ น์ด๊ฐ ๋์ํ๊ธฐ ์ํด ํ์ํ๋ค.
EKS ํ์ฅ ๋ฉํธ๋ฆญ API์ ๋ฆฌ์์ค ์ ๋ณด
kubectl get --raw "/apis/metrics.eks.amazonaws.com/v1" | jq
{
"kind": "APIResourceList",
"apiVersion": "v1",
"groupVersion": "metrics.eks.amazonaws.com/v1",
"resources": [
{
"name": "kcm",
"singularName": "kcm",
"namespaced": false,
"kind": "KCM",
"verbs": []
},
{
"name": "kcm/metrics",
"singularName": "",
"namespaced": false,
"kind": "KCM",
"verbs": [
"get"
]
},
{
"name": "ksh",
"singularName": "ksh",
"namespaced": false,
"kind": "KSH",
"verbs": []
},
{
"name": "ksh/metrics",
"singularName": "",
"namespaced": false,
"kind": "KSH",
"verbs": [
"get"
]
}
]
}
์ด API๋ EKS ๊ด๋ฆฌํ ์ปจํธ๋กค ํ๋ ์ธ(KCM, Scheduler)์ ๋ด๋ถ ๋ฉํธ๋ฆญ์ ๋ ธ์ถํ๋ AWS EKS ์ ์ฉ ํ์ฅ ๊ธฐ๋ฅ์ด๋ค.
Kube Controller Manager์ ์ปจํธ๋กค๋ฌ ํ ์ง์ฐ, ๋ฆฌ์์ค ๋ฆฌ์ปจ์ฌ์ผ์ ๋ํ๋ด๋ ๋ฉํธ๋ฆญ๊ณผ, Kube Scheduler ์ค์ผ์ค๋ง ์๊ฐ, ์คํจ์จ ๋งคํธ๋ฆญ์ ์๋ฏธํ๋ค.
EKS์์ ์ฌ์ฉ์์๊ฒ ๊ด๋ฆฌํ ์ปจํธ๋กค ํ๋ ์ธ์ ์ฑ๋ฅ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฉฐ Prometheus/CloudWatch ๋ฑ์์ ๋ชจ๋ํฐ๋ง์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
kube-system ๋ค์์คํ์ด์ค ๋ด ConfigMap ๋ชฉ๋ก
kubectl get cm -n kube-system
NAME DATA AGE
amazon-vpc-cni 7 80m
aws-auth 1 76m
aws-load-balancer-controller-leader 0 72m
coredns 1 80m
extension-apiserver-authentication 6 81m
kube-apiserver-legacy-service-account-token-tracking 1 81m
kube-proxy 1 80m
kube-proxy-config 1 80m
kube-root-ca.crt 1 81m
kubectl get cm -n kube-system aws-auth -o yaml
data:
mapRoles: |
- rolearn: arn:aws:iam::<๊ณ์ ๋ฒํธ>:role/app_wildcard-<๋๋ค๊ฐ>
username: system:node:{{SessionName}}
groups:
- system:bootstrappers
- system:nodes
- system:node-proxier
- rolearn: arn:aws:iam::<๊ณ์ ๋ฒํธ>:role/kube-system-<๋๋ค๊ฐ>
username: system:node:{{SessionName}}
groups:
- system:bootstrappers
- system:nodes
- system:node-proxier
aws-auth ConfigMap์ EKS์ ํต์ฌ ์ค์ ์ผ๋ก, IAM Role โ K8s ์ฌ์ฉ์/๊ทธ๋ฃน ๋งคํ์ ์ ์ํ๋ค.
์ฌ๊ธฐ์ ๋ฑ๋ก๋ IAM Role๋ค์ EKS Fargate Profile์ ์ํด ์๋์ผ๋ก ์์ฑ๋ ๊ฒ์ด๊ณ system:node, system:node-proxier ๊ถํ์ด ์์ด์ผ ๋ ธ๋ ์ญํ ์ ํ๊ณ ์๋น์ค/์๋ํฌ์ธํธ ๋ฑ์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
kubectl rbac-tool lookup system:node-proxier
SUBJECT | SUBJECT TYPE | SCOPE | NAMESPACE | ROLE | BINDING
----------------------+--------------+-------------+-----------+---------------------+-------------------------
system:node-proxier | Group | ClusterRole | | system:node-proxier | eks:kube-proxy-fargate
EKS Fargate์์๋ kube-proxy๋ ์ปจํธ๋กค ํ๋ ์ธ์์ ๊ด๋ฆฌ๋๋ ํํ๋ผ ์ง์ ํ๋๋ก ๋์ฐ์ง ์๊ณ ์ค์ ํธ๋ํฝ ๋ผ์ฐํ ์ AWS VPC CNI์ ์ํด ENI ๋จ์์ ์ฒ๋ฆฌ๋๋ค.
netshoot ๋ํ๋ก์ด๋จผํธ
kubectl create ns study-aews
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: netshoot
namespace: study-aews
spec:
replicas: 1
selector:
matchLabels:
app: netshoot
template:
metadata:
labels:
app: netshoot
spec:
containers:
- name: netshoot
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
resources:
requests:
cpu: 500m
memory: 500Mi
limits:
cpu: 2
memory: 2Gi
terminationGracePeriodSeconds: 0
EOF
study-aews netshoot-84558cd8d9-l5k7d 1/1 Running 0 72s
ํ๋๊ฐ ๋จ๊ธฐ๊น์ง 1๋ถ 10์ด ์ ๋ ์์๋์๋ค.
netshoot-84558cd8d9-l5k7d ๎ฐ ~ ๎ฐ ip -c a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
4: eth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc noqueue state UP group default qlen 1000
link/ether 6e:fe:81:61:4a:54 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 10.10.21.243/20 brd 10.10.31.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::6cfe:81ff:fe61:4a54/64 scope link
valid_lft forever preferred_lft forever
AWS EKS์์ Fargate ๊ธฐ๋ฐ์ผ๋ก ์์ฑ๋ netshoot ํ๋๋ AWS๊ฐ ์ ๊ณตํ๋ ๊ฒฝ๋ ๊ฐ์๋จธ์ (๋ง์ดํฌ๋กVM) ์์์ ์คํ๋๋ค.
๋จผ์ ๋คํธ์ํฌ ๊ตฌ์ฑ์ ๋ณด๋ฉด, ip a ๋ช ๋ น ๊ฒฐ๊ณผ๋ฅผ ํตํด ํ๋๋ eth0@if6 ์ธํฐํ์ด์ค๋ฅผ ํตํด 10.10.21.243/20์ด๋ผ๋ IP๋ฅผ ํ ๋น๋ฐ๊ณ ์๋ค.
์ด๋ AWS VPC CNI ํ๋ฌ๊ทธ์ธ์ ํตํด ์๋์ผ๋ก VPC ์๋ธ๋ท์ ํ๋ผ์ด๋น IP ์ฃผ์๊ฐ ํ ๋น๋ ๊ฒ์ผ๋ก, Fargate๋ ํ๋๋น ENI(Elastic Network Interface)๋ฅผ ํ๋์ฉ ๋ถ์ฌํ๋ค. ์ด๋ก ์ธํด ํ๋๋ EC2 ์ธ์คํด์ค ์์ด๋ ๊ณ ์ ํ VPC ๋คํธ์ํฌ ์์ IP๋ฅผ ๊ฐ๊ณ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ฆฌ์์ค๋ค๊ณผ ๋์ผํ ๋คํธ์ํฌ ๋ด์์ ํต์ ํ ์ ์๋ค
netshoot-84558cd8d9-l5k7d ๎ฐ ~ ๎ฐ cat /etc/resolv.conf
search study-aews.svc.cluster.local svc.cluster.local cluster.local ap-northeast-2.compute.internal
nameserver 172.20.0.10
options ndots:5
์ด ํ๋๋ /etc/resolv.conf ํ์ผ์ ํตํด DNS ์ค์ ์ 172.20.0.10์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค. ์ด๋ ํด๋ฌ์คํฐ ๋ด CoreDNS์ ClusterIP์ด๋ฉฐ, search ๋๋ฉ์ธ์ผ๋ก study-aews.svc.cluster.local, cluster.local, ap-northeast-2.compute.internal ๋ฑ์ด ์ค์ ๋์ด ์์ด ์ฟ ๋ฒ๋คํฐ์ค ๋ด๋ถ ์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ๋ฅผ ์ง์ํ๋ค.
netshoot-84558cd8d9-l5k7d ๎ฐ ~ ๎ฐ curl ipinfo.io/ip
15.164.5.221#
์ค์ ๋ก curl ipinfo.io/ip ๋ช ๋ น์ ํตํด ์ธ๋ถ์์ ๋ณผ ์ ์๋ ํผ๋ธ๋ฆญ IP๋ 15.164.5.221์ด๋ฉฐ ์ด๋ NAT Gateway๋ฅผ ํตํด ์ธํฐ๋ท์ผ๋ก ๋๊ฐ๋ ์ถ๊ตฌ IP๋ฅผ ์๋ฏธํ๋ค.
netshoot-84558cd8d9-l5k7d ๎ฐ ~ ๎ฐ ping -c 1 10.10.32.126
PING 10.10.32.126 (10.10.32.126) 56(84) bytes of data.
64 bytes from 10.10.32.126: icmp_seq=1 ttl=125 time=1.26 ms
--- 10.10.32.126 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.264/1.264/1.264/0.000 ms
๋ค๋ฅธ ํ๋๋ก์ ํ ๋ํ ์ ์์ ์ผ๋ก ํต์ ํ์ธ์ด ๋๋ค.
netshoot-84558cd8d9-l5k7d ๎ฐ ~ ๎ฐ df -Th
Filesystem Type Size Used Available Use% Mounted on
overlay overlay 29.4G 11.8G 16.0G 43% /
tmpfs tmpfs 64.0M 0 64.0M 0% /dev
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
overlay overlay 29.4G 11.8G 16.0G 43% /etc/hosts
overlay overlay 29.4G 11.8G 16.0G 43% /dev/termination-log
/dev/nvme1n1 ext4 29.4G 11.8G 16.0G 43% /etc/hostname
/dev/nvme1n1 ext4 29.4G 11.8G 16.0G 43% /etc/resolv.conf
shm tmpfs 64.0M 0 64.0M 0% /dev/shm
tmpfs tmpfs 2.0G 12.0K 2.0G 0% /run/secrets/kubernetes.io/serviceaccount
tmpfs tmpfs 1.9G 0 1.9G 0% /proc/acpi
tmpfs tmpfs 64.0M 0 64.0M 0% /proc/kcore
tmpfs tmpfs 64.0M 0 64.0M 0% /proc/keys
tmpfs tmpfs 64.0M 0 64.0M 0% /proc/latency_stats
tmpfs tmpfs 64.0M 0 64.0M 0% /proc/timer_list
tmpfs tmpfs 64.0M 0 64.0M 0% /proc/sched_debug
tmpfs tmpfs 1.9G 0 1.9G 0% /sys/firmware
netshoot-84558cd8d9-l5k7d ๎ฐ ~ ๎ฐ cat /etc/fstab
/dev/cdrom /media/cdrom iso9660 noauto,ro 0 0
/dev/usbdisk /media/usb vfat noauto,ro 0 0
๋์คํฌ ์ ๋ณด๋ฅผ ๋ณด๋ฉด lsblk ๋ฐ df -Th ๋ช ๋ น์ด๋ฅผ ํตํด / ๋ฃจํธ ํ์ผ ์์คํ ๊ณผ ์ฌ๋ฌ overlay ๋ง์ดํธ ํฌ์ธํธ๊ฐ ํ์ธ๋๋ค. Fargate์์๋ ๊ฐ ํ๋๋ฅผ ์คํํ ๋ ๋ ๋ฆฝ๋ ephemeral storage๊ฐ ์ ๊ณต๋๋ค.
/dev/nvme1n1 ๋๋ฐ์ด์ค๊ฐ ๋ง์ดํธ๋์ด ext4 ํฌ๋งท์ผ๋ก ํฌ๋งท๋ ์ํ๋ค. ๋ฃจํธ ํ์ผ ์์คํ ๋ฐ /etc/hostname, /etc/resolv.conf ๊ฐ์ ์ฃผ์ ์ค์ ํ์ผ๋ ์ด ๋์คํฌ ์์ overlay ํ์ผ์์คํ ํํ๋ก ๋ง์ดํธ๋์ด ์์ผ๋ฉฐ, ์ด๋ ํ๋ ๊ฐ ๊ฒฉ๋ฆฌ์ ๋ณด์ ์ ์ง๋ฅผ ์ํ ๊ตฌ์กฐ๋ค.
Fargate๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ต๋ 20GiB์ ephemeral storage๋ฅผ ์ ๊ณตํ๊ณ ์ฌ์ฉ๋์ df ๋ช ๋ น์ ํตํด 43%๋ก ํ์ธ๋๋ฉฐ 11.8GiB๋ฅผ ์ฌ์ฉ ์ค์์ ๋ณด์ฌ์ค๋ค. /etc/fstab์๋ cdrom, usb ๊ด๋ จ ๋ง์ดํธ ์ค์ ๋ง ์กด์ฌํ๋ฉฐ ์ด๋ ์ปจํ ์ด๋ ๊ธฐ๋ฐ ์ด๋ฏธ์ง์ ํฌํจ๋ ๋ํดํธ ํญ๋ชฉ์ผ ๊ฐ๋ฅ์ฑ์ด ๋๋ค.
ํ๋ ๊ถํ ํ์ทจ ์๋
kubectl apply -f - <<EOF
apiVersion: v1
kind: Pod
metadata:
name: root-shell
namespace: study-aews
spec:
containers:
- command:
- /bin/cat
image: alpine:3
name: root-shell
securityContext:
privileged: true
tty: true
stdin: true
volumeMounts:
- mountPath: /host
name: hostroot
hostNetwork: true
hostPID: true
hostIPC: true
tolerations:
- effect: NoSchedule
operator: Exists
- effect: NoExecute
operator: Exists
volumes:
- hostPath:
path: /
name: hostroot
EOF
pod/root-shell created
ํ๋์ SecurityContext ์ค์ ์ ์ ์ฉํ์ฌ ํธ์คํธ ๋ค์์คํ์ด์ค๋ฅผ ํ์ทจํ ์ ์๋ ์๋๋ฆฌ์ค์ด๋ค.
kubectl get pod -n study-aews root-shell
NAME READY STATUS RESTARTS AGE
root-shell 0/1 Pending 0 7s
kubectl describe pod -n study-aews root-shell | grep Events: -A 10
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedScheduling 12s fargate-scheduler Pod not supported on Fargate: fields not supported: HostNetwork, HostPID, HostIPC, volumes not supported: hostroot is of an unsupported volume Type, invalid SecurityContext fields: Privileged
AWS Fargate์ ๋ณด์ ๋ชจ๋ธ ์์ ์ ์ฝ์ฌํญ์ด ์๋ํ์ฌ ์์ ๊ฐ์ ํ๋ ์คํ์ ์์ฒ์ ์ผ๋ก ์ฐจ๋จํ๋ค:
Fargate๋ ์ปจํ ์ด๋ ๋จ์๋ก microVM์ ์์ฑํ๋ฏ๋ก ํธ์คํธ ๋ค์์คํ์ด์ค ๊ณต์ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ๋ฉฐ, hostPath ํ์ ์ ๋ณผ๋ฅจ์ Fargate์์ ์ง์ํ์ง ์๋๋ค.
privileged: true ๊ฐ์ ๋ณด์ ์ํ ์ค์ ์ Fargate์์ ๊ธ์ง๋ ํ๋๋ก ๊ฐ์ฃผ๋์ด ์คํ๋์ง ์์ผ๋ฉฐ Fargate๋ ์์ ํ ๊ฒฉ๋ฆฌ ํ๊ฒฝ์ ์ ์ ๋ก ์ค๊ณ๋์๊ธฐ ๋๋ฌธ์, ์ด๋ฐ ์ค์ ์ ์ง์๋์ง ์๋ ํ๋๋ก ์ฒ๋ฆฌ๋์ด ์ค์ผ์ค๋ฌ ๋จ๊ณ์์ ๊ฑฐ๋ถ๋๋ค.
AWS ALB๋ก ๊ฒ์ ๋ํ๋ก์ด๋จผํธ ๋ฐฐํฌ
public.ecr.aws/l6m2t8p7/docker-2048:latest ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก 2048 ๊ฒ์์ ์คํํ๋ ํ๋ 2๊ฐ๋ฅผ ์์ฑํด๋ณธ๋ค.
Service ๋ฆฌ์์ค๋ ์์ฑ๋ ํ๋๋ค์ ๋ด๋ถ์ ์ผ๋ก ํ๋์ ๋ ผ๋ฆฌ์ ์๋ํฌ์ธํธ๋ก ์ฐ๊ฒฐ ํ ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ service-2048์ด๋ผ๋ ์ด๋ฆ์ ํตํด ํฌํธ 80์ผ๋ก ํธ๋ํฝ์ ์ ๋ฌ๋ฐ๊ฒ ํ๊ณ , Ingress ๋ฆฌ์์ค๋ฅผ ํตํด ์ธ๋ถ์์ 2048 ๊ฒ์์ ์ ์ํ ์ ์๋๋ก ํ๋ค.
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
namespace: study-aews
name: deployment-2048
spec:
selector:
matchLabels:
app.kubernetes.io/name: app-2048
replicas: 2
template:
metadata:
labels:
app.kubernetes.io/name: app-2048
spec:
containers:
- image: public.ecr.aws/l6m2t8p7/docker-2048:latest
imagePullPolicy: Always
name: app-2048
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
namespace: study-aews
name: service-2048
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
type: ClusterIP
selector:
app.kubernetes.io/name: app-2048
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
namespace: study-aews
name: ingress-2048
annotations:
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-2048
port:
number: 80
EOF
kubectl get ingress,svc,ep,pod -n study-aews
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/ingress-2048 alb * k8s-studyaew-ingress2-08c53ee834-445593286.ap-northeast-2.elb.amazonaws.com 80 56s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/service-2048 ClusterIP 172.20.222.46 <none> 80/TCP 56s
NAME ENDPOINTS AGE
endpoints/service-2048 10.10.29.119:80,10.10.37.110:80 56s
NAME READY STATUS RESTARTS AGE
pod/deployment-2048-85f8c7d69-hjpcb 1/1 Running 0 56s
pod/deployment-2048-85f8c7d69-k26dp 1/1 Running 0 56s
pod/netshoot-84558cd8d9-l5k7d 1/1 Running 0 13m
kubectl get targetgroupbindings -n study-aews
NAME SERVICE-NAME SERVICE-PORT TARGET-TYPE AGE
k8s-studyaew-service2-0f181eccc6 service-2048 80 ip 72s
kubectl describe ingress -n study-aews ingress-2048
Name: ingress-2048
Labels: <none>
Namespace: study-aews
Address: k8s-studyaew-ingress2-08c53ee834-445593286.ap-northeast-2.elb.amazonaws.com
Ingress Class: alb
Default backend: <default>
Rules:
Host Path Backends
---- ---- --------
*
/ service-2048:80 (10.10.37.110:80,10.10.29.119:80)
Annotations: alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfullyReconciled 92s ingress Successfully reconciled
kubectl get ingress -n study-aews ingress-2048 -o jsonpath='{.status.loadBalancer.ingress[0].hostname}' | awk '{ print "Game URL = http://"$1 }'
Game URL = http://k8s-studyaew-ingress2~~.com

EKS Ingress๋ฅผ ํตํด ์์ฑ๋ AWS ALB ํ์ธ

์ฌ์ฉ์๊ฐ ALB DNS์ ์ ์ํ๊ฒ ๋๋ฉด ALB์ ๋ฆฌ์ค๋๊ฐ / ๊ฒฝ๋ก ํจํด ๊ท์น์ ๋ฐ๋ผ ํธ๋ํฝ์ ์๋น์ค๋ก ์ ๋ฌํ๋ค.
์๋น์ค๋ ๋์ ๊ทธ๋ฃน์ธ ํ๋๋ค๋ก ํธ๋ํฝ์ ํฌ์๋ฉํ๋ฉฐ ๋ ํ๋๋ ๊ฐ๊ฐ ํฌํธ 80์์ ์๋ตํ๊ณ ALB๋ ์์ฒญ์ ๋ถ์ฐ ์ฒ๋ฆฌํ์ฌ ๋ก๋๋ฐธ๋ฐ์ฑ ์ญํ ์ ์ํํ๊ฒ ๋๋ค.
๋ฆฌ์์ค ์ญ์
kubectl delete ingress ingress-2048 -n study-aews
kubectl delete svc service-2048 -n study-aews && kubectl delete deploy deployment-2048 -n study-aews
Fargate job
cat <<EOF | kubectl apply -f -
apiVersion: batch/v1
kind: Job
metadata:
name: busybox1
namespace: study-aews
spec:
template:
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "sleep 10"]
restartPolicy: Never
ttlSecondsAfterFinished: 60 # <-- TTL controller
---
apiVersion: batch/v1
kind: Job
metadata:
name: busybox2
namespace: study-aews
spec:
template:
spec:
containers:
- name: busybox
image: busybox
command: ["/bin/sh", "-c", "sleep 10"]
restartPolicy: Never
EOF
kubectl get job,pod -n study-aews
NAME STATUS COMPLETIONS DURATION AGE
job.batch/busybox1 Running 0/1 25s 25s
job.batch/busybox2 Running 0/1 25s 25s
NAME READY STATUS RESTARTS AGE
pod/busybox1-b86hr 0/1 Pending 0 25s
pod/busybox2-d2lpt 0/1 Pending 0 25s
pod/netshoot-84558cd8d9-l5k7d 1/1 Running 0 23m
kubectl get job,pod -n study-aews
NAME STATUS COMPLETIONS DURATION AGE
job.batch/busybox1 Complete 1/1 58s 60s
job.batch/busybox2 Complete 1/1 56s 60s
NAME READY STATUS RESTARTS AGE
pod/busybox1-b86hr 0/1 Completed 0 60s
pod/busybox2-d2lpt 0/1 Completed 0 60s
pod/netshoot-84558cd8d9-l5k7d 1/1 Running 0 24m
kubectl get job,pod -n study-aews
NAME STATUS COMPLETIONS DURATION AGE
job.batch/busybox2 Complete 1/1 56s 2m48s
NAME READY STATUS RESTARTS AGE
pod/busybox2-d2lpt 0/1 Completed 0 2m49s
pod/netshoot-84558cd8d9-l5k7d 1/1 Running 0 26m
ํ๋๋ฅผ ๋ฐฐํฌํ๋ฉด 60์ด ์ ๊น์ง๋ Pending์ด์๋ค๊ฐ 60์ด ์ดํ๋ถํฐ๋ ํ๋๊ฐ ์คํ๋๋ฉฐ ์๋ฃ๋ ์์ ๋ถํฐ๋ ์ญ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Fargate Logging
cat <<EOF | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
name: sample-app
namespace: study-aews
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
ports:
- containerPort: 80
name: http
resources:
requests:
cpu: 500m
memory: 500Mi
limits:
cpu: 2
memory: 2Gi
---
apiVersion: v1
kind: Service
metadata:
name: sample-app
namespace: study-aews
spec:
selector:
app: nginx
ports:
- port: 80
targetPort: 80
protocol: TCP
type: ClusterIP
EOF
kubectl get pod -n study-aews -l app=nginx
NAME READY STATUS RESTARTS AGE
sample-app-7596c66778-7j6mb 1/1 Running 0 74s
sample-app-7596c66778-msd9z 1/1 Running 0 74s
kubectl exec -it deploy/netshoot -n study-aews -- curl sample-app | grep title
while true; do kubectl exec -it deploy/netshoot -n study-aews -- curl sample-app | grep title; sleep 1; echo ; date; done;
<title>Welcome to nginx!</title>
<title>Welcome to nginx!</title>
2025๋
3์ 23์ผ ์ผ์์ผ 04์ 33๋ถ 42์ด KST
<title>Welcome to nginx!</title>
2025๋
3์ 23์ผ ์ผ์์ผ 04์ 33๋ถ 44์ด KST
<title>Welcome to nginx!</title>
2025๋
3์ 23์ผ ์ผ์์ผ 04์ 33๋ถ 45์ด KST
<title>Welcome to nginx!</title>

curl ์์ฒญ์ ๋ํ nginx ์๋ต ๋ก๊ทธ๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ ์ ์๋ค.
์ค์ต ๋ฆฌ์์ค ์ ๋ฆฌ
terraform destroy -auto-approve
+)๋ง์ฝ ์ค์ ์ด ๊ผฌ์ฌ์ ์๋์ ๊ฐ์ ์๋ฌ๊ฐ ๋๋ค๋ฉด..
โท
โ Error: Get "http://localhost/api/v1/namespaces/app-2048": dial tcp 127.0.0.1:80: connect: connection refused
โ
โ
โต
โท
โ Error: Get "http://localhost/api/v1/namespaces/app-2048/services/app-2048": dial tcp 127.0.0.1:80: connect: connection refused
โ
โ
โต
โท
โ Error: Get "http://localhost/apis/apps/v1/namespaces/app-2048/deployments/app-2048": dial tcp 127.0.0.1:80: connect: connection refused
โ
โ
โต
โท
โ Error: Get "http://localhost/api/v1/namespaces/aws-observability": dial tcp 127.0.0.1:80: connect: connection refused
โ
โ with module.eks_blueprints_addons.kubernetes_namespace_v1.aws_observability[0],
โ on .terraform/modules/eks_blueprints_addons/main.tf line 2569, in resource "kubernetes_namespace_v1" "aws_observability":
โ 2569: resource "kubernetes_namespace_v1" "aws_observability" {
โ
๋์ ๊ฒฝ์ฐ์๋ northeast-2๋ก ์๋๊ณ west2๋ก ์๋ชป ์์ฑ์ด ๋์์ด์ kube config๊ฐ ๊ผฌ์ฌ์ ์ด๋ ๊ฒ ์ญ์ ๊ฐ ์ ๋๋ก ์๋๋๋ฐ
๋์๋ณด๋์ ๋ค์ด๊ฐ์ fargate eks ํ๋กํ ๋ชจ๋ ์ญ์ ํ๊ณ ํด๋ฌ์คํฐ ์ญ์ ์ vpc ์ญ์ ๋ฅผ ์๋์ผ๋ก ์งํํด์ฃผ์๋๋ ์ ๋๋ก ์ญ์ ๋์๋ค. ใ _ใ
๋ง์ฝ ํ ๋ผํผ ํ์ผ์ด ๊ผฌ์์ผ๋ฉด ๋ค์ ํด๋ก ๋ฐ์์ ๊นจ๋ํ๊ฒ ์งํํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ๋ค.
'Infra > AWS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[AEWS] #9์ฃผ์ฐจ EKS ๋ธ๋ฃจ ๊ทธ๋ฆฐ ๋ง์ด๊ทธ๋ ์ด์ with Terraform (0) | 2025.04.03 |
---|---|
[AEWS] #8์ฃผ์ฐจ ์ ํจ์ค, ArgoCD ์ค์ต (1) | 2025.03.30 |
[AEWS] #6์ฃผ์ฐจ Kyverno ์ค์ต (5) (0) | 2025.03.16 |
[AEWS] #6์ฃผ์ฐจ IRSA ์ค์ต (4) (1) | 2025.03.16 |
[AEWS] #6์ฃผ์ฐจ EKS ์ธ์ฆ/์ธ๊ฐ (3) (1) | 2025.03.16 |