본문 바로가기

Container/Kubernetes

[K8S] ETCD

ETCD is a distributed reliable key-value store that is Simple, Secure & Fast.

 

etcd분산 키-값 저장소(distributed key-value store)로, 주로 분산 시스템에서 데이터를 공유하고 상태를 관리하는 데 사용된다.

etcd는 고가용성(HA), 데이터 일관성, 그리고 빠른 성능을 목표로 설계되었으며, 쿠버네티스(Kubernetes)를 포함한 여러 분산 시스템에서 핵심 구성 요소로 사용된다.

  • etcd는 쿠버네티스에서 클러스터 상태 데이터를 저장하는 핵심 구성 요소이다.
  • control plane(API 서버, 스케줄러 등)이 etcd를 통해 클러스터 상태를 관리.
  • etcd 데이터 손실 시, 클러스터 상태 복구가 어렵기 때문에 백업모니터링이 중요.

 

 

  • 저장되는 데이터
    • 노드 정보: 클러스터 내 노드의 상태.
    • 파드 정보: 파드의 구성 및 상태.
    • 서비스 디스커버리: 클러스터 내 서비스 위치.
    • Configs, Secrets, Accounts, Roles, Bindings, Others....

 

주요 특징

  1. 분산구조 : etcd는 클러스터로 구성되어 여러 노드가 협력하여 HA와 일관성을 유지한다.
  2. 일관성 보장: RAFT 알고리즘을 사용하여 데이터를 일관되게 복제한다 (클라이언트가 데이터 요청할 때 항상 최신 데이터만 제공한다)
  3. 빠른 성능: 초당 수천 개의 요청을 처리할 수 있는 성능을 제공한다.
  4. 간단한 인터페이스: HTTP/gRPC API를 통해 데이터를 저장(set), 읽기(get), 삭제(delete)할 수 있다.
  5. 고가용성: 클러스터 내에서 리더(leader)와 팔로워(follower) 노드로 구성되어 장애에 대한 복구가 자동으로 이루어진다. (최소 3개의 노드로 구성된 클러스터를 통해 장애 허용성을 확보)

RAFT 알고리즘: RAFT는 리더를 중심으로 데이터를 복제하며, 리더는 클라이언트 요청을 처리하고 다른 노드에 복제(log replication)한다.

Key - Value Sore

원래 데이터베이스는 행/열 기반의 table 포맷(ex] SQL, 관계형 데이터베이스)로 구성되어있다. 하지만 이는 새로운 데이터가 추가될 때마다 테이블 전체가 영향을 받아서 empty(Null)값이 많아진다.

그에반해 Key-Value Store는 data를 document나 page 형태로 보관한다. -> 데이터가 추가될 때 다른 document를 업데이트할 필요가 없다. 

데이터가 복잡해지면 트랜잭션 포맷인 yaml이나 json같은 포맷을 사용한다.

 

◎ 트랜잭션 지원: 여러 작업을 하나의 트랜잭션으로 묶어서 처리

 

Install ETCD

1. Download Binaries

https://github.com/etcd-io/etcd/releases/download/v3.3.11/etcd-v3.3.11-linux-amd64.tar.gz

2. Extract 

tar xzvf etcd-v3.3.11-linux-amd64.tar.gz

3. Run ETCD Service

etcdctl은 etcd와 상호작용하기위해 사용되는 CLI tool이다.

etcdctl은 2개의 API version[Version2(default), Version3]을 사용해서 etcd server와 상호작용할 수 있다.

# port 2379를 사용하는 etcd 서비스 시작
$ ./etcd

# operate etcd (default client: etcdctl)
$ ./etcdctl set key1 value1
$ ./etcdctl get key1
value1

$ ./etcdctl
NAME:
	etcdctl - A simple command line client for etcd.
COMMANDS:
	backup backup an etcd directory
	cluster-health check the health of the etcd cluster
	mk make a new key with a given value
	mkdir make a new directory
	rm remove a key or a directory
	rmdir removes the key if it is an empty directory or a key-value pair
	get retrieve the value of a key
    
#etcdctl version 확인
$ ./etcdctl --version
etcdctl version: 3.4
API version: 3

# API version 설정 command
$ ETCDCTL_API=3 ./etcdctlversion

# v3에서는 set이 아닌 put 사용
$ ./etcdctl put key1 value1
$ ./etcdctl get key1
key1
value1

 

ETCD version 2

etcdctl backup
etcdctl cluster-health
etcdctl mk
etcdctl mkdir
etcdctl set

 

ETCD version 3

export ETCDCTL_API=3
  • 쿠버네티스가 저장한 모든 key를 list화
$ kubectl get pods -n kube-system

# Run inside the etcd-master POD
$ kubectl exec etcd-master -n kube-system etcdctl get / --prefix -keys-only
/registry/apiregistration.k8s.io/apiservices/v1.
/registry/apiregistration.k8s.io/apiservices/v1.apps
/registry/apiregistration.k8s.io/apiservices/v1.authentication.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.autoscaling
/registry/apiregistration.k8s.io/apiservices/v1.batch
/registry/apiregistration.k8s.io/apiservices/v1.networking.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.rbac.authorization.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.storage.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1beta1.admissionregistration.k8s.io
...
# 이렇게 쿠버네티스는 특정 directory 구조로 데이터를 저장한다.

 

HA 환경에서는 클러스터에서 마스터 노드가 여러개로 구성된다. 그러면 ETCD instance 또한 여러개로 구성된다.

 

반응형

'Container > Kubernetes' 카테고리의 다른 글

[K8S] Kube-controller-manager  (0) 2024.12.24
[K8S] Kube-API Server  (0) 2024.12.24
[K8S] 컨테이너 런타임  (0) 2024.12.24
[K8S] TS - Control Plane Failure  (0) 2024.04.28
[K8S] Multiple Container  (0) 2024.04.28