카테고리 없음

Kubernetes에서 Pod와 Service(SVC)란?

idea9329 2025. 2. 7. 15:14
반응형

 

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가 어떻게 동작하는지 예제

  1. Pod는 애플리케이션을 실행하는 최소 단위
  2. Service는 여러 개의 Pod를 묶어서 하나의 네트워크 엔드포인트로 제공
  3. 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는 네트워크 연결을 위한 단위라고 이해하면 됩니다. 🚀

반응형