1. Kbuernetes(K8s) 란?
MSA에서는 각 서비스가 컨테이너로 패키징되며, 하나의 서비스에 대해 N개의 컨테이너가 존재할 수 있습니다. 수십 개의 서비스만 있어도 수백 개 이상의 컨테이너를 관리해야 합니다.
컨테이너 관리에는 다음과 같은 요구 사항이 있습니다:
- 다수의 서버를 하나의 클러스터처럼 사용.
- 여러 서버에 컨테이너를 배포.
- 서비스 디스커버리로 서비스 간 연결.
- 부하에 따른 자동 스케일링(scale-out, scale-in).
- 장애 시 컨테이너 재생성과 트래픽 재연결.
- 서버 상태(헬스 체크) 모니터링.
- 스토리지 및 네트워크 관리.
이러한 복잡성을 사람이 수동으로 처리하는 것은 비효율적이며, 이를 자동화하기 위해 컨테이너 오케스트레이션이 필요합니다. Kubernetes(K8s)는 이러한 요구를 충족시키는 대표적인 오케스트레이션 도구로, 대규모 컨테이너 관리와 자동화를 지원합니다.
2. K8s 의 철학
K8s 는 다음과 같은 철학에 기초하여 설계, 구현되었습니다.
- Immutable Infrastructure
- 클라우드 환경에서는 컴퓨터 리소스는 자유롭게 생성, 폐기, 확장할 수 있다. 따라서 인프라에 변경이 생기면 기존 인프라에 변경 사항을 적용하는게 아니라 기존 인프라를 파기하고 다시 만들도록 동작한다.
- Declarative Configuration
- K8s 관리자는 인프라가 원하는 상태(Desired State)에 도달하기 위해 필요한 모든 과정을 선언적으로 명시해야한다.
- Self Healing
- K8s 는 실시간으로 클러스터의 현재 상태(Current State) 를 바라보면서 Desired State 와 차이가 발생하면 이를 자동으로 복구한다.
3. K8s 의 구조
3.1 구조 개괄
K8s 의 구조를 단순하게 보면 “Master에 API 서버와 상태 저장소(etcd)를 두고 어플리케이션은 노드의 포드(pod) 에 배포되며, Master 가 각 노드의 에이전트(kubelet)와 통신하는 구조” 입니다.
3.2 마스터
K8s 의 마스터는 클러스터를 관리하는 역할을 합니다. 즉 노드들의 상태를 파악하고 어떤 컨테이너를 어떤 노드에서 가동할지 선택합니다. 이때 분산 저장소에 클러스터의 정보를 저장하고 조회하게 됩니다. 이러한 기능을 위해 각각의 노들들은 상호 직접적으로 소통하는게 아니라 오로지 마스터를 통해서만 소통이 가능하게 됩니다.
이러한 마스터의 주요 구성 요소로는 API Server, Scheduler, Controller Manager, etcd 가 있습니다.
3.2.1 API Server
모든 요청을 처리하는 마스터의 핵심 구성 요소입니다. 검증된 K8s 관리자, 노드의 요청만 처리해야 하므로 인증 및 인가 기능을 갖추고 있습니다.
3.2.2 Scheduler
pod(컨테이너) 가 어떤 노드에서 가동할지 결정하는 구성 요소입니다.
3.2.3 Controller Manager
K8s 클러스터의 상태를 실시간으로 검사하면서 Current State 와 Desired State 를 비교하고 Desired State 가 되도록 유지합니다.
3.2.4 etcd
분산 key-value 저장소로 클러스터의 모든 설정, 상태 데이터를 저장합니다. Scheduler, Controlelr Manager 는 API Server 를 통해 etcd 에서 클러스터의 정보를 조회하고 갱신합니다.
3.3 노드(node)
노드는 pod(컨테이너) 가 직접적으로 가동되는 서버입니다. 다수의 노드로 클러스터를 구성합니다. 하나의 노드도 다양한 구성요소가 존재하는데 대표적인것은 kubelet 과 Kube proxy , 그리고 pod 입니다.
3.3.1 kubelet
실제로 마스터의 요청을 받아 pod(컨테이너) 를 생성하는 주체입니다.
pod(컨테이너) 의 상태를 감시하는 역할도 수행하여 pod 의 상태를 API Server 로 전송합니다.
3.3.2 Kube proxy
각 노드에서 실행되는 네트워크 프록시입니다. 노드의 네트워크 규칙을 유지 관리하고 내부 네트워크 세션이나 클러스터 바깥에서 컨테이너로 네트워크 통신을 할 수 있도록 해줍니다.
3.3.3 pod
K8s 에서 배포할 수 있는 가장 작은 단위로, K8s 의 Object 들 중 하나입니다.
pod 는 하나 이상의 컨테이너와 스토리지 그리고 네트워크 속성 가지고 있으며, 컨테이너와 스토리지는 네트워크를 공유하며 상호 localhost 로 접근할 수 있습니다.
4. K8s 의 Object 들
K8s 에는 대규모 분산환경에 필요한 요소들이 추상화 되어 있고 이러한 요소들을 Object 라고 부릅니다.
4.1 어플리케이션 배포에 관한 Object 들
- pod
- (pod) ReplicaSet
- pod 여러개를 복제하여 관리하는 Object
- Deployment
- K8s 에서 실제 배포를 진행하는 기본 단위로 배포 전략 선택, 배포 Revision, Roll Back 등의 기능을 사용하려면 이 Objet 를 이용해야한다.
- DaemonSet
- 클러스터 전체에 적용되는 pod 를 띄울때 사용하는 Controller로 DaemonSet 을 이용해 띄운 pod 는 항상 모든 node 에서 실행된다. 로그 수집이나 모니터링에 적합하다.
- StatefulSet
- K8s Object 들은 대부분 Stateless 하다. Stateful 한 Volume 을 이용한 DB 등을 pod 로 만들때 사용하는 Object 이다.
4.2 네트워크에 관한 object 들
- Service
- pod 간 연결 및 pod 와 외부 네트워크를 연결 하는 object 이다.
- 여러 pod 에 대한 L4 수준의 내부 로드밸런서의 역할을 수행하며 내부 DNS에 서비스를 등록하여 서비스 디스커버리 역할도 수행한다.
- Ingress
- 외부 트래픽을 받는 Object 로 http, https 등 L7 레벨에서 라우팅 규칙, 로드밸런싱 규칙 등을 설정한다.
- 일반적으로 클러스터를 외부로 노출할때는 Ingress 를 이용한다.
5. 최종 K8s 구조
이상의 K8s 구조, Object 를 종합하면 아래와 같이 그릴 수 있습니다.
'기초 지식 > K8s' 카테고리의 다른 글
Container와 Docker (0) | 2024.11.20 |
---|