etcd는 분산 시스템의 설정과 상태를 보관하는 키-값 저장소다. 여러 구성원이 합의한 순서로 변경을 반영하여 일관된 상태를 제공하며 Kubernetes 제어면의 저장소로도 사용된다. 대용량 파일이나 분석 데이터를 저장하는 범용 데이터 창고와는 목적이 다르다. 공식 FAQ는 클러스터 크기와 장애 허용 등 운영 특성을 설명한다.
합의와 변경 관찰
Raft 합의는 리더와 다수 구성원의 참여를 통해 쓰기 순서를 정한다. 구성원이 세 개라면 보통 하나의 장애를 견디지만, 과반수를 잃으면 정상적인 쓰기 진행이 어렵다. 노드를 더 추가한다고 쓰기 성능이 선형으로 증가하지 않으며 네트워크 지연과 디스크 지연이 합의 비용에 영향을 준다.
키에는 변경 이력을 구분하는 revision이 있고 watch로 변경을 구독할 수 있다. 비교 조건이 맞을 때만 값을 바꾸는 트랜잭션은 동시 갱신을 조정하는 기반이 된다. lease를 연결하면 일정 시간 갱신되지 않은 임시 키를 만료시키는 방식도 구성할 수 있다. etcd API 설명은 이 원시 기능의 의미를 정의한다.
장점과 한계
구성·서비스 발견·리더 선출처럼 작은 상태의 일관성이 중요한 문제에 적합하다. 단순한 키-값 인터페이스에 조건부 갱신과 변경 구독을 결합할 수 있다는 것이 장점이다. 반면 관계형 조인이나 대용량 객체 저장이 필요한 업무에는 다른 저장소가 더 적절할 수 있다.
디스크 여유, 데이터베이스 크기, 이력 정리, 인증서와 백업을 관리해야 한다. 복제는 실수로 저장한 값도 복제하므로 백업을 대신하지 않는다. 기존 Kubernetes의 etcd를 다른 실습 프로그램의 저장소로 임의 공유하지 않고, 별도의 연습 인스턴스를 사용한다.
예약 기능 설정 조회 예시
localhost의 독립 연습용 etcd에 /reading-room/config/ 아래 설정이 미리 저장되어 있고 인증 요구가 없는 격리 실습 환경이라고 가정한다. 다음은 읽기와 변경 구독만 수행하는 예시다. 실제 서비스에서는 인증과 TLS를 갖춘 엔드포인트 및 클라이언트 설정을 사용해야 한다.
etcdctl --endpoints=http://127.0.0.1:2379 get /reading-room/config/ --prefix
etcdctl --endpoints=http://127.0.0.1:2379 watch /reading-room/config/ --prefix첫 명령은 현재 일치하는 키와 값을 출력하고, 두 번째는 이후 발생하는 해당 접두사 변경을 기다린다. watch는 처음부터 모든 상태를 자동으로 재구성하는 스냅샷이 아니므로 실제 클라이언트는 초기 조회와 이후 변경 연결, 연결 단절·이력 정리 후 재동기화를 설계해야 한다.
자주 생기는 오해
값을 읽고 별도 요청으로 덮어쓰는 방식은 다른 작성자의 변경을 놓칠 수 있다. 동시성이 중요한 경우 revision 등을 비교하는 트랜잭션을 사용한다. 복구 과정에서 단순히 오래된 데이터 디렉터리를 실행 중 클러스터에 복사하는 대신, 해당 버전의 공식 스냅샷·복원 절차를 따른다.
참고 자료
Kubernetes 클러스터 구성 길잡이 | |
|---|---|
전체 구조 | |
설치와 조작 | |
컨테이너 실행 | |
네트워크와 이름 | |
진입과 메시 | |
설치와 배포 관리 | Helm · Argo CD · Argo Rollouts |
이미지 공급 | |