반응형
Kubernetes(K8s)를 처음 접할 때 가장 기본적인 개념 중 하나가 Pod와 Service(SVC)입니다. 이 두 개념을 이해하면 Kubernetes에서 애플리케이션을 배포하고 관리하는 방법을 쉽게 이해할 수 있습니다.
1. Pod란?
📌 Pod는 Kubernetes에서 실행되는 최소 배포 단위
- 컨테이너(Container)를 감싸고 있는 논리적 단위
- 하나의 Pod에는 하나 이상의 컨테이너가 포함될 수 있음 (일반적으로 하나의 컨테이너를 가짐)
- 동일한 네트워크 네임스페이스를 공유하여 localhost로 통신 가능
- 디스크 볼륨도 공유 가능
- 서버에서 실행되는 하나의 프로세스 또는 애플리케이션 단위로 이해하면 됨
🖥 Pod 구조 예시
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
📌 설명:
- kind: Pod → Pod를 생성
- name: my-pod → Pod의 이름 지정
- containers: → Pod 안에서 실행할 컨테이너 지정
- image: nginx:latest → Nginx 컨테이너 사용
- containerPort: 80 → 컨테이너 내부에서 80번 포트로 서비스 제공
2. Service(SVC)란?
📌 Service(SVC)는 Pod의 네트워크를 관리하는 Kubernetes 리소스
- Kubernetes에서는 Pod가 언제든지 생성되고 삭제될 수 있음
- 하지만 Pod가 재시작되거나 다시 배포될 경우 IP 주소가 바뀜
- 따라서 Pod를 안정적인 네트워크 주소로 접근하려면 Service가 필요함
✅ Service가 필요한 이유
- Pod는 동적(Dynamic)으로 생성되므로 직접 IP 주소를 할당하면 접속이 불안정
- Service는 고정된 IP 및 DNS 이름을 제공하여 안정적인 네트워크 통신이 가능하게 함
🖥 Service 구조 예시
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 80
type: ClusterIP
📌 설명:
- kind: Service → Service 리소스를 생성
- name: my-service → 서비스 이름 설정
- selector: → 특정 라벨을 가진 Pod를 선택
- port: 80 → 서비스가 외부에서 노출하는 포트
- targetPort: 80 → Pod 내부 컨테이너가 사용하는 포트
- type: ClusterIP → 내부에서만 접근 가능한 기본 Service 타입
3. Pod와 Service의 관계
📌 Pod와 Service가 어떻게 동작하는지 예제
- Pod는 애플리케이션을 실행하는 최소 단위
- Service는 여러 개의 Pod를 묶어서 하나의 네트워크 엔드포인트로 제공
- Service가 selector를 사용하여 특정 Pod를 찾아 로드밸런싱을 수행
🔹 예제 시나리오
- nginx 애플리케이션을 실행하는 Pod가 3개 있음
- Service가 3개의 Pod를 묶어 하나의 엔드포인트 제공
- 클라이언트가 Service로 요청하면, Pod 중 하나로 트래픽을 분배
4. Service의 종류
✅ 1) ClusterIP (기본값)
- 클러스터 내부에서만 접근 가능
- 외부에서 직접 접근할 수 없음
- kubectl exec 또는 kubectl port-forward 등을 이용해 접근 가능
type: ClusterIP
✅ 2) NodePort
- 각 Node의 특정 포트를 통해 외부에서 접근 가능
- 보통 30000~32767 포트 범위를 사용
type: NodePort
🔹 접근 방법:
http://<NodeIP>:<NodePort>
✅ 3) LoadBalancer
- 클라우드 환경(AWS, GCP, Azure)에서 사용
- 외부에서 접근할 수 있는 고정 IP를 제공하여 로드 밸런싱 수행
type: LoadBalancer
🔹 접근 방법:
http://<LoadBalancer_IP>:80
✅ 4) ExternalName
- Kubernetes 내부 DNS를 통해 외부 서비스로 라우팅
- IP 주소가 아닌 DNS 이름을 반환하여 외부 서비스와 연결 가능
type: ExternalName
externalName: example.com
🔹 사용 예시:
- Service를 사용해 외부 API(api.example.com)로 트래픽을 보낼 때 활용
5. 요약
개념설명
Pod | 컨테이너를 실행하는 최소 단위 |
Service(SVC) | 여러 개의 Pod를 묶어 하나의 엔드포인트 제공 |
ClusterIP | 클러스터 내부에서만 접근 가능 (기본값) |
NodePort | 외부에서 NodeIP:포트번호로 접근 가능 |
LoadBalancer | 클라우드 환경에서 외부 로드 밸런서를 통해 접근 가능 |
ExternalName | 외부 DNS 주소로 요청을 리디렉트 |
6. 결론
- Pod는 Kubernetes에서 실행되는 컨테이너의 기본 단위이며, 상태가 변할 수 있음.
- Service는 Pod의 동적인 IP 주소 문제를 해결하고, 안정적인 네트워크 접근을 보장함.
- Kubernetes에서 애플리케이션을 배포할 때 항상 Pod와 Service를 함께 설정하는 것이 중요함.
즉, Pod는 실행 단위이고, Service는 네트워크 연결을 위한 단위라고 이해하면 됩니다. 🚀
반응형