ETCD 란

etcd는 Kubernetes Cluster의 모든 상태 정보를 키-값 형태로 저장하는 데이터베이스이다.

etcd에 장애가 생기면 모든 컴포넌트가 미아가 되기 때문에 가용성이 매우 중요하다. 그래서 보통 이중화, 삼중화 이상을 해 놓는다.


etcd는 클러스터링하여 분산 실행하는 RSM (Replicated State Machine) 구조로 되어있다.

간단히 말해 Leader-Follower 구조인데, Leader node가 클라이언트의 요청을 처리하다가 문제가 생기면 새로운 Leader node가 선출되어 계속해서 가용성을 유지하는 구조이다.  (Follower는 Leader의 상태를 복제해둔 거라고 보면 된다)


etcd는 서버 하나당 프로세스 한 개당 사용할 수 있기 때문에 보통통 etcd 자체를 클러스터링 한 다음 마스터 서버에 분산을 하여 안전성을 보장하는 방식으로 아키텍처를 구성한다.

 

 

minikube를 통해 etcd 살펴보기

minikube를 통해 간단히 etcd의 구성을 살펴보겠다.

 

minikube start

kubectl describe pod etcd-minikube -n kube-system

 

 

ETCDCTL


etcdctl은 etcd를 다루기 위한 유틸리티 (cli) 이다. v2와 v3를 사용할 수 있는데, 기본적으로 v2를 사용한다.

이 명령어를 사용할 때는 etcd api server에 접근하기 위해 인증서 파일 경로를 지정해야 한다.

 

 

etcdctl를 사용하여 etcd 데이터베이스에서 '/registry/pods/' (Kubernetes의 모든 pod가 저장된 곳) 경로에 저장된 키를 가져오는 예시를 수행해보겠다.

kubectl exec -it \
-n kube-system etcd-minikube \
-- sh -c 'ETCDCTL_CACERT=/var/lib/minikube/certs/etcd/ca.crt \
ETCDCTL_CERT=/var/lib/minikube/certs/etcd/peer.crt \
ETCDCTL_KEY=/var/lib/minikube/certs/etcd/peer.key \
ETCDCTL_API=3 \
etcdctl \
get \
--keys-only \
--prefix=true \
"/registry/pods/" '

 

위의 명령어를 수행하면 아래와 같이 '/registry/pods/'로 시작하는 모든 경로를 가져오는 것을 확인할 수 있다.

 

위의 명령어를 좀 더 자세히 설명해보자면 다음과 같다.

kubectl exec -it \ # etcd-minikube 파드에 접속하여 명령을 실행하기 위해 'kubectl exec' 사용, -it 옵션은 인터랙티브 모드 설정
-n kube-system etcd-minikube \ # 'kube-system' 네임스페이스의 'etcd-minikube' pod를 지정
-- sh -c 'ETCDCTL_CACERT=/var/lib/minikube/certs/etcd/ca.crt \ # CA 인증서 경로 설정, etcd 서버 인증서 검증용
ETCDCTL_CERT=/var/lib/minikube/certs/etcd/peer.crt \ # 클라이언트 인증서 경로 설정, etcd 서버와의 통신용
ETCDCTL_KEY=/var/lib/minikube/certs/etcd/peer.key \ # 클라이언트 인증서에 대응하는 프라이빗 키 경로 설정
ETCDCTL_API=3 \ # etcd API 버전을 v3로 설정
etcdctl \ # etcd와 상호작용하기 위한 CLI 도구 실행
get \ # etcd 데이터베이스에서 데이터를 조회하는 명령
--keys-only \ # 키만 가져오도록 설정, 값은 포함하지 않음
--prefix=true \ # 지정된 prefix와 일치하는 모든 키를 검색
"/registry/pods/" ' # Kubernetes의 모든 pod 정보가 저장된 경로 prefix

 

 

+) etcd 에 값 저장하고 읽기

etcd는 데이터베이스니까 값을 저장하고 읽는 것도 가능하다.

etcd pod의 container shell에 접속해서 키-값을 저장하고 읽는 명령을 실행해보도록 하겠다.

kubectl -n kube-system exec -it etcd-minikube -- /bin/sh

 

아래와 같이 etcd shell에 접속이 된 걸 확인할 수 있다.

 

 

간단히 'Name'이라는 키를 저장해보도록 하겠다.

ETCDCTL_API=3 etcdctl \ 
 --cacert /var/lib/minikube/certs/etcd/ca.crt \
 --cert /var/lib/minikube/certs/etcd/peer.crt \
 --key /var/lib/minikube/certs/etcd/peer.key \
 put Name kubernetes

 

키 저장에 성공하면 아래와 같이 'OK'라는 문장이 뜬다.

 

 

위에서 저장한 키를 다시 읽어보도록 하겠다.

ETCDCTL_API=3 etcdctl \ 
--cacert /var/lib/minikube/certs/etcd/ca.crt \
--cert /var/lib/minikube/certs/etcd/peer.crt \
--key /var/lib/minikube/certs/etcd/peer.key \
get Name

 

위에서 넣은 값이 그대로 출력되는 것을 확인할 수 있다.

 

 

모든 클러스터 정보 조회

클러스터의 모든 리소스 정보를 조회하려면 get 명령어의 프리픽스를 클러스터의 모든 리소스가 저장된 최상위 경로인 "/"로 설정해주면 된다.

ETCDCTL_API=3 etcdctl \ 
--cacert /var/lib/minikube/certs/etcd/ca.crt \
--cert /var/lib/minikube/certs/etcd/peer.crt \
--key /var/lib/minikube/certs/etcd/peer.key \
get / --prefix --keys-only

 

그러면 아래와 같이 모든 구성 정보가 출력되는 것을 확인할 수 있다.

'Kubernetes' 카테고리의 다른 글

[Kubernetes] 쿠버네티스를 사용해야 하는 이유  (0) 2024.08.01

오늘날 많은 서비스들이 Container를 통해 운영되고 있다.

 

개발과 운영환경 간의 동일 서비스 보장, 대규모 시스템에서의 마이크로서비스 등 Container가 쓰이고 있는 이유는 정말 다양하다.

하지만 단순히 Container 기술뿐만 아니라 이렇게 다량으로 운영되고 있는 Container를 관리해줄 중앙 구심점 역시도 필요하다.

 

Kubernetes 란

 

 

 

Kubernetes, 줄여서 K8S라고도 부르는 쿠버네티스는 Google에서 개발한 오픈소스 Container Orchestration 플랫폼이다.

 

Container Orchestration 도구는 Kubernetes 말고도 RedHat 사의 OpenShift 등 여러가지가 있지만 

 

완전 오픈소스인데다 어디서든 Reference를 구할 수 있을 만큼 생태계가 풍부하고, On-premise나 Cloud Native 등 환경에 구애받지 않고 어디서든 구동할 수 있다는 점 때문에 현재 Container Orchestration의 표준이 되었다.

 

 

Container Orchestration 이란

 

간단히 말하자면 그냥 수많은 Container들을 관리해주는 것인데, 아래의 Action들을 포함한다

 

자동화된 스케일링

- 트래픽의 변동에 따라 Container를 자동으로 증가시키거나 감소

 

자동화된 Roll-out, Roll-back

- Roll-out: 업데이트 시, 점진적으로 새 버전을 배포하고 모니터링하여 문제가 없으면 점차적으로 전체 시스템에 배포

- Roll-back: 문제가 발생하면 자동으로 이전 버전으로 롤백하여 서비스 중단을 최소화

 

자동화된 복구
- 컨테이너 상태를 계속 감시하고 있는 control tower 필요

- 문제가 발생한 Container를 재시작하고 가용성을 높이고 다운타임을 감소

 

자동화된 Bin Packing

- Bin packing: 리소스를 최대한 효율적으로 사용하기 위해 컨테이너를 클러스터 노드에 자동으로 배치하는 기능

 

시크릿과 구성 관리

- 애플리케이션에서 사용하는 secret을 안전하게 저장

- 환경 설정이나 구성 파일을 중앙에서 관리하여 운영의 일관성을 유지


Service Discovery와 로드 밸런싱

- 각 서비스가 서로 통신할 수 있도록 네트워크를 설정

- 로드 밸런서를 사용하여 Container 간에 트래픽을 균등하게 분배하여 특정 Container에 과부하가 걸리지 않도록 관리

 

Storage Orchestration
- 클라우드 기반의 스토리지 서비스나 로컬 디스크를 Container에 mount

 

IaC를 사용한 운영

- 인프라 설정을 코드로 정의하고 자동으로 provisioning

 

 

Kubernetes의 구성

출처: Kubernetes 공식 페이지

 

Kubernetes는 크게 Control PlaneData plane으로 나뉜다

 

Control plane (Master node) 은 Kubernetes 전체를 통제/관리하는 역할을 담당하며, 아래의 4가지를 포함한다.

  • kube-apiserver
  • etcd
  • kube-scheduler
  • kube-controller-manager

 

Data plane (Worker node) 은 실제 Container Runtime이 있는 부분이며, 실제 애플리케이션이 배포되는 곳이다.

아래 4가지를 포함한다.

  • kubelet
  • kube-proxy
  • continer runtime

 

사용자가 Kubernetes를 사용하기 위해 kubectl (보통 '쿠베시티엘' 이라고 발음) 이라는 명령어를 사용하는데, 이 명령어는 Control plane 으로 전달되며 Container 워크로드에 대한 작업을 수행하게 된다.

 

 

 

 

'Kubernetes' 카테고리의 다른 글

[Kubernetes] ETCD  (0) 2024.08.01

+ Recent posts