1. 파드란 무엇인가?

쿠버네티스는 실제로 파드라는 단위로 컨테이너를 묶어서 관리하므로 보통 컨테이너가 하나가 아닌 여러 개 컨테이너로 구성된다.

파드로 컨테이너 여러 개를 한꺼번에 관리할 때는 컨테이너마다 역할을 부여할 수 있다. 파드 하나에 속한 컨테이너들은 모두 노드 하나 안에서 실행된다. 컨테이너들이 같은 목적으로 자원을 공유하는 것은 파드의 역할중 하나이기때문에 가능한 현상이다.

파드 안 여러 개 컨테이너에 역할을 부여하는 그림

 

파드 안에 컨테이가 3개 있고 각각 웹 서버, 로그 수집기, 볼륨 컨테이너라는 역할을 부여했다. 또한 파드 하나 안에 있는 컨테이너들은 하나의 IP를 공유한다.

즉, 외부에서 파드에 접근할 때, 192.168.10.10이라는 IP로 접근하며 파드 안 컨테이너와 통신할 때는 컨테이너마다 다르게 설정한 포트를 사용한다.

 

컨테이너 하나에 앞 그림의 세 가지 역할을 모두 부여할 수도 있다. 하지만 실제로 컨테이너 하나 안에 2개의 프로세스를 실행하는 것은 간단하지 않다. 시스템 신호나 종료 코드 처리도 프로세스마다 설정해줘야 하기 때문에 컨테이너 관리 효율이 떨어진다.


2. 파드 사용

apiVersion: v1
kind: Pod
metadata:
  name: kubernetes-simple-pod
  labels:
    app: kubernetes-simple-pod
spec:
  containers:
  - name: kubernetes-simple-pod
    image: arisu1000/simple-container-app:latest
    ports:
    - containerPort: 8080

<기본적인 파드의 템플릿 설정 예시>

 

  • .metadata.name 필드는 파드 이름을 설정한다.
  • .metadata.labels.app 필드는 오브젝트를 식별하는 레이블을 설정한다. 위 예시에서는 해당 파드가 앱 컨테이너이고 kubernetes-simple-pod라고 식별한다고 설정했다.
  • .spec.containers[ ].name 필드는 컨테이너의 이름을 설정한다. 위 예시에서는 kubernetes-simple-pod로 설정하였다. name 앞에 설정한 '-'은 .spec.containers의 하위 필드를 배열 형태로 묶겠다는 뜻이다. (그렇기때문에 .spec.contaienrs[ ] 라고 표기)
  • .spec.containers[ ].imgae 필드는 컨테이너에서 사용할 이미지를 결정한다.
  • .spec.container[ ].ports[ ].containerPort 필드는 해당 컨테이너에 접속할 포트 번호를 설정한다.

파드 실행

정상적으로 파드가 실행됐음을 확인


3. 파드 생명 주기

파드는 생성부터 삭제까지의 과정에 생명 주기가 있다.

  • Pending: 쿠버네티스 시스템에서 파드를 생성 중임을 의미한다. 이 상태는 컨테이너 이미지를 다운로드한 뒤 전체 컨테이너를 실행하는 과정이므로 파드 안의 전체 컨테이너가 실행될 때까지 시간이 걸린다.
  • Running: 파드 안 모든 컨테이너가 실행 중인 상태를 의미한다. 1개 이상의 컨테이너가 실행 중이거나 시작 또는 재시작 상태일 수 있다.
  • Succeeded: 파드 안 모든 컨테이너가 정상 실행 종료된 상태로 재시작되지 않는다.
  • Failed: 파드 안 모든 컨테이너 중 정상적으로 실행 종료되지 않은 컨테이너가 있는 상태이다. 컨테이너 종료 코드가 0이 아니면 비정상 종료이거나 시스템이 직접 컨테이너를 종료한 것이다.
  • Unknwon: 파드의 상태를 확인할 수 없는 상태이다. 보통 파드가 있는 노드와 통신할 수 없을 때이다.

현재 파드 생명 주기는 kubectl describe pods 파드이름 명령을 실행한 후 Status 항목에서 확인할 수 있다.

 

Status 항목에서 현재 파드가 Running 상태인 것을 확인할 수 있다.

 

Conditions 항목은 파드의 현재 상태 정보를 나타내며 Type과 Status로 구분되어 있다.

  • Initialized: 모든 초기화 컨테이너가 성공적으로 시작 완료되었다는 의미이다.
  • Ready: 파드는 요청들을 실행할 수 있고 연결된 모든 서비스의 로드밸런싱 풀에 추가되어야 한다는 의미이다.
  • ContainersReady: 파드가 하나의 노드로 스케줄을 완료했다는 의미이다.
  • Unschedulable: 스케줄러가 자원의 부족이나 다른 제약 등으로 지금 당장 파드를 스케줄 할 수 없다는 의미이다.

Status는 Type의 상태를 나타내는 True(상태 활성화), False(상태 비활성화), Unknown(상태 알 수 없음)값을 출력한다.


4. kubelet으로 컨테이너 진단

Probe는 컨테이너에서 kubelet에 의해 주기적으로 수행되는 진단이다. 컨테이너가 실행된 후에는 kubelet이 컨테이너를 주기적으로 진단하는데 이때 필요한 Probe는 다음 세 가지가 있다.

  • livenessProbe: 컨테이너가 실행됐는지 확인한다. 이 진단이 실패하면 kubelet은 컨테이너를 종료시키고, 재시작 정책에 따라 컨테이너를 재시작한다. 컨테이너에 livenessProbe를 어떻게 할지 명시되지 않았다면 기본 상태 값은 Success이다.
  • readinessProbe: 컨테이너가 실행된 후 실제로 서비스 요청에 응답할 수 있는지 진단한다. 이 진단이 실패하면 엔드포인트 컨트롤러는 해당 파드에 연결된 모든 서비스를 대상으로 엔드포인트 정보를 제거한다. 첫 번째 readinessProbe를 하기 전까지의 기본 상태 값은 Failure이고 readinessProbe를 지원하지 않는 컨테이너라면 기본 상태 값은 Success이다.
  • startupProbe: 컨테이너 안 애플리케이션이 시작되었는지를 나타낸다. 스타트업 프로브는 진단이 성공할 때까지 다른 나머지 프로브는 활성화되지 않으며, 진단이 실패할 시 kubelet이 컨테이너를 종료시키고, 컨테이너를 재시작 정책에 따라 처리한다. 컨테이너 스타트업 프로브가 없으면 기본 상태 값은 Success이다.

앞 세 가지 프로브가 있는 것은 쿠버네티스의 장점중 하나이다. readinessProbe를 지원하는 컨테이너라면 컨테이너가 실행된 다음 바로 서비스에 투입되어서 트래픽을 받지 않는다. 실제 트래픽을 받을 준비가 되었음을 확인한 후 트래픽을 받을 수 있다.

자바 애플리케이션처럼 프로세스가 시작된 후 앱이 초기화될 때까지 시간이 걸리는 상황에 유용하다. 또한 앱을 실행할 때 대용량 데이터를 불러와야 하거나, 컨테이너 실행은 시작됐지만 앱의 환경 설정 실수로 앱이 실행되지 않는 상황 등에 대비할 수 있다.


컨테이너 진단은 컨테이너가 구현한 핸들러를 kubelet이 호출해서 실행한다.

 

핸들러는 세 가지가 있다.

  • ExecAction: 컨테이너 안에 지정된 명령을 실행하고 종료 코드가 0일 때 Success라고 진단한다.
  • TCPSocketAction: 컨테이너 안에 지정된 IP와 포트로 TCP 상태를 확인하고 포트가 열려있으면 Success라고 진단한다.
  • HTTPGetAction: 컨테이너 안에 지정된 IP, 포트, 경로로 HTTP GET 요청을 보낸다. 응답 상태 코드가 200에서 400 사이면 Success라고 진단한다.

진단 결과 3개

  • Success: 컨테이너가 진단에 성공
  • Failure: 컨테이너가 진단에 실패
  • Unknown: 진단 자체가 실패해서 컨테이너 상태를 알 수 없음

 

<출처>
정원천 외 3명, 쿠버네티스 입문 90가지 예제로 배우는 컨테이너 관리 자동화 표준

+ Recent posts