본 포스팅은, 쿠버네티스 강의를 수강하며 강의 내용 및 추가 조사한 내용을 작성한 내용 입니다.
환경 구성과 관련해서는 아래 내용 참고 부탁드립니다.
◆ 환경 셋팅 포스팅
<작성중>
◆ ENV
Chipset : Mac x64 ARM (M1)
UTM 을 사용하여 1 Master - 2 Nodes 구조의 클러스터로 구성
<목차>
1. 쿠버네티스 클러스터
2. 주요 오브젝트
3. 컨트롤러 오브젝트
[쿠버네티스 클러스터]
쿠버네티스 클러스터는, 애플리케이션 컨테이너를 관리하고 배포하기 위해 설계된 분산 시스템이다.
클러스터는 여러 대의 물리적 or 가상 서버로 구성되며, 이 각각의 서버를 "노드" 라고 하며, 컨트롤 플레인 노드(이하 마스터) 와 워커 노드(이하 노드)이 서버들이 협력하여 컨테이너화된 애플리케이션의 배포 / 확장 / 유지 관리를 자동화 해준다.
- Control Plane (이하 마스터)
- 관리 & 제어 Role
- kube-apiserver
- 클러스터의 모든 구성요소가 통신하는 중앙 허브 역할을 수행한다.
- 쿠버네티스 API 를 제공하며, 외부 사용자나 내부 컴포넌트가 클러스터와 상호작용할 수 있도록 한다.
- kube-controller-manager
- 클러스터 상태를 원하는 상태로 유지하는 역할을 하는 여러 컨트롤러를 실행 및 관리한다.
- kube-scheduler
- 새로운 파드를 실행할 적합한 노드를 선택하는 역할을 한다.
- 스케줄러는 리소스 요구사항 / 정책 / 노드 상태 등을 고려하여 파드를 배치한다.
- ETCD
- 쿠버네티스의 분산 Key - Value 저장소로, 클러스터의 모든 상태 정보(파드, 서비스, 시크릿 등)를 저장한다.
- Worker Node (이하 노드)
- 실제로 컨테이너화된 애플리케이션을 실행하는 물리적 or 가상 서버
- kubelet
- 각 노드에서 실행되며, 마스터로부터 명령을 받아 파드를 관리한다.
- 파드의 생명주기를 관리하고, 파드가 정상적으로 실행되고 있는지 점검한다.
- 컨테이너 런타임
- 파드를 구성하는 컨테이너를 실행하는 소프트웨어로, Docker 가 주로 사용된다.
- kube-proxy
- 쿠버네티스 네트워크 서비스를 관리하며, 클러스터 내/외부의 네트워크 트래픽을 라우팅한다.
- 파드 간 통신 및 로드 밸런싱을 지원한다.
- Pod
- 쿠버네티스의 가장 작은 배포 단위로, 하나 이상의 컨테이너로 구성된다.
- 한 네트워크 네임스페이스를 공유하며, 같은 IP 주소와 포트를 사용하게 된다.
우선, 아래와 같이 쿠버네티스 클러스터를 로컬에 구축한 상태이다.
[오브젝트]
쿠버네티스 오브젝트는 쿠버네티스 클러스터에서 관리되는 엔티티들로, 쿠버네티스가 클러스터의 상태를 나타내고 관리하기 위하여 사용하는 기본 구성 요소들을 말한다.
쿠버네티스 오브젝트는 YAML 또는 JSON 형식의 manifest 파일로 정의된다.
쿠버네티스의 주요 오브젝트들의 관계는 다음과 같다.
각 오브젝트들의 상세한 내용은 이후 포스팅에서 다룰 예정이며, 관계 측면에서 간략히 알아보자.
<Nameapace>
네임스페이스는, 클러스터 내에서 리소스를 논리적으로 분리하는 방법을 제공한다.
- 리소스 분리 : 파드 / 서비스 / 볼륨 / 컨트롤러 등의 오브젝트를 그룹화하고 논리적으로 분리하는 역할을 한다.
이를 통하여, 서로 다른 프로젝트나 팀의 리소스를 분리하여 관리할 수 있다. - 접근 제어 : 네임스페이스는 접근 권한을 세분화할 수 있도록 도와준다.
각 네임스페이스에 대하여, 사용자나 서비스 계정의 접근 권한을 개별적으로 설정할 수 있다. - 리소스 할당 : ResourceQuota, LimitRange 와같은 Policy Object 를 네임스페이스 단위로 설정하여, 특정 네임스페이스에서 사용할 수 있는 CPU / 메모리 등의 리소스를 제한할 수 있다.
<Pod>
파드는, 쿠버네티스에서 배포 가능한 가장 작은 단위로, 하나 이상의 컨테이너를 그룹화한 오브젝트이다.
- 컨테이너 그룹화 : 파드는 하나 이상의 컨테이너를그룹화하여, 쿠버네티스에서 관리할 수 있는 가장 작은 단위로, 컨테이너들이 같은 네트워크와 스토리지를 공유하도록 하며, 컨테이너 간의 통신과 자원 공유가 가능하도록 한다.
- 리소스 요청 및 할당 : 파드는 컨테이너들의 CPU / 메모리 등 리소스 요청을 지정하며, 쿠버네티스는 이 요청을 토대로 노드에 파드를 스케줄링 한다.
- 애플리케이션 배포 및 스케일링 : 파드는 Deployment 나 ReplicaSet 과 같은 컨트롤러에 의해 관리되어 애플리케이션의 배포 단위로 사용되며, 이를 통해 애플리케이션의 Auto Scaling 이나 Self-Healing 을 구현할 수 있다.
<Service>
서비스는, 쿠버네티스 클러스터 내에서 네트워크 접근을 관리하는 오브젝트로, 파다 간 또는 외부에서 특정 파드 집합에 안정적인 네트워크 엔드포인트를 제공하는 역할을 한다.
- 네트워크 접근 관리 : 파드에 접근할 수 있는 네트워크 엔드포인트를 제공하며, 파드 간의 통신을 쉽게 할 수 있도록 한다.
- 로드 밸런싱 : 서비스는 여러 파드에 트래픽을 분산시키는로드 밸런서 역할을 제공하여, 파드가 장애가 발생하거나 추가될 때도 자동으로 트래픽 조정을 해준다.
- 서비스 디스커버리 : 쿠버네티스 서비스는 DNS 를 사용하여 클러스터 내의 파드들이 서로를 발견하고 통신할 수 있도록 지원한다.
<Volume>
파드가 컨테이너 내에서 데이터를 저장하고 공유하는 데 사용되는 추상화된 저장소 개체로, 컨테이너의 파일 시스템과는 독립적으로 존재한다.
- 데이터 영속성 보장 : 볼륨은 파드가 재시작되더라도 데이터를 유지할 수 있도록 지원하여, 안정적인 데이터 저장 기능을 제공한다.
- 다양한 스토리지 옵션 : 쿠버네티스 볼륨은 여러 유형의 스토리지와 통합되어, 다양한 데이터 저장소를 지원한다.
- 파드 간 데이터 공유 : 파드 내의 컨테이너들 or 네임스페이스 내 파드들 간에 데이터를 공유할 수 있도록 한다.
[컨트롤러 오브젝트]
<ReplicaSet> (Replication Controller - Deprecated)
특정 수의 파드 복제본을 유지하는 역할을 한다.
Deployment 에 의해 관리되는 경우가 많으며, 파드의 수를 조정하여 시스템의 고가용성을 보장한다.

<Deployment>
애플리케이션의 파드를 선언적 방식으로 관리하는 역할을 수행한다.
지정된 수의 파드가 항상 실행되도록 보장하며, 새로운 버전의 애플리케이션을 배포하거나, 애플리케이션의 스케일을 조정할 때 사용된다.
<DemonSet>
클러스터 내의 각 노드에 하나의 파드를 생성하도록 보장한다.
주로 로그 수집기, 모니터링 에이전트와 같이 모든 노드가 필요로하는 서비스를 배포할 때 사용된다.
<Job & CronJob>
- Job
- 특정 작업을 한 번 실행하고 완료하는 파드를 생성하는 오브젝트.
- 작업이 완료될 때까지 파드를 생성하며, 실패 시 재시도하도록 설정할 수 있다.
- 배치 작업에 주로 사용된다.
- CronJob
- 정기적인 작업을 예약하여 실행할 수 있도록 해주는 오브젝트
- 일정한 시간 간격으로 Job 을 실행할 수 있다.
이처럼 컨트롤러는 쿠버네티스의 핵심 컴포넌트로, 클러스터 내의 리소스 상태를 관리하고 원하는 상태를 유지하기 위해 동작한다.