쿠버네티스(Kubernetes)는 컨테이너 오케스트레이션 플랫폼으로, 분산 시스템에서 컨테이너화된 애플리케이션을 관리하고 배포하기 위한 도구입니다. 쿠버네티스는 여러 핵심 컴포넌트로 구성되어 있는데, 각 컴포넌트는 특정한 기능을 담당하며, 함께 작동하여 애플리케이션을 효과적으로 관리합니다. 이번 포스팅에서는 쿠버네티스의 6가지 대표 핵심 개념에 대해서 설명하겠습니다.
1. ETCD
ETCD는 분산 데이터베이스로, 클러스터의 모든 설정 데이터와 현재 상태 정보를 안정적으로 보관합니다.
쿠버네티스는 기반 스토리지(backing storage)로 etcd를 사용하고 있습니다.
만약 동작 중인 클러스터의 ETCD 데이터베이스가 유실된다면 컨테이너뿐 아니라 클러스터가 사용하는 모든 리소스가 사용이 불가하게 됩니다.
ETCD의 특징
distributed reliable key-value store that is smiple, secure and fast.
key-value store
- rows and column 으로 이루어진 데이터를 저장합니다.
- 기존의 데이터 형식은 빈 공간이 많지만, key-value store 형식은 존재하는 값만으로 이루어져 있기에 빈 공간이 없습니다.
ETCD 설치
# 1. Download Binaries
curl -L [주소]
# 2. Extract
tar xzvf [파일이름]
# 3. Run ETCD Service
./etcd
/주의 : etcd는 version 2 와 3이 존재. 어떤 버전인지에 따라 명령어가 달라짐.
ETCD의 역할 in Kubernetes
- Nodes, PODs, Configs, Secrets, Accounts, Roles, Binding, Others에 관한 정보가 저장됩니다.
- 모든 kubectl get 명령어 결과는 etcd 서버에서 가져오는 것입니다.
- scratch, kubeadm 두 가지 방법으로 설정이 가능합니다.
1. Scratch setup
wget -q [주소]
2. Kubeadm setdup
kubectl get pods - n kube-system
etcdctl get / —prefix -keys-only
→ run inside the etcd master pod
2. Kube API server
- 쿠버네티스의 가장 primary management component 입니다.
- 유일하게 etcd 와 다이렉트로 소통합니다.
- 다른 components(스케쥴러, kubelet등등)은 apiserver만을 이용해서 정보 업데이트가 가능합니다.
Pod 생성 절차
- kube-apiserver에 접근
- kube-apiserver의 User authentication, validate 절차
- etcd cluster에서 data retrieve, respond back with information.
- update ETCD, user에게 pod가 생성됨을 알림
- Scheduler는 계속 api server를 모니터링 하다가 새로운 파드 생성을 알고 노드 배정해서 api server에 알림
- apiserver는 이를 etcd cluster에 알리고 배정된 worker node의 kubelet이 pod 생성
- 배정된 워커 노드의 container runtime engine이 이미지 deploy.
- 작업이 끝나면 kubelet이 apiserver에 업데이트
- apiserver는 etcd 클러스터에 업데이트
3. Kube Controller Manager
여러 개의 컨트롤러를 호스팅하는 컴포넌트로, 클러스터의 desired state를 유지하기 위해 동작합니다.
쿠버네티스의 컨트롤러는 계속해서 componets의 현 상황을 모니터링하고 desired functioning state를 유지하게 합니다.
컨트롤러의 주요 역할은:
1) Watch Status
2) Remediate Situation(상태 해결 및 복구)
쿠버네티스에 존재하는 각각의 컴포넌트에 대한 컨트롤러들이 존재하는데요, 이런 모든 컨트롤러를 합쳐서 Kube Controller Manager 라고 합니다.
4. Kube Scheduler
새로운 파드를 적절한 노드에 할당합니다. 파드의 배치를 결정하고 클러스터의 리소스를 효율적으로 활용하기 위해 노드 선택을 기반으로 결정을 내립니다.
스케쥴러가 직접 파드를 배치하지 않습니다.
많은 파드와 노드가 존재할 때, 효율적으로 자원을 관리하기 위해 사용됩니다.
배치 기준
- filter nodes(cpu/메모리 존재하는지)
- rank nodes - priority. 해당 파드를 배치한 후에 남는 리소스의 양을 기준으로 삼습니다.
이 외에도 여러 기준이 존재합니다.
5. Kubelet
각 노드에서 실행되는 에이전트로, 파드를 실행하고 관리하는 역할을 합니다.
마스터 노드에서 할당받은 파드를 실행하고 파드의 상태를 유지하며 Kube-apiserver와 소통합니다.
apiserver를 통해 명령이 들어오면, Container Runtime Engine(도커)에 request를 보내서 필요한 이미지를 pull 합니다.
kubeadm으로 kubelet을 설치할 수 없습니다.
6. Kube Proxy
네트워크 프록시 및 로드 밸런서 역할을 하는 네트워크 프록시 컴포넌트입니다. 서비스의 가상 IP와 포트를 각 노드의 실제 IP와 포트로 매핑하여 외부와의 통신을 관리합니다.
모든 클러스터 내의 파드가 서로 소통이 가능한 이유는 클러스터 안의 Pod Networking Solution 덕분입니다.
파드의 IP 주소는 재시작 시 바뀌므로 Service를 사용하는 것이 좋습니다.
Kube Proxy는 각각의 노드에서 Service를 관리하고, IPtable을 이용해서 트래픽을 맞는 Pod에 전달합니다.
참고
Certified Kubernetes Adiminstrtor(CKA) with Practice Tests by Mumshad Mannambeth, KodeKloud Training
'K8S > 주요 개념' 카테고리의 다른 글
Imperatvie vs Declarative (0) | 2024.01.18 |
---|---|
Service (0) | 2024.01.18 |
Pod, ReplicaSet, Deployment (0) | 2024.01.18 |