본문 바로가기
DevOps/Kubernetes

쿠버네티스 - Pod, Replication Controller

by 재성스 2024. 10. 4.
반응형

Pod

Pod는 쿠버네티스에서 배포할 수 있는 최소 단위로, 하나 이상의 컨테이너를 감싸는 논리적 그룹이다. Pod는 내부적으로 컨테이너들이 같은 네트워크와 스토리지를 공유한다. 여러 컨테이너를 한 Pod에 배치하여 서로 협력하게 만들 수 있다.

apiVersion: v1  # API 버전. Kubernetes 오브젝트를 정의하는 데 사용되는 API 버전.
kind: Pod       # 리소스의 종류(Pod)를 정의.
metadata:
  name: pod-1   # 이 파드의 이름을 지정.
spec:
  containers:   # 이 파드 안에서 실행될 컨테이너 목록.
  - name: container1   # 첫 번째 컨테이너의 이름.
    image: kubetm/p8000  # 첫 번째 컨테이너에서 사용할 Docker 이미지.
    ports:
    - containerPort: 8000  # 이 컨테이너가 사용하는 포트 번호.
  - name: container2   # 두 번째 컨테이너의 이름.
    image: kubetm/p8080  # 두 번째 컨테이너에서 사용할 Docker 이미지.
    ports:
    - containerPort: 8080  # 이 컨테이너가 사용하는 포트 번호.

설명: 이 예시에서는 pod-1이라는 이름의 파드가 있으며, 두 개의 컨테이너가 포함되어 있다. 각 컨테이너는 서로 다른 포트(8000, 8080)를 사용한다.


Pod의 생명주기

  • 단명성(Ephemeral): Pod의 수명은 일반적으로 일시적이다. 즉, Pod 영구적인 것이 아니며, 언제든 재시작하거나 삭제될 수 있다. 따라서,  Pod 자체의 IP 주소나 상태에 의존하지 않도록 설계하는 것이 중요하다. 
  • 재시작 정책: Pod는 여러 종류의 재시작 정책을 가질 수 있다. 기본 값이 "Always"로 설정(yml)되어 있으며, 이는 pod 내의 컨테이너가 실패할 경우 쿠버네티스가 자동으로 재시작하게 한다.
restartPolicy: Always  # 기본값. 파드가 실패하면 재시작.

 

네트워크 

  • 클러스터 네트워크 공유: pod 내 컨테이너는 모두 동일한 네트워크 네임스페이스를 공유하므로, 같은 localhost로 통신할 수 있다. 하지만 외부 클러스터와 통신할 때는 Kubernetes Service를 사용해야한다.
  • Pod 간 통신 : 각 pod는 고유한 IP 주소를 가진다. 기본적으로 다른 파드는 해당 IP 주소를 사용해 직접 통신도 가능하다. 

멀티 컨테이너 파드의 협력

  • 위 예시에서처럼, 여러 컨테이너가 동일한 pod에서 실행되면 각 컨테이너는 서로 협력할 수 있다. 보통 메인 애플리케이션과 사이드카 패턴으로 보조 기능(로그 수집, 프록시 등)을 수행하는 컨테이너를 함께 배치한다.

스토리지와 볼륨

  • pod 내부의 컨테이너는 서로 데이터를 주고받을 때 볼륨을 사용해 데이터를 공유할 수 있다. 또한 외부 스토리지 시스템을 연결해 컨테이너가 영구적으로 데이터를 저장할 수 있도록 설정할 수 있다.

 


ReplicationController


ReplicationController는 pod의 복제본 수를 항상 일정하게 유지해주는 역할을 한다. Pod가 종료되거나 문제가 생겼을 때 자동으로 새로운 pod를 생성하여 애플리케이션 가용성을 보장한다.

apiVersion: v1  # Kubernetes API 버전.
kind: ReplicationController  # 리소스 종류(ReplicationController)를 정의.
metadata:
  name: replication-1  # ReplicationController의 이름을 지정.
spec:
  replicas: 1  # 이 ReplicationController가 관리할 파드의 복제본 수.
  selector:
    app: rc  # ReplicationController가 관리할 파드를 선택하는 레이블.
  template:  # 이 템플릿을 사용해 새 파드를 생성.
    metadata:
      name: pod-1  # 생성할 파드의 이름.
      labels:
        app: rc  # 파드에 붙일 레이블.
    spec:
      containers:
      - name: container  # 컨테이너의 이름.
        image: kubetm/init  # 컨테이너에서 사용할 Docker 이미지.

설명 : 위 ReplicationController는 pod-1 파드를 관리하며, 복제본 수를 1로 설정해 항상 하나의 파드가 실행되도록 보장한다. 만약 파드가 종료되면 새로운 파드를 생성해서 서비스를 유지한다.

수평적 확장

  • ReplicationController를 사용하면 복제본 수를 늘리거나 줄이는 방식으로 애플리케이션을 수평적으로 확장할 수 있다.
  • 예를 들어, replicas: 3으로 설정하면 동일한 pod가 3개가 실행되며, 로드밸런싱을 통해 트래픽을 균등하게 분배할 수 있다.
  • 복제본 수는 필요에 따라 kubectl scale 명령을 사용해 동적으로 변경할 수 있다.
kubectl scale rc replication-1 --replicas=3 # 복제본 수를 3으로 변경

ReplicationController와 ReplicaSet

  • ReplicaSet은 ReplicationController의 업그레이드 버전

자동 복구

  • pod 복구: 만약 pod가 오류로 인해 종료되거나, 클러스터 노드가 다운될 경우 ReplicationController는 자동으로 새로운 파드를 생성하여 복제본 수를 유지한다. 

 

정리

Pod와 ReplicationController는 쿠버네티스의 핵심적인 구성 요소이다. Pod는 컨테이너 그룹을 관리하고, ReplicationController는 이러한 Pod의 복제본 수를 항상 일정하게 유지해서 애플리케이션이 의도치않게 종료되더라도 실행 상태를 안전하게 유지해준다. 

반응형