이 글은 아래 자료를 참고하여 작성되었습니다.
Udemy [Certified Kubernetes Administrator (CKA) with Practice Tests]
1. ETCD란?
ETCD는 Kubernetes와 같은 분산 시스템에서 중요한 역할을 하는 분산형 키-값 저장소이다. 고가용성과 일관성을 제공하는 저장소로, 주로 클러스터 구성 정보와 설정 데이터를 저장하는 데 사용된다.
2. ETCD의 주요 특징
- 일관성 보장: ETCD는 강력한 일관성을 보장하며, 이를 통해 클러스터 상태의 신뢰성이 확보된다. 모든 노드에서 동일한 데이터를 볼 수 있으며, 트랜잭션과 같은 작업이 안정적으로 처리된다.
- 고가용성: ETCD는 분산 시스템으로 설계되었으며, 여러 노드에 데이터를 복제함으로써 장애가 발생해도 데이터가 손실되지 않도록 설계되었다.
- 강력한 리더 선출 메커니즘: Raft 알고리즘을 통해 리더를 선출하여 클러스터가 비정상적인 상태에서도 동작을 지속할 수 있게 한다.
- 보안: ETCD는 TLS 인증 및 클라이언트 간의 암호화를 지원하여 데이터 전송 중에 발생할 수 있는 보안 문제를 해결한다.
- 빠른 성능: ETCD는 가볍고 빠르며, 특히 작은 키-값 쌍을 저장하는 데 최적화되어 있어 높은 성능을 제공한다.
3. 설치 및 사용법
- ETCD 바이너리 다운로드: 운영 체제에 맞는 바이너리를 GitHub Releases 페이지에서 다운로드한다.
- 압축 풀기 및 실행: 다운로드한 파일의 압축을 풀고, ETCD 실행 파일을 실행하면 기본적으로 포트 2379에서 서비스가 시작된다. 이 포트는 클라이언트와의 통신에 사용된다.
- 클라이언트 연결: ETCD는 클라이언트와 연결하여 데이터를 저장하고 검색할 수 있다.
- 고가용성 설정: ETCD는 분산 시스템에서 여러 노드에 걸쳐 데이터를 동기화하는 고가용성 기능을 제공한다. 특히 Kubernetes와 같은 플랫폼에서 노드 간의 상태 및 설정 데이터를 일관성 있게 관리하기 위해 사용된다. 고가용성 환경에서는 ETCD 클러스터의 노드 수를 관리하는 것이 중요하며, 보통 3개 이상의 노드가 권장된다.
4. ETCD 버전 별 주요 변경사항
- ETCD 0.x (2013)
- 초기 개발 버전: 기본적인 분산 키-값 저장소 기능을 제공하는 프로토타입 단계.
- 기능적 제한: 고가용성, 보안, 성능 측면에서 아직 많은 개선이 필요했던 시기.
- ETCD 2.x (2015)
- HTTP/JSON 기반 API: ETCD 2.x는 API v2를 사용하여 클라이언트와 HTTP/1.1을 통해 통신. 키-값 데이터를 저장하고 관리하는 기능 제공.
- 간단한 데이터 구조: 트랜잭션 기능이나 복잡한 데이터 구조를 지원하지 않았으며, 주로 작은 규모의 분산 시스템에서 사용됨.
- Eventually Consistent 모델: 완벽한 일관성을 보장하지는 못했으며, 읽기 작업에 있어서는 일관성이 부족한 경우가 발생할 수 있음.
- 고가용성 지원: Raft 알고리즘을 통해 기본적인 고가용성을 지원했으나, 성능이나 확장성에서 제한이 있었음.
- Kubernetes 초기 사용: Kubernetes 초기 버전에서 ETCD 2.x가 사용되었으며, 클러스터 상태 저장소로서 역할을 했음.
- ETCD 3.x (2016)
- API v3 도입: ETCD 3.x 시리즈부터는 Protobuf 기반의 API v3가 도입되었으며, HTTP/JSON 대신 gRPC를 통해 클라이언트와 통신. 이를 통해 성능과 확장성이 크게 향상됨.
- 트랜잭션 지원: API v3에서는 멀티 키 트랜잭션이 도입되어, 여러 키에 대한 원자적 연산이 가능해졌음.
- 더 강력한 일관성 모델: Raft 알고리즘을 통한 강력한 일관성(Strong Consistency) 보장. 클러스터 내 모든 노드가 동일한 상태를 유지함.
- gRPC 기반 통신: HTTP/1.1 대신 gRPC를 사용하여 더 효율적이고 빠른 데이터 전송 가능.
- Watch 기능 강화: 특정 키나 경로에 대해 실시간 변경 사항을 감지하는 Watch 기능이 크게 개선됨.
- ETCD 3.4.x (2019)
- 대규모 클러스터 지원 강화, 보안 기능 향상, 성능 최적화. Watch 기능과 클러스터 관리 툴의 개선
- API version 3가 default로 설정됨
5. ETCDCTL
5-1. 버전확인
./etcdctl --version
>>>
etcdctl version: 3.3.11
API version: 2
# etcdctl 3.4부터 default API version이 3으로 변경됨
# 그 전 etcdctl 버전에서도 원하는 API version 3으로 설정 가능 (명령어마다 설정)
ETCDCTL_API=3 ./etcdctl version
>>>
etcdctl version: 3.3.11
API version: 3
# session에서 API version 3로 설정
export ETCDCTL_API=3
./etcdctl version
>>>
etcdctl version: 3.3.11
API version: 3
- ETCDCTL version 명령어를 실행하면 현재 ETCDCTL의 버전과 설정된 API 버전을 확인할 수 있다.
- API 버전을 3으로 설정해야 새로운 명령어(put, get 등)를 사용할 수 있다.
5-2. 주요 명령어 (API version 3)
# 기본명령어
## 키-값 쌍 설정 (Put)
etcdctl put <key> <value>
## 키-값 쌍 조회 (Get)
etcdctl get <key>
## 키 삭제 (Delete)
etcdctl del <key>
## 프리픽스 검색 (Range Get)
## 특정 프리픽스를 가진 모든 키를 조회
etcdctl get <prefix> --prefix
## 특정 키나 프리픽스에 대한 실시간 변경 감지 (Watch)
etcdctl watch <key> [--prefix]
# 클러스터 관리 명령어
## 클러스터 상태 확인 (Endpoint Status)
## ETCD 클러스터의 각 노드의 상태를 확인
etcdctl endpoint status
etcdctl endpoint status --write-out=table
## 리더 확인
etcdctl endpoint leader
6. Kubernetes에서의 ETCD 역할
ETCD는 Kubernetes 클러스터의 중심 데이터 저장소 역할을 한다. 클러스터의 상태, 설정, 보안 정보 등 중요한 데이터를 저장하며, 클러스터의 모든 구성 요소들이 ETCD에 의존하여 동작한다.
- 데이터 저장소: kubectl get 명령어를 통해 조회할 수 있는 모든 데이터는 ETCD에 저장되어 있다. 노드, 파드, 레플리카셋, 설정, 시크릿, 계정, 역할 등의 정보가 포함된다.
- 변경 사항 처리: 클러스터에 새로운 노드를 추가하거나 파드를 배포하는 등의 모든 변경 사항은 ETCD에 저장되어야 최종적으로 완료된 것으로 간주된다. 이는 ETCD가 Kubernetes 클러스터의 일관성을 유지하는 핵심 요소임을 보여준다.
- 실시간 동기화: ETCD는 클러스터의 상태를 실시간으로 반영하며, 클러스터 구성 요소들이 항상 최신 상태로 유지되도록 돕는다.
7. Kubernetes 클러스터 설정 방법에 따른 ETCD 배포
Kubernetes 클러스터를 설정하는 방법에 따라 ETCD의 배포 방식이 달라진다.
- 처음부터 설정하는 경우:
- 직접 배포: 클러스터를 처음부터 설정하는 경우, ETCD 바이너리를 직접 다운로드하여 설치하고, 마스터 노드에서 ETCD를 서비스로 구성해야 한다.
- 인증서 설정: ETCD의 보안을 위해 TLS 인증서를 사용하여 통신을 암호화할 수 있으며, 이는 Kubernetes 클러스터의 보안 강화에 중요한 역할을 한다.
- 포트 설정: ETCD가 사용하는 기본 포트는 2379번이며, 이를 통해 API 서버와 통신한다.
- --advertise-client-urls: etcd 서버가 클라이언트에게 자신이 어디에서 접속 가능한지 알리는 주소를 설정. 클라이언트가 etcd 서버에 연결할 때 사용하는 주소로, 일반적으로 etcd 서버가 실행 중인 IP 주소와 포트 번호를 포함한 URL을 지정한다.
- Kubernetes API 서버는 etcd에 데이터를 저장하거나 검색하기 위해 etcd에 연결할 때 --advertise-client-urls 옵션에 정의된 URL을 참조한다. 이 URL이 올바르게 설정되지 않으면, API 서버가 etcd에 연결할 수 없게 되어 클러스터 관리에 문제가 발생할 수 있다.
- 고가용성(HA) 환경에서는 여러 개의 etcd 인스턴스가 각 마스터 노드에 분산 배치된다. 이러한 경우, 각 etcd 인스턴스가 다른 노드에 있는 etcd 인스턴스와 상호 작용할 수 있어야 한다. 이를 위해, 각 etcd 인스턴스는 자신의 IP와 포트를 기반으로 한 고유한 URL을 --advertise-client-urls에 설정하고, --advertise-client-urls 옵션과 함께 --initial-cluster 옵션을 설정이 필요하다.
- 형식:
--advertise-client-urls=http://<ip>:<port>,https://<ip>:<port>
- --initial-cluster: etcd 클러스터를 처음 시작할 때 각 etcd 인스턴스(노드)가 어떤 인스턴스들과 함께 클러스터를 형성해야 하는지 알려주는 역할을 한다. 클러스터에 참여하는 모든 etcd 인스턴스의 이름과 통신할 주소를 나열해야 한다.
- 형식:
--initial-cluster=<name1>=<url1>,<name2>=<url2>,<name3>=<url3>
- name1, name2, name3: 각각의 etcd 인스턴스의 고유 이름입니다. 각 인스턴스를 구분할 수 있는 고유 식별자입니다.
- url1, url2, url3: 해당 인스턴스와 통신할 피어(peer) 주소이다. 일반적으로 etcd 인스턴스가 다른 etcd 인스턴스와 상호작용할 때 사용하는 주소로, etcd 피어 간 통신에 사용되는 2380번 포트가 포함된다.
- 형식:
- --advertise-client-urls: etcd 서버가 클라이언트에게 자신이 어디에서 접속 가능한지 알리는 주소를 설정. 클라이언트가 etcd 서버에 연결할 때 사용하는 주소로, 일반적으로 etcd 서버가 실행 중인 IP 주소와 포트 번호를 포함한 URL을 지정한다.
- Kubeadm을 사용하는 경우:
- 자동 배포: kubeadm을 사용하여 클러스터를 설정하는 경우, ETCD 서버는 kube-system 네임스페이스 내에서 파드로 자동 배포된다.
- ETCDCTL 유틸리티 사용: 배포된 ETCD 파드 내에서 ETCDCTL 유틸리티를 사용해 데이터를 탐색할 수 있다. 예를 들어, etcdctl get 명령어를 통해 저장된 키와 값을 조회할 수 있다.
- 디렉터리 구조: Kubernetes는 데이터를 특정 디렉터리 구조에 저장하며, 루트 디렉터리는 /registry로 시작한다. 이 아래에 노드, 파드, 레플리카셋, 설정 등의 데이터가 저장된다.
'Kubernetes' 카테고리의 다른 글
18. Core Concepts - Kube Controller Manager (2) | 2024.09.23 |
---|---|
17. Core Concepts - Kube API Server (1) | 2024.09.20 |
15. Kubernetes Overview - Docker vs Containerd (2) | 2024.09.18 |
14. Tips - Imperative vs Declarative (0) | 2024.09.12 |
13. Core Concepts - Namespace (2) | 2024.09.11 |