Kubernetes란 무엇인가?
Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장, 운영을 자동화하는 오픈소스 플랫폼입니다. 구글이 2014년 오픈소스로 공개했으며, 현재는 Cloud Native Computing Foundation(CNCF)에서 관리하고 있습니다.
Kubernetes는 초기 Google의 내부 시스템인 Borg에서 영감을 받아 개발되었으며, 15년 이상의 대규모 서비스 운영 경험과 커뮤니티의 아이디어가 반영되어 있습니다. 이름인 Kubernetes는 '키잡이(helmsman)' 또는 '파일럿'을 의미하는 그리스어에서 유래되었습니다.
이 플랫폼은 이식성, 확장성, 자동화, 선언적 구성을 지원하며, 다양한 환경(온프레미스, 클라우드, 하이브리드)에서 유연하게 동작합니다.
1. Kubernetes 아키텍처 구성요소
Kubernetes는 크게 컨트롤 플레인(Control Plane)과 데이터 플레인(Worker Node)으로 구성됩니다. 각각의 컴포넌트들은 클러스터의 상태를 유지하고 파드를 배포 및 관리하는 데 필수적인 역할을 합니다.
2. 컨트롤 플레인 컴포넌트 (Master Node)
컨트롤 플레인은 클러스터 전체의 상태를 제어하고 조율합니다.
2.1 kube-apiserver
Kubernetes API를 외부에 노출하는 핵심 컴포넌트입니다. 모든 명령어, 요청, 오브젝트 생성 등은 API 서버를 통해 전달됩니다. 수평 확장이 가능하여 복수 인스턴스로 구성할 수 있습니다.
2.2 etcd
클러스터의 모든 상태 데이터를 저장하는 고가용성 키-값 저장소입니다. 클러스터의 구성 정보, 오브젝트 정의 등이 저장되며, 정기적인 백업이 필수입니다.
2.3 kube-scheduler
새로 생성된 파드에 적절한 노드를 선택하여 할당합니다. 리소스 사용량, 노드 상태, 어피니티(affinity), 정책 등을 종합적으로 고려하여 스케줄링을 수행합니다.
2.4 kube-controller-manager
여러 컨트롤러(노드, 레플리카, 엔드포인트, 서비스 계정 등)를 통합하여 실행하는 컴포넌트입니다. 시스템이 정의한 상태를 실제로 유지되도록 감시하고 제어합니다.
- 노드 컨트롤러: 노드가 다운되었을 때 통지와 대응에 관한 책임을 가짐
- 레플리케이션 컨트롤러: 전체 시스템의 모든 레플리케이션 컨트롤러 오브젝트에 대해 설정된 수의 파드들을 유지시켜
- 엔드포인트 컨트롤러: 서비스와 파드를 연결
- 서비스 어카운트 & 토큰 컨트롤러: 새로운 네임스페이스에 대한 기본 계정과 API접근 토큰 생성
2.5 cloud-controller-manager
클라우드 환경에서만 동작하며, 클라우드 서비스와의 연동을 담당합니다. 노드 상태 확인, 로드밸런서 생성, 라우팅 등 클라우드 공급자와 관련된 작업을 분리하여 처리합니다.
3. 데이터 플레인 컴포넌트 (Worker Node)
데이터 플레인은 실제로 사용자 애플리케이션(파드)이 실행되는 환경입니다. 모든 워커 노드는 다음과 같은 컴포넌트를 포함합니다.
3.1 kubelet
각 노드에서 실행되는 에이전트로, 파드가 정상적으로 실행되도록 보장합니다. 컨테이너가 PodSpec에 따라 정확하게 동작하도록 관리합니다.
3.2 kube-proxy
각 노드에서 실행되며, 네트워크 트래픽을 적절한 파드로 라우팅합니다. IP 테이블 또는 IPVS를 이용해 서비스 간 통신을 가능하게 합니다.
3.3 Container Runtime
컨테이너를 실행하는 소프트웨어입니다. Kubernetes는 containerd, CRI-O, Docker 등 다양한 런타임을 지원합니다. 현재는 containerd가 가장 널리 사용됩니다.
- Docker가 아닌 containerd를 사용하는 이유
- kubernetes에서 container runtme과 통신할 때 CRI(Container Runtime Interface)를 사용함
- Docker은 CRI를 지원하지 않았고, dockershim이라는 중간 어댑터가 필요함
- kubernetes는 컨테이너 런타임 역할만 필요했으나 docker사용 시 dockershim이라는 불필요한 계층(복잡도, 리소스 낭비, 오류 가능성 상승)을 중간에 추가해야 했음.
- kubernetes는 dockershim(docker)지원을 공식적으로 중단함
- 결론 - Kubernetes에 꼭 필요한 기능만, 더 가볍고 성능 좋게, 표준 인터페이스(CRI)로 통합하기 위해서 containerd를 사용
4. 네임스페이스 (Namespace)
Kubernetes에서 네임스페이스는 하나의 클러스터를 여러 개의 논리적 단위로 분리해 주는 기능입니다. 이는 리소스 관리, 보안, 접근제어 등을 보다 세밀하게 할 수 있도록 해줍니다.
4.1 주요 기능
- 리소스 분리: 개발, 테스트, 운영 등 환경별 분리를 통해 격리 운영 가능
- 액세스 제어: RBAC(Role-Based Access Control)을 통해 사용자 권한을 네임스페이스 단위로 제한 가능
- 리소스 할당: 네임스페이스별로 CPU, 메모리 등의 자원 쿼터 설정 가능
- 정책 적용: 네트워크 정책을 통해 네임스페이스 간 통신 제어 가능
4.2 기본 네임스페이스
kubernetes는 기본적으로 아래와 같은 네임스페이스를 제공합니다.
- default: 기본 네임스페이스
- kube-system: Kubernetes 시스템 컴포넌트가 사용
- kube-public: 모든 사용자가 접근 가능
사용자는 필요에 따라 네임스페이스를 추가로 생성하여 조직, 팀, 환경별로 클러스터를 효율적으로 운영할 수 있습니다.
5. 파드 (Pod)
파드는 Kubernetes에서 가장 기본적인 배포 단위로, 하나 이상의 컨테이너와 해당 컨테이너가 공유하는 스토리지, 네트워크 속성을 포함합니다.
Pod 내부의 컨테이너들은 동일한 네트워크 네임스페이스를 사용하기 때문에 localhost를 통해 서로 통신할 수 있으며, 공유된 볼륨을 통해 데이터를 주고받을 수도 있습니다.
실제로는 대부분의 경우 하나의 컨테이너만 포함하는 Pod가 사용되지만, Kubernetes에서는 모든 컨테이너를 반드시 Pod로 감싸서 관리해야 합니다. 이는 컨테이너 간 밀접한 연동이 필요한 경우(Pattern: Sidecar, Ambassador, Adapter 등)를 지원하기 위함입니다.
마치며
Kubernetes는 복잡하지만 강력한 도구입니다. 아키텍처에 대한 충분한 이해는 안정적인 클러스터 운영의 첫걸음이 됩니다. 본 글에서 소개한 각 컴포넌트들은 추후 구성, 문제 해결, 확장에 있어서 핵심적인 기반이 되므로 반드시 숙지하고 넘어가는 것이 좋습니다.
'Infra' 카테고리의 다른 글
[Kubernetes] Kubernetes 네트워크 서비스와 파드 연결 방식 (0) | 2025.07.15 |
---|---|
[Kubernetes] Kubernetes Deployment 이해하기 (0) | 2025.07.15 |
[Kubernetes]Kubernetes 설치 및 설정 (rocky8 Linux 기준) (1) | 2025.07.09 |
[Docker] Dockerfile 구성하기 (1) | 2025.07.03 |
[Docker] Docker 명령어 정리 (1) | 2025.07.01 |