이 글은 "쿠버네티스 교과서 | 엘튼 스톤맨"의 책의 내용을 참고하여 작성됨을 알립니다.
1. 쿠버네티스란?
- 컨테이너를 실행하는 플랫폼
- 애플리케이션의 시작, 롤링 업데이트, 서비스 수준 유지, 수요에 따른 스케일링, 보안 접근 등 다양한 기능 제공
- 두가지 핵심 개념
- API : 애플리케이션 정의에 사용
- 클러스터 : 애플리케이션이 실제로 동작 (도커 같은 런타임이 동작하는 여러대의 서버가 모여 하나의 논리적 단위를 구성

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

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