![[Kubernetes] K8S의 etcd 기본 개념정리](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciP8Ib%2FbtsHqjcviu8%2FoMCWg8Dkjh2YQXwOJm77b0%2Fimg.png)
1. ETCD 란?
ETCD 란 기본적으로 데이터베이스입니다. 분산 key-value store 로 kubernetes 의 백엔드 시스템으로 활용하면서 그 활용도가 점점 확장되고 있습니다. ETCD는 일반적인 관계형 데이터베이스(RDBMS, MySQL, PostgreSQL, Oracle 등이 속함) 과 다르게 NoSQL(MongoDB, Cassandra, Redis)에 속합니다. 기존의 데이터베이스 형태와 etcd를 비교하자면 아래와 같습니다.
- 데이터 모델:
- 기존의 데이터베이스는 일반적으로 관계형 데이터 모델을 사용합니다. 이는 테이블과 열로 구성되어 있으며 SQL(Structured Query Language)을 사용하여 데이터를 쿼리하고 조작합니다.
- 반면에 etcd는 key-value 스토어입니다. 각 데이터는 키와 값으로 저장되며, 데이터 간의 관계를 정의하는 것이 아니라 각 데이터가 고유한 키에 의해 식별됩니다.
- 일관성 보증:
- 기존의 데이터베이스는 ACID(Atomicity, Consistency, Isolation, Durability) 원칙을 준수하여 일관성, 격리성 및 내구성을 보장합니다.
- etcd는 일관성과 가용성을 강조합니다. etcd는 일관된 읽기 및 선별적 쓰기(예: 선별적 쓰기 키를 수정하고 싶을 때만)를 지원하여 데이터의 일관성을 보장하고, 동시성을 향상시키는 동시에 시스템의 가용성을 유지합니다.
- 분산 시스템:
- 기존의 데이터베이스는 분산 환경에서 작동하기 위한 추가적인 레이어가 필요할 수 있습니다. 보통 이를 위해 분산 데이터베이스 시스템을 사용하며, 이는 여러 노드에 데이터를 분산시키고 데이터의 복제 및 일관성 유지를 담당합니다.
- etcd는 분산 시스템의 일부로서 설계되었습니다. 여러 노드에 데이터를 분산시키고 Raft(합의 알고리즘)라는 일관성 알고리즘을 사용하여 분산된 상태를 관리합니다.
- 용도:
- 기존의 데이터베이스는 주로 트랜잭션 처리 및 데이터 분석을 위한 저장소로 사용됩니다.
- etcd는 주로 분산 시스템에서의 구성 관리 및 서비스 디스커버리 등의 용도로 사용됩니다. 예를 들어 Kubernetes와 같은 컨테이너 오케스트레이션 시스템에서 구성 정보를 저장하고 공유하는 데 사용됩니다.
단어정리
몇가지 어려운 단어가 나왔습니다. 단어에 대해서 잠깐 정리하겠습니다.
- 일관된 읽기 (Consistent Reads): 분산 시스템에서 여러 노드에 데이터가 분산되어 있을 때, 일관된 읽기는 어떤 노드에서 읽은 데이터도 다른 노드에서 읽은 데이터와 동일하다는 것을 보장합니다. 이를 통해 시스템 전체에서 일관성 있는 데이터를 조회할 수 있습니다.
- 선별적 쓰기 (Selective Writes): 선별적 쓰기는 필요한 경우에만 데이터를 수정하는 방식을 의미합니다. 예를 들어, 특정 키에 대한 값 변경이 필요한 경우에만 해당 키의 값을 수정합니다. 이를 통해 데이터의 변경이 발생한 경우에만 일관성을 유지하고, 불필요한 동기화 작업을 줄일 수 있습니다.
- Raft(합의 알고리즘) : Raft는 분산 시스템에서 일관성을 유지하기 위해 사용되는 합의 알고리즘 중 하나입니다. 이 알고리즘은 분산 시스템에서 여러 노드 간에 동의를 이끌어내어 일관성 있는 상태를 유지하고, 장애 발생 시에도 시스템이 정상적으로 작동할 수 있도록 도와줍니다. Raft는 간단하고 이해하기 쉬운 설계로 유명하며, 널리 사용되는 합의 알고리즘 중 하나입니다. (예시 블록체인)
- 낙관적 동시성 제어(Optimistic Concurrency Contro) 이란?
낙관적 동시성 제어는 데이터 조각에 잠금을 설정해 그동안 데이터를 잃거나 업데이트를 하지 못하게 하는 대신, 데이터에 버전 번호를 포함하는 방법이다. 데이터가 업데이트 될 때마다 버전번호는 증가된다. 데이터를 업데이트할 때, 클라이언트가 데이터를 읽은 시간과 업데이트를 제출하는 시간 사이에 버전 정보가 증가했는지 여부를 체크한다. 만약에 버전 정보가 증가했다면 수정된 내용은 거부되고 클라이언트는 다시 새 데이터를 읽고, 다시 업데이트를 시도해야 한다. 결과적으로 두 클라이언트가 동일한 데이터 항목을 업데이트 시도시 성공한다. 모든 쿠버네티스 리소스에는 클라이언트가 오브젝트를 업데이트할때 API 서버로 같이 넘겨줘야 하는 metadata.resourceVersion 필드가 있다. 만약 etcd에 저장되어 있는 버전과 일치하지 않을 경우 API 서버는 수정 요청을 거부한다.
1.1 key-value store
기존의 RDBMS 에 대해서 비교를 하면서 설명하도록 하겠습니다. RDBMS 로 못말려대학교의 테이블을 작성해보겠습니다.
이름별로 나이와 학과 등이 작성된 모습입니다. 이중에서 A과만 시험을 보게되어, A과의 성적이 추가된다면 아래와 같겠죠
자 시간이 지나고 입대를 해야하는 친구들이 생겼습니다. 22세 이상인 학생들이 휴학계를 냈습니다. 또 컬럼을 추가해야겠군요.
위와같이 컬럼이 추가될수록 빈공간이 생기게되고 각 컬럼은 테이블내에 있는 모든 개인에게 영향을 끼칩니다. 정작 몇몇은 해당 컬럼이 필요없는데도 말이죠. etcd는 이런 문제를 보완하고자 key-value store 형식을 채택하게 됩니다.
etcd는 위와 같이 key 와 해당하는 값(value)를 각각의 문서에 따로 보관하면서 서로에게 영향을 끼치지 않는 모습을 띄게 됩니다. 개인의 데이터를 수정한다고 또 다른 학생의 데이터를 수정할 필요가 없는 장점이 있습니다. 특정 데이터를 필요로 할경우 key-value를 데이터베이스에서 조회하여 활용하죠. 데이터가 점점 복잡해질경우 json이나 yaml 형식등을 활용하여 key-value를 업데이트 합니다.
가장 활용도가 높은 kubernetes 의 경우는 이런 방식을 활용하여 각 클러스터의 정보, Pod의 정보를 저장 하여 활용합니다.
2. ETCD 커맨드 사용법, etcdctl 인증서 적용 방법
ETCDCTL은 ETCD와 상호작용하는 데 사용되는 CLI 도구입니다.
ETCDCTL은 2가지 API 버전인 버전 2와 버전 3을 사용하여 ETCD 서버와 상호작용할 수 있습니다. 기본적으로 버전 2를 사용하도록 설정되어 있습니다. 각 버전에는 서로 다른 명령 세트가 있습니다.
ETCDCTL 버전 2
etcdctl backup
etcdctl cluster-health
etcdctl mk
etcdctl mkdir
etcdctl set
ETCDCTL 버전 3
etcdctl snapshot save
etcdctl endpoint health
etcdctl get
etcdctl put
커맨드 형식이 Version2 에서는 디렉토리 형식을 지원하다가 Version3 부터는 api 기준의 커맨드로 변경 되었습니다.
자세한 커멘드사용법은 아직 공부가 부족해서 추후에 업로드 하겠습니다.
API 버전을 선택하기 위해서는 아래와 같이 버전을 지정하여야 합니다. 지정하지 않는다면 기본적으로 2 버전으로 인식합니다.
export ETCDCTL_API=3
또한 ETCD API 서버에 접근할시 인증서 파일이 필요합니다. 인증서 파일의 위치는 /etc/etcd.env 에 상세히 작성되어 있습니다.
명령어 사용시 설정해야하는 옵션은 아래와 같습니다.
--endpoints=https://127.0.0.1:2379
--cacert /etc/kubernetes/pki/etcd/ca.crt
--cert /etc/kubernetes/pki/etcd/server.crt
--key /etc/kubernetes/pki/etcd/server.key
저는 항상 옵션을 달며 명령어를 입력할 수 없으니 아래와 같이 alias 에 입력하였습니다.
ubuntu@master01:~$ cat ~/.bashrc | grep etcdctl
alias etcdctl='sudo etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/ssl/etcd/ssl/ca.pem --cert=/etc/ssl/etcd/ssl/admin-master01.pem --key=/etc/ssl/etcd/ssl/admin-master01-key.pem'
위와 같이 입력하여 사용하면 조금더 편리하게 사용할 수 있습니다.
포스팅이 좋았다면 "좋아요" 또는 "구독" 해주세요!