반응형
Azure Kubernetes Service(AKS)에서 Pod, Deployment, Service는 Kubernetes의 핵심 리소스로, 애플리케이션을 배포하고 네트워크를 구성하는 데 사용됩니다.
1. Pod란? (Kubernetes의 최소 실행 단위)
✅ Pod 개념
- Pod는 하나 이상의 컨테이너를 포함하는 Kubernetes의 최소 실행 단위
- 일반적으로 하나의 Pod에는 하나의 컨테이너만 포함되지만, Sidecar 패턴을 사용해 여러 개의 컨테이너를 포함할 수도 있음
- 같은 Pod 내 컨테이너들은 localhost로 서로 통신 가능
- Pod는 영구적인 존재가 아니며, 실패 시 다시 생성됨 (Ephemeral)
📌 Pod 예제 (YAML)
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
🔹 Pod는 직접 생성하지 않고 보통 Deployment를 통해 관리됨 (바로 생성하면 관리 어려움)
2. Deployment란? (Pod의 배포 및 관리)
✅ Deployment 개념
- Deployment는 Pod의 생성, 업데이트, 삭제를 관리하는 컨트롤러
- ReplicaSet을 통해 원하는 개수(Replicas)의 Pod를 유지
- 배포 시 Rolling Update 및 Rollback 기능을 제공
📌 Deployment 예제 (YAML)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3 # 3개의 Pod 유지
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
🔹 Deployment는 항상 ReplicaSet을 관리하며, ReplicaSet이 Pod를 생성
✅ Deployment 동작 방식
- kubectl apply -f deployment.yaml 실행
- Deployment → ReplicaSet 생성 → 지정된 수만큼 Pod 생성
- Deployment가 상태를 유지하며, Pod가 실패하면 자동으로 재생성
- 새로운 버전 배포 시 Rolling Update 방식으로 점진적 배포
3. Service란? (Pod 간 네트워크 및 외부 연결)
✅ Service 개념
- Pod는 동적으로 생성/삭제되므로, 직접 접근하면 IP가 변경됨
- Service는 Pod의 IP 변경과 무관하게 트래픽을 안정적으로 전달하는 네트워크 엔드포인트 역할
- LoadBalancer, ClusterIP, NodePort 등의 타입이 존재
📌 Service 예제 (YAML)
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app # 같은 라벨을 가진 Pod로 트래픽 전달
ports:
- protocol: TCP
port: 80 # Service에서 노출하는 포트
targetPort: 80 # Pod에서 사용 중인 포트
type: ClusterIP # 기본 타입 (내부에서만 접근 가능)
✅ Service 동작 방식
- Service는 Label Selector를 사용하여 Pod를 찾아 트래픽을 전달
- 내부적으로 Kubernetes Proxy(IPTables 또는 IPVS)를 이용해 Pod 로드 밸런싱
- DNS 서비스(Kube-DNS 또는 CoreDNS)를 이용해 서비스명 기반 라우팅 지원
4. Service의 주요 타입
Service Type설명사용 예
ClusterIP (기본값) | 클러스터 내부에서만 접근 가능 | 마이크로서비스 간 내부 통신 |
NodePort | 모든 노드의 특정 포트에서 접근 가능 | 클러스터 외부에서 직접 접근 |
LoadBalancer | Azure Load Balancer를 통해 외부에서 접근 가능 | 퍼블릭 서비스 운영 |
ExternalName | DNS 이름을 내부 서비스로 매핑 | 외부 API 호출 시 사용 |
📌 LoadBalancer Service 예제
apiVersion: v1
kind: Service
metadata:
name: my-loadbalancer
spec:
type: LoadBalancer # Azure Load Balancer 생성됨
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
🔹 Azure 환경에서는 자동으로 Azure Load Balancer가 생성됨
🔹 kubectl get svc 실행하면 EXTERNAL-IP가 부여됨
5. Pod, Deployment, Service의 관계
✅ 전체적인 구조
Client → LoadBalancer Service → NodePort Service → ClusterIP Service → Deployment → ReplicaSet → Pod
- Deployment가 Pod를 관리
- Service가 Pod 간 네트워크 및 외부 트래픽을 관리
📌 종합적인 예제 (Deployment + Service)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: LoadBalancer
- kubectl apply -f example.yaml 실행 시
- Deployment가 3개의 Pod를 생성
- Service가 Pod를 찾아 트래픽 전달
- Azure Load Balancer가 외부에서 접근 가능하도록 설정됨
6. AKS에서 추가적인 고려 사항
✅ Pod 자동 확장 (HPA)
- Horizontal Pod Autoscaler (HPA)를 사용하여 Pod 개수를 자동으로 조절 가능
- 설정 예제:
kubectl autoscale deployment my-deployment --cpu-percent=50 --min=2 --max=10
- CPU 사용률이 50%를 초과하면 Pod 개수가 자동 증가
✅ Pod 네트워크 정책 (Network Policy)
- 특정 네트워크 트래픽만 허용하도록 NetworkPolicy를 적용할 수 있음
- 예제:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: allow-specific-namespace spec: podSelector: matchLabels: app: my-app ingress: - from: - namespaceSelector: matchLabels: project: frontend
7. 결론: AKS에서 Pod, Deployment, Service 요약
✔ Pod: Kubernetes의 최소 실행 단위, 컨테이너를 포함
✔ Deployment: Pod를 관리하고 업데이트, 확장을 쉽게 처리
✔ Service: Pod의 IP 변경과 무관하게 트래픽을 전달
💡 AKS에서 애플리케이션을 배포하려면 Deployment + Service를 조합하여 관리하는 것이 Best Practice! 🚀
반응형