Kubernetes, 그 개념과 구성요소

이숭늉·2025년 5월 27일
0

DevOps

목록 보기
10/19
post-thumbnail

🕸️ Kubernetes, 그 개념과 구성요소

이번 글에서는 쿠버네티스의 개념과 이를 구성하는 주요 요소들에 대해 정리해보려 한다.


쿠버네티스란?

쿠버네티스(Kubernets, K8S)는 컨테이너화된 어플리케이션을 자동으로 배포, 운영, 확장, 복구할 수 있도록 도와주는 컨테이너 오케스트레이션 플랫폼이다.

도커 같은 컨테이너 기술이 개별 어플리케이션을 격리하고 실행하는 데 초점을 맞췄다면, 쿠버네티스는 이러한 컨테이너들을 수십, 수천 개 단위로 안정적이고 일관되게 관리할 수 있도록 해주는 시스템이다. 이는 구글에서 2014년에 오픈소스로 공개하였다.

쿠버네티스 클러스터

쿠버네티스는 하나의 독립 실행 환경을 '클러스터'라는 단위로 구성한다. 클러스터는 크게 컨트롤 플레인 노드와 워커 노드로 나뉜다.

컨트롤 플레인 노드

컨트롤 플레인은 클러스터의 상태를 관리하고 조정하는 두뇌 역할을 한다. 주요 구성 요소는 다음과 같다.

API 서버 (kube-apiserver)

  • 모든 쿠버네티스 API 요청을 처리하는 진입점.
  • kubectl 명령어, 다른 내부 컴포넌트, 외부 시스템 등에서 오는 요청을 받아 처리하며, RESTful API 인터페이스 제공한다.

etcd

  • 클러스터의 모든 상태 데이터를 저장하는 분산 키-값 저장소
  • etcd의 정보만 백업돼 있다면 클러스터 복구 가능.

스케줄러 (kube-scheduler)

  • Pod를 노드의 상태와 요구 조건 등에 따라 어떤 워커 노드에서 생성할지 결정, 예약.

컨트롤러 매니저 (kube-controller-manager)

  • 클러스터 리소스의 실제 상태와 원하는 상태를 일치시키는 역할을 한다.
  • 다양한 컨트롤러(Deployment, ReplicaSet, Node)들이 이 안에서 실행되며, 각 컨트롤러는 특정 오브젝트의 상태를 감시하고 조정한다.

워커 노드

실제 어플리케이션 Pod를 실행하는 워커 노드이다. 주요 구성 요소는 다음과 같다.
Kubelet

  • Pod의 실행을 담당.
  • 쿠버네티스 클러스터를 구성하는 각 노드에는 Kubelet이 실행된다.
  • API 서버로부터 명령을 받아, Pod 내부의 컨테이너를 실행하고, 상태를 모니터링한다.
  • 파드의 상태에 이상이 있거나, 종료되었을 경우 다시 실행하는 등의 작업도 수행한다.

Kube-proxy

  • 파드의 통신을 담당.
  • 쿠버네티스 내부 Pod 간 통신, 혹은 외부와의 통신을 처리하기 위해 iptables 등을 이용해 네트워크 연결을 설정한다.

컨테이너 런타임

  • 실제로 컨테이너의 실행을 담당.
  • 쿠버네티스에서는 보통 containerd를 많이 사용한다.

Pod

  • 쿠버네티스의 최소 실행 단위로, 하나 이상의 컨테이너를 담을 수 있다.

클러스터 내부 통신 : CNI

쿠버네티스에서는 CNI(Container Network Interface) 표준(Calico, Fannel 등)을 사용해 파드 간, 노드 간의 네트워크 통신을 구성한다. 이로 인해 모든 파드가 고유한 IP를 가지며, IP 충돌 없이 다른 노드에 위치한 파드와 통신 가능하다.
즉, 쿠버네티스는 파드를 만들 때, CNI 플러그인에 파드에 대한 IP 주소 할당과 파드 간 통신 라우팅 구성을 요청한다.

파드 생성 시, 구성 요소 간 상호작용 흐름

1. kubectl -> API 서버
사용자가 kubectl apply -f pod.yaml 같은 명령어로 파드를 생성하면, 이 요청은 쿠버네티스 API 서버에 전달됨.

2. API 서버 -> etcd
API 서버는 요청을 처리한 후, 클러스터의 상태 값을 최신으로 유지하기 위해서 etcd에 해당 정보를 기록한다.

3. 컨트롤러 매니저의 감지
API 서버를 모니터링하고 있던 컨트롤러 매니저가 새로운 파드가 생성됐다는 정보를 감지하고, 관련 컨트롤러를 통해 리소스를 조정한다.
예를 들어 레플리카셋이 관리하는 파드라면, 레플리카셋 컨트롤러가 작동.

4. 스케줄러의 감지 및 결정
파드가 스케줄링되지 않은 상태로 생성되면, 스케줄러가 API 서버를 통해 이를 감지한다. 생성된 파드를 어떤 워커 노드에 적용할지 조건을 고려해 결정하고, 해당 워커 노드에 파드를 띄우도록 요청한다.

5. 스케줄러 -> API 서버에 노드 정보 반영
스케줄러는 선택된 노드 정보를 API 서버에 다시 저장한다.

6. Kubelet -> 컨테이너 생성 요청
할당된 워커 노드의 Kubelet이 주기적으로 API 서버에서 자신에게 할당된 파드 정보를 조회하고, 파드를 생성해야 함을 인지. 이후, 런타임을 통해 파드 안의 컨테이너를 실행한다.


쿠버네티스 오브젝트

쿠버네티스 오브젝트는 쿠버네티스에서 생성하고 관리하는 리소스를 의미한다. 즉, 쿠버네티스 API를 통해 생성되는 모든 리소스는 오브젝트이다. 정말 다양한 오브젝트가 있는데 대략 5개의 카테고리로 나눌 수 있다.

1. 워크로드

"어떤 컨테이너를 어떻게 실행할 것인가"를 정의하는 오브젝트

  • Pod : 가장 기본 단위의 컨테이너 집합
  • ReplicaSet : 지정된 수의 동일한 파드를 유지. 롤링 업데이트 같은 기능이 없으며 업데이트 시 직접 삭제 후 재생성해야 함.
  • Deployment : ReplicaSet을 고수준으로 관리. 내부적으로 RS를 생성하여 어플리케이션을 배포하고 업데이트하고 버전을 관리. 컨테이너 이미지가 변경될 때, 자동으로 새로운 RS와 Pod를 생성하여 무중단 배포 지원.
  • StatefulSet : 상태 저장 파드 + 순서와 고유성 보장
  • DaemonSet : 모든 노드마다 1개씩 파드를 실행
  • Job/CronJob : 일회성 작업 또는 반복 작업 예약

2. 네트워크

"파드들이 서로 또는 외부와 어떻게 통신할 것인가"를 정의

  • Service : 파드에 접근하는 고정된 IP/이름 제공
  • Ingress : HTTP/HTTPS 요청을 라우팅 (도메인 기반)

3. 스토리지

"컨테이너에서 사용하는 저장 공간"을 정의

  • Volume : 파드 내에서 사용하는 추상화된 디스크
  • PersistentVolume : 클러스터 전체에서 관리하는 실제 볼륨 리소스
  • PersistentVolumeClaim : 사용자가 요청하는 스토리지
  • StorageClass : 스토리지 프로비저닝 정책 정의

4. 구성

"어플리케이션에 전달되는 설정이나 비밀 정보" 정의

  • ConfigMap : 일반 설정값 전달
  • Secret : 민감 정보 저장

5. 정책

"보안과 자원 제한"을 위한 오브젝트

  • Namespace : 리소스들을 구분해 관리하는 그룹
  • ResourceQuota : 네임스페이스별 자원 제한
  • LimitRange : CPU/메모리 최소~최대 범위 제한
  • Role/ ClusterRole, RoleBinding : RBAC 권한 설정

이번 글에서는 쿠버네티스 핵심 구성 요소와 주요 오브젝트에 대해 간단히 알아보았다. 다음 글에서는 쿠버네티스의 네트워크 구성과 볼륨에 대해 중점적으로 다뤄볼 예정이다.

profile
부지런히 살자

0개의 댓글