본문으로 바로가기

파드 관리

category MLOps/K8S 2022. 3. 26. 15:34

파드

- 쿠버네티스에서 컨테이너를 관리하는 최소 단위
- 컨테이너가 하나 이상
- 하나의 목적을 위해서 하나의 파드를 구성
- 목적을 위해서 필요한 기능이 여러 가지
- 파드의 목적으로는 컨테이너 간의 리소스를 서로 공유
- 여러 컨테이너(동일목적)를 동시에 제어

 

파드 라이프 사이클

1. Pending : 스케줄링, 이미지 다운로드 및 컨테이너 실행 (모든 컨테이너가 실행되기 전)
2. Running : 모든 컨테이너가 정상 실행
3. Succeeded / Failed : 작업이 성공적으로 완료, 실패
4. Unknown : 파드의 상태를 확인할 수 없을 때

 

프로브

- 파드의 상태를 확인해주는 방식/상태 -> 유지
- 종류
      livenessProbe : 컨테이너의 실행여부를 확인해서 오류 발생 시 재실행 기능 지원
      readinessProbe : 컨테이너 내부의 어플리케이션이 응답 가능한지 확인 및 재실행
      startupProbe : 컨테이너 내부의 어플리케이션이 실행했는지 확인

- 장점 : 상태를 확인하고 유지해줄 수 있다.
- 확인 방식
       Exec : 지정한 프로그램(명령어)을 실행해서 결과값으로 확인
       Http : Get으로 요청해서 응답코드로 확인
       TCP : 특정 포트에 대한 요청으로 포트 확인

- 진단 결과
       Success : 정상 ( exec - 리턴코드 0 , http - 2xx / 3xx , tcp - open )
       Failure : 오류 ( exec - 리턴코드 0이 아닐 때 , http - 400이상 , tcp - close )
       Unknown : 확인불가

 

- 확인 후 컨테이너의 재시작 정책에 따라 처리 (기본값은 항상 재시작)

 

초기화 컨테이너 (init Container)

- 파드 실행 시 우선적으로 실행해야 하는 컨테이너를 지정
- 순서대로 실행
- 프로브 사용 불가

 

인프라 컨테이너 (infra Container)

- /pause 를 실행하는 컨테이너
- 파드 생성 시 기본적으로 함께 생성
- IP 주소를 할당 (파드의 어플리케이션 컨테이너가 재시작해도 IP주소를 유지,  여러 개의 컨테이너가 존재해도 모두 동일 IP 사용)

 

스태틱 파드

- 일반적인 파드는 kube-apiserver 를 통해서 파드를 관리
- kube-apiserver 를 통하지 않고 만들고 관리하는 파드
- 쿠버네티스의 구성요소(컴포넌트)들도 파드 형태로 관리
- kubelet 이 직접 관리
- 노드 변경 없이 동일한 노드에서만 재실행
- 클러스터(쿠버네티스시스템) 환경을 구성하는 데에 필요한 파드들을 주로 설정
- /etc/kubernetes/manifest 디렉토리에 yaml 파일로 작성
- 각 컨트롤플레인 및 노드마다 구성

 

파드 리소스 관리

- 쿠버네티스에서는 컨테이너를 파드 단위로 관리
- 따라서 리소스 설정도 파드 단위로 구성
- limit : 최대 사용 가능한 리소스(제한)
- request : 최소 사용 가능한 리소스(보장)
- cpu / memory 에 대한 설정
- memory 는 사이즈를 기준으로 설정
- cpu 는 코어개수(퍼센트)로 설정
- 할당한 리소스에 따라 파드의 실행이 어려울 수 있음

 

       테스트 시나리오
       1. 최대사용량을 실제 노드의 스펙보다 크게 설정했을 때 생성 가능한 지 확인
       2. 최소보장 크기가 오버했을 때 생성 여부
       3. 사용량이 실제 최대까지만 사용되는지 확인
       4. 추가적인 파드를 생성했을 때 제한 조건 ( 실제 2G , 사용량 1.5G , 새로운 파드의 최소 1G가 필요한 경우 )

       $ kubectl top node/pod : 각 대상에 대한 사용량 확인 가능

 

파드 환경 변수

- 파드 실행 시 컨테이너 내부에서 사용할 환경변수 설정 가능
- 값을 템플릿에서 직접 지정 가능 ( value )
- 오브젝트의 설정값을 불러와서 지정 ( valueFrom.fieldRef )
- 컨테이너의 리소스 할당량을 값으로 지정 ( valueFrom.resourceFieldRef )
- 컨피그맵 또는 시크릿의 값도 사용 가능
- 명령어로 파드 실행 시에도 환경변수 설정 가능 ( kubectl run --env 이름=값 )
- 확인은 kubectl describe 로 가능 (직접 컨테이너 내부에서 확인도 가능)

 

파드의 컨테이너 패턴

- 사이드카 : 확장된 기능을 위한 구성 (리소스공유)
- 엠베서더 : 프록시 컨테이너로 간접접근 및 로드밸런싱 역할
- 어뎁터 : 어플리케이션이 동작하는 컨테이너에 대한 접근 및 데이터 수집 (모니터링 등)

       => 다양한 패턴으로 파드 내부의 컨테이너가 구성된다.
       관리 시에는 파드 단위로 관리

 

실습

- 사용법
       생성
       $ kubectl run : 파드의 특성을 명령어 라인에서 정의하고 실행 (재사용성이 떨어짐)
       $ kubectl create -f FILE : 파드를 포함한 여러 오브젝트를 생성 (템플릿 사용 -> 새로 생성)
       $ kubectl apply -f FILE : 파드를 포함한 여러 오브젝트를 생성 (템플릿 사용 -> 새로 생성 + 수정)

       삭제
       $ kubectl delete  : 종류와 이름을 직접 지정하거나 생성 시 사용한 파일을 이용해서 삭제 가능

       확인
       $ kubectl get : 간단한 확인 ( -o 옵션으로 출력방식 지정 )
       $ kubectl describe : 조금 더 상세한 정보 확인 ( 대상을 지정해서 보는 경우가 많음 )

       $ kubectl explain : 템플릿의 작성 방식 (설정항목) 
       $ kubectl api-resources : 템플릿에서 정의할 대상의 kind / api-version ( kubectl api-versions )

       $ kubectl logs : 파드의 동작 내역 확인

 

- yaml 파일 작성

- 아래의 내용에 따라 kubectl explain 명령어 사용하여 내용 확인 가능

출처: https://subicura.com/k8s/guide/pod.html#yaml로-설정파일spec-작성하기

- yaml 기반으로 파드 실행 및 확인

# 실행
kubectl apply -f sample.yml

# 확인
kubectl get pods

# 종료
kubectl delete pod nginx

- LivenessProbe 실습 예시

'MLOps > K8S' 카테고리의 다른 글

서비스  (0) 2022.03.28
컨트롤러 (Daemonset, Statefulset, Job, CronJob)  (0) 2022.03.28
컨트롤러 (ReplicaSet, Deployment)  (0) 2022.03.26
아키텍쳐 및 명령어 기본  (0) 2022.03.26