Kubernetes

Kubernetes Pod와 Deployment

sh1220 2026. 1. 4. 18:10
이 글은 "쿠버네티스 교과서 | 엘튼 스톤맨"의 책의 내용을 참고하여 작성됨을 알립니다.

1. 쿠버네티스란?

  • 컨테이너를 실행하는 플랫폼
  • 애플리케이션의 시작, 롤링 업데이트, 서비스 수준 유지, 수요에 따른 스케일링, 보안 접근 등 다양한 기능 제공
  • 두가지 핵심 개념 
    • API : 애플리케이션 정의에 사용
    • 클러스터 : 애플리케이션이 실제로 동작 (도커 같은 런타임이 동작하는 여러대의 서버가 모여 하나의 논리적 단위를 구성

  • 노드 : VM혹은 bare-metal과 같은 하나의 서버를 뜻함
  • 클러스터 관리자는 이 노드라고 하는 각가의 서버 관리

과정

  1. YAML 파일에 애플리케이션 기술
  2. 쿠버네티스 API에 YAML 파일 전달
  3. 쿠버네티스가 파일에 기술된 애플리케이션 구성을 이해하고 현재상태와 비교
  4. 현재 상태와 기술된 상태 차이에 따라 컨테이너 추가/삭제

특징

  • 어떤 노드가 고장을 일으키더라도 해당 노드에서 실행되던 컨테이너는 다른 노드에서 실행된 컨테이너로 대체됨.
  • 특정 컨테이너 이상 => 쿠버네티스가 해당 컨테이너를 재시작 시킴
  • 애플리케이션의 컴포넌트 중 하나의 부하가 높아진다면 => 해당 컴포넌트의 컨테이너 추가로 실행
  • 도커 이미지 + 쿠버네티스 YAML => 모든 쿠버테니스 클러스테어서 동일하게 동작하는 self-healing 애플리케이션을 만들수 있음.
  • 쿠버네티스는 컨테이너 관리 분 아니라, 분산 데이터베이스를 가지고 있음.
    • 애플리케이션 구성 정보, API키, 비밀 값(ex. DB 접근 패스워드) 등을 함께 저장 가능
      => 이런 정보를 컨테이너에 전달해줌.
  • 스토리지 또한 제공 => 컨테이너 외부에 데이터 저장 가능
  • 트래픽 관리 및 전달 기능

  • 이 애플리케이션이 어떤 것이든 상관 없다.
    (리눅스, 윈도우, 자바, node.js 등 상관 없이 모두 똑같은 방식으로 기술하고 배포/관리 가능)
  • application manifest: 애플리케이션을 기술한 YAML 파일
  • 리소스 : 애플리케이션을 구성하는 컴포넌트 

실습 환경

  • macOS 15.6.1
  • Docker Desktop의 Kuberentes 사용 (single node)

2. Pod와 Deployement

  • 쿠버네티스는 컨테이너를 직접 다루지 않고 pod로 감싸서 관리
    (컨테이너는 해당 노드의 컨테이너 런타임(ex. 도커)가 관리함)
  • deployment : pod를 관리하는 상위 리소스 (=> 점점 추상화 시켜서 사용)

1) Pod

  • 컴퓨팅의 단위로, 클러스터를 이루는 노드 중 하나에서 실행됨.
  • 자신만의 가상 IP를 가짐 (이걸로 다른 파드들과 통신)
  • 보통 파드 하나에는 컨테이너 하나 (설저엥 따라 파드 하나에 여러 컨테이너 포함 가능)
  • 같은 파드의 컨테이너들은 같은 가상환경에 속함 (localhost로 통신 가능)

pod 실행하기

  • 위는 컨테이너 하나를 담은 파드를 실행한것 (kubectl run hello-kiamol --image=~~~)
  • 클러스터의 모든 파드 목록을 출력한후 상세정보 확인
    (kubectl get pods
    kubectl describe pod hello-kiamol)
  • 현재 딱히 정해준게 없어 대부분 기본값으로 되어있는것이 확인됨.

pod는 쿠버가, 컨테이너는 컨테이너 런타임이 관리한다.

  • 파드는 쿠버네티스가 관리하고, 컨테이너는 쿠버네티스 외부(노드의 컨테이너 런타임)에서 관리된다.

  • 실행해보면 docker에서 관리되는 컨테이너임을 알수 있다.
  • CRI(Container Runteim Interface)라는 공통 API를 이용하여 컨테이너 런타임과 연동되는 형태로 진행된다.
  • 이를 통해 어떤 컨테이너 런타임을 실행 중이더라도 같은 바식으로 노드 관리할 수 있다.

  • 컨테이너를 직접 삭제하더라도 다시 새로운 컨테이너가 생기는 것을 확인할 수 있다.
  • 쿠버네티스가 pod로 추상화 하여 관리하기에, 컨테이너가 사라졌다고 판단되면 새로운 컨테이너를 추가하여 복원시키기 때문.

직접 pod에 접속

 

  • pod에 port-forward를 통해서 접속할수 있다.

2) 컨트롤러 객체, Deployment

  • 컨트롤러 객체 : 다른 객체를 다시 추상화 한것 (다른 리소스를 관리하는 리소스)
    • 만약 어떤 노드가 고장나서 pod에 문제가 생겨도, 쿠버네티스 자체가 pod를 새 파드로 대체해주지 않음.
    • 즉 이러한 고가용성을 확보하기위해 사용하는것이 컨트롤러 객체(다른 리소스를 관리하는 리소스)
  • Deployemt : pod를 주로 관리하는 컨트롤러 객체

deployment 실행

  • deployment 실행 : kubectl create deployment (deployment 이름) --image=~~
  • hello-kiamol-2-~~~라고 새로운 pod가 생긴것을 확인할수 있다.
    • 현재는 기본값이 적용되어 기본밗인 파드 한개만 생성

레이블

  • 쿠버네티스에서는 리소스를 key-value 형태의 레이블을 통해 관리
  • deployment도 레이블을 통해 자신이 관리하는 pod를 확인함.

  • 새로 만들어진 pod의 레이블을 확인해보니, "app":"hello-kiamol-2"라는 레이블을 가지고 있음
  • 이를 가지는 pod를 검색 => 아까 만들어진 pod가 출력됨. (kubectl get pods -l app=~~, -l : 레이블 기준 검색)

만약 레이블을 바꿔버리면, deployment는 pod를 탐지하지 못하게됨. => 새로운 pod를 만듬.

  • 디버깅할때 유용 :  해당 pod만 밖으로 꺼내서 확인하고, deployment가 새롭게 pod를 만들어서 문제없이 계속 실행됨.

원래대로 되돌려 놓으면, 삭제 규칙에 따라 하나가 삭제됨.

deployment도 port-forward를 통해 접근 가능

3) Application manifest (YAML)

  • Application manifest는 json/yaml 포맷으로 작성가능 (가독성이 좋은 yaml이 주로 사용됨.)

pod 생성

  • 이는 위에서 진행한것과 똑같이 만든 pod에 대한 yaml 파일
    • name과 container에 대해 정의를 해둠.
    • kubectl apply -f (파일명)

  • 공개되어있는 url을 통해서도 manifest 파일을 적용 가능

deployemnt 생성

  • 더 복잡한 설정을 통해 복제본 갯수, CPU/메모리 사용 상한, 상태 체크 방식들을 설정할 수 있음.

4) 실행중인 애플리케이션(컨테이너)에 접근

exec (실행)

  • 이처럼 exec -it을 통해, 컨테이너에 직접 접근할 수 있음
    • kubectl을 사용하여 파드 속 컨테이너 안에서 쉘을 비롯한 명령실행 가능.
    • 현재 문법이 약간 바뀌어서 command(sh)앞에 --를 적어줘야함.
  • 컨테이너의 IP=노드 IP
  • 설정 확인 등을 할때 좋음
  • 하지만, 동작 중인 시스템을 관리할때는 로그를 보는게 편할 수 있음

Log 확인

  • kubectl을 통해 로그를 확인하나, docker를 통해 로그를 확인하나 똑같이 나옴.
  • 이는 바로 pod로 접근한 방식

deployment에서 exec / log

  • deployment가 만든 pod도 exec나 log 확인 가능
  • deploy/(deploy 이름)

파드 속 파일 복사해오기

  • kubectl cp (pod 이름):(경로) (로컬 경로)
  • 중간의 tar라고 적힌 로그는 단순히 알림 로그
    (내부적으로 tar를 통해 압축하여 복사해옴)

5) 리소스 관리 (pod 삭제)

  • delete를 통해 모든 pod를 지웠지만, deployment가 관리하는 pod들은 삭제되지 않음.
    • 컨테이너가 삭제되고, 새로운 컨테이너가 만들어짐.
    • 그래서 이 pod가아닌, deployment를 삭제해야함.
    • deployment를 삭제하면, 해당 deployment가 관리하는 pod도 함께 삭제됨.

  • deploy까지 모두 삭제했더니, 이제 쿠버네티스에는 쿠버네티스 API만 남아있는것을 확인할 수 있음.

6) 연습문제

  • 다음 내용의 pod를 포함하는 deployment로 하는 yaml 파일 작성
    • ch02/lab 디렉터리에 pod.yaml 파일이 있다. 애플리케이션 컨테이너는 80번 포트를 수신(listen)하는 웹 사이트를 실행한다.
    • 이 호스트명은 파드 이름이며, 해당 이름은 kubectl 명령어로 확인할 수 있다.
    • 80번 포트로 트래픽을 전달하면, 웹 애플리케이션이 실행 중인 컴퓨터의 호스트명을 이용해 웹 애플리케이션에 접근할 수 있다.
    • 이 YAML 스크립트는 디플로이먼트가 아니라 파드(Pod) 가 정의된 스크립트이다.

작성한 YAML

 

'Kubernetes' 카테고리의 다른 글

Kubernetes Volume/Mount/Claim  (1) 2026.01.31
Kubernetes Network  (1) 2026.01.18