본 포스팅은 Kubernetes Official Documents을 기반으로 한다.
쿠버네티스를 배포하면 클러스터를 얻는다.
쿠버네티스 클러스터는 컨테이너화된 애플리케이션을 실행하는 Node 라고 하는 워커 머신의 집합(Data Plane). 모든 클러스터는 최소 한 개의 워커 노드를 가진다.
워커 노드는 애플리케이션의 구성 요소인 파드를 호스트한다. 컨트롤 플레인은 워커 노드와 클러스터 내 파드를 관리한다. 프로덕션 환경에서는 일반적으로 컨트롤 플레인이 복수로 존재하고, 클러스터는 일반적으로 여러 노드를 실행하므로 내결함성과 고가용성이 제공된다.
위는 쿠버네티스 클러스터 구성 요소이다.
Control Plane Components
Control Plane Components는 클러스터에 관한 전반적인 결정(스케줄링)을 수행하고 클러스터 이벤트(Deployment Object의 Replicas 필드에 대한 요구 조건이 충족되지 않을 경우 새로운 파드를 구동시키는 것)를 감지하고 반응한다.
컨트롤 플레인 컴포넌트는 클러스터 내 어떠한 머신에서든지 동작할 수 있다. 그러나 간결성을 위하여, 구성 스크립트는 보통 동일 머신 상에 모든 컨트롤 플레인 컴포넌트를 구동시키고, 사용자 컨테이너는 해당 머신 상에 동작시키지 않는다.
# kube-apiserver
API 서버는 쿠버네티스 API를 노출하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. API 서버는 쿠버네티스 컨트롤 플레인의 프론트 엔드이다.
쿠버네티스 API 서버의 주요 구현체는 kube-apiserver이다. kube-apiserver는 수평으로 확장되도록 설계되었다. 여러 kube-apiserver 인스턴스를 실행하고, 인스턴스간의 트래픽을 균형있게 조절할 수 있다.
# ectd - 엣씨디
모든 클러스터 데이터를 담든 쿠버네티스 백엔드 저장소로 사용되는 일관성 & 고가용성 Key-Value Storage
쿠버네티스 클러스터에서 etcd를 뒷단의 저장소로 사용한다면, 이 데이터를 백업하는 계획은 필수이다.
# kube-scheduler
노드가 배정되지 않은 새로 생성된 파드를 감지하고, 실행할 노드를 선택하는 컨트롤 플레인 컴포넌트이다.
스케줄링 결정을 위해서 고려되는 요소는 리소스에 대한 개별 및 총체적 요구 사항, 하드웨어 & 소프트웨어 & 정책적 제약, affinity 및 anti-affinity 명세, Data Locality, 워크로드간 간섭, Dead-Line을 포함한다.
Affinity & Anti-Affinity란?
사전적 의미: 친밀감, 관련성관련된 것을 함께 묶거나, 특정 요소들 간의 관련성, 상호 작용, 또는 특정 연결을 나타내는 용어성능 최적화, 신뢰성 유지, 네트워크 통신 룰 정으 또는 프로세스 할당과 같은 다양한 목적을 가질 수 있음
# kube-controller-manager - kcm
컨트롤러 프로세스를 실행하는 컨트롤 플레인 컴포넌트.
논리적으로, 각 컨트롤러는 분리된 프로세스이지만, 복잡성을 낮추기 위해 모두 단일 바이너리로 컴파일되고 단일 프로세스 내에서 실행된다.
이들 컨트롤러는 다음을 포함한다.
- Node-Controller: 노드가 다운되었을 때 통지와 대응에 관한 책임을 가진다.
- Job-Controller: 일회성 작업을 나타내는 잡 오브젝트를 감시한 다음, 해당 작업을 완료할 때까지 동작하는 파드를 생성한다.
- Endpoint-Slice-Controller: (서비스와 파드 사이의 연결고리를 제공하기 위해) 엔드포인트 슬라이스 오브젝트를 채운다.
- ServiceAccount-Controller: 새로운 네임스페이스에 대한 기본 서비스 어카운트를 생성한다.
# cloud-controller-manager - ccm
클라우드별 컨트롤 로직을 포함하는 쿠버네티스 컨트롤 플레인 컴포넌트이다. 클라우드 컨트롤러 매니저를 통해 클러스터를 클라우드 공급자의 API에 연결하고, 해당 클라우드 플랫폼과 상호 작용하는 컴포넌트와 클러스터와만 상호 작용하는 컴포넌트를 구분할 수 있게 해준다.
cloud-controller-manager는 클라우드 제공자 전용 컨트롤러만 실행한다. 자신의 사내 또는 PC 내부의 학습 환경에서 쿠버네티스를 실행 중인 경우 클러스터에는 클라우드 컨트롤러 매니저가 존재하지 않는다.
kube-controller-manager와 마찬가지로 cloud-controller-manager는 논리적으로 독립적인 여러 컨트롤 루프를 단일 프로세스로 실행하는 단일 바이너리로 결합한다.
수평으로 확장(두 개 이상의 복제 실행)해서 성능을 향상시키거나 Fault Tolerrance를 강화한다.
다음 컨트롤러들은 CSP의 의존성을 가질 수 있다.
- Node-Controller: 노드가 응답을 멈춘 후 클라우드 상에서 삭제되었는지 판별하기 위해 클라우드 제공 사업자에게 확인하는 것
- Route-Controller: 기본 클라우드 인프라에 경로를 구성하는 것
- Service-Controller: CSP 로드밸런서를 생성, 업데이트 그리고 삭제하는 것
Data Plane(Node) Components
노드 컴포넌트는 동작 중인 파드를 유지시키고 쿠버네티스 런타임 환경을 제공하며, 모든 노드 상에서 동작한다.
# kubelet
클러스터의 각 노드에서 실행되는 에이전트이다. kubelet은 파드에서 컨테이너가 확실하게 동작하도록 관리한다.
kubelet은 다양한 메커니즘을 통해 제공된 PodSpec 집합을 받아서 컨테이너가 해당
파드 스펙에 따라 건강하게 동작하는 것을 확실하게 관리한다.
kubelet은 쿠버네티스를 통해 생성되지 않는 컨테이너는 관리하지 않는다.
# kube-proxy
kube-proxy는 클러스터의 각 노드에서 실행되는 네트워크 프록시로, 쿠버네티스의 서비스 개념의 구현부이다.
kube-proxy는 노드의 네트워크 규칙을 유지 관리한다. 이 네트워크 규칙이 내부 네트워크 세션이나 클러스터 바깥에서 파드로 네트워크 통신을 할 수 있도록 해준다.
kube-proxy는 운영 체제에 가용한 패킷 필터링 계층이 있는 경우, 이를 사용한다. 그렇지 않으면, kube-proxy는 트래픽 자체를 Forward한다.
# Container Runtime
컨테이너 런타임은 컨테이너 실행을 담당하는 소프트웨어이다.
쿠버네티스는 containerd, CRI-O와 같은 컨테이너 런타임 및 모든 K8s CRI 구현체를 지원한다.
# AddOns
애드온은 쿠버네티스 리소스(데몬셋, 디플로이먼트 등)를 이용하여 클러스터 기능을 구현한다. 이들은 클러스터 단위의 기능을 제공하기 때문에 애드온에 대한 네임스페이스 리소스는 kube-system Namespace에 속한다.
# DNS
여타 애드온들은 절대적으로 요구되지 않지만, 많은 예시에서 필요로 하기 때문에 모든 쿠버네티스 클러스터는 Cluster DNS를 갖추어야만 한다.
클러스터 DNS는 구성환경 내 다른 DNS 서버와 더불어, 쿠버네티스 서비스를 위해 DNS 레코드를 제공해주는 DNS 서버이다.
쿠버네티스에 의해 구동되는 컨테이너는 DNS 검색에서 이 DNS 서버를 자동으로 포함한다.
# Web UI - Dashboard
대시보드는 쿠버네티스 클러스터를 위한 범용의 웹 기반 UI이다. 사용자가 클러스터 자체뿐만 아니라, 클러스터에서 동작하는 애플리케이션에 대한 관리와 문제 해결을 할 수 있도록 해준다.
# Container Resource Monitoring
이는 중앙 데이터베이스 내의 컨테이너들에 대한 포괄적인 시계열 매트릭스를 기록하고 그 데이터를 열람하기 위한 UI를 제공해준다.
# Cluster-Level Logging
Cluster-Level Logging 매커니즘은 검색/열람 인터페이스와 함께 중앙 로그 저장소에 컨테이너 로그를 저장하는 책임을 가진다.
K8s Glossary
- Pod: 클러스터에서 실행 중인 컨테이너 집합을 나타낸다.
- Control Plane: 컨테이너의 라이프사이클을 정의, 배포, 관리하기 위한 API와 인터페이스들을 노출하는 컨테이너 오케스트레이션 레이어
- Controller: API-Server를 통해 클러스터의 공유된 상태를 감시하고, 현재 상태를 원하는 상태로 이행시키는 컨트롤 루프
- Service: 네트워크 서비스로 파드 집합에서 실행 중인 애플리케이션을 노출하는 방법
'Infra > Kubernetes' 카테고리의 다른 글
Kubernetes Object Management - 쿠버네티스 객체 관리 (2) | 2023.10.21 |
---|---|
쿠버네티스 객체 이해하기 - Kubernetes Object (2) | 2023.10.19 |
쿠버네티스 API 및 클라이언트 라이브러리 - Kubernetes API & Client Library (0) | 2023.10.18 |
쿠버네티스란 무엇인가? - Kubernetes (0) | 2023.10.11 |
K8s Cluster에 kubectl 안될 때 - The connection to the server <host>:6443 was refused - did you specify the right host or port? (0) | 2023.08.10 |