2024. 12. 11. 23:46ㆍ쿠버네티스/쿠버네티스
ETCD란 무엇인가?
ETCD는 분산형, 신뢰성 높은 키-값 저장소로, 간단하고 안전하며 빠른 성능을 제공합니다. 이는 분산 시스템에서 데이터를 저장하고 관리하기 위한 핵심 구성 요소로, 특히 Kubernetes와 같은 클러스터 환경에서 중요한 역할을 합니다.
키-값 저장소란?
- **전통적인 데이터베이스(예: SQL)**는 데이터를 행(row)과 열(column) 형태의 테이블로 저장합니다. 새로운 정보를 추가하면 전체 테이블에 영향을 미치며, 빈 셀이 생길 가능성이 있습니다.
- 키-값 저장소는 데이터를 독립적인 문서 또는 페이지로 저장합니다. 각 문서는 특정 키와 그에 대응하는 값으로 구성되며, 다른 문서에 영향을 주지 않고 개별적으로 수정 가능합니다. JSON이나 YAML 같은 데이터 형식으로 저장 및 관리됩니다.
ETCD의 주요 특징
- 분산 시스템 지원: ETCD는 여러 노드로 구성된 클러스터에서 동작하며, 고가용성과 데이터 일관성을 제공합니다.
- RAFT 합의 알고리즘: 데이터를 안전하게 복제하고 분산된 상태에서도 일관성을 유지하기 위해 RAFT 알고리즘을 사용합니다.
- 빠르고 간단한 설치:
- GitHub Releases 페이지에서 바이너리를 다운로드하고 실행하면 됩니다.
- 기본적으로 2379 포트에서 서비스가 실행됩니다.
ETCDCTL 클라이언트 사용법
ETCDCTL은 ETCD와 상호작용하기 위한 명령줄 도구입니다.
- 데이터 저장: ./etcdctl put <key> <value> 명령어를 사용하여 키와 값을 저장합니다.
- 데이터 검색: ./etcdctl get <key> 명령어로 값을 검색합니다.
- API 버전에 따라 명령어가 다를 수 있으므로, ETCDCTL_API 환경 변수를 설정하여 v2 또는 v3 API를 선택할 수 있습니다.
ETCD 버전 역사
- 2013년 8월: v0.1 출시
- 2015년 2월: v2.0 출시 (RAFT 알고리즘 개선)
- 2017년 1월: v3.0 출시 (성능 최적화 및 API 변경)
- 2018년 11월: CNCF 프로젝트로 채택
v2와 v3 간의 주요 차이점은 API 구조와 명령어 형식의 변화입니다. 예를 들어:
- v2: set, get 명령어 사용
- v3: put, get 명령어 사용
https://tech.kakao.com/posts/484
Kubernetes 운영을 위한 etcd 기본 동작 원리의 이해 - tech.kakao.com
안녕하세요, 클라우드플랫폼팀 ted입니다. Container Cloud 관련 업무...
tech.kakao.com
etcd란 무엇인가?
- etcd는 분산 키-값 저장소로, Kubernetes의 핵심 데이터(예: 클러스터 상태, 설정 정보 등)를 저장하고 관리합니다.
- 특징:
- 데이터 일관성과 고가용성을 보장.
- Raft 알고리즘을 사용하여 데이터 복제와 리더 선출 수행.
etcd의 기본 동작 원리
- 데이터 저장 및 관리:
- etcd는 클라이언트 요청을 받아 데이터를 저장하며, 이 데이터는 Raft 알고리즘을 통해 클러스터 내 모든 노드에 복제됩니다.
- 클러스터 내 다수 노드가 동일한 데이터를 유지하도록 보장.
- Raft 알고리즘:
- 리더(Leader)와 팔로워(Follower)로 구성된 구조.
- 리더는 클라이언트 요청을 처리하며, 팔로워는 리더로부터 로그를 복제.
- 장애 발생 시 새로운 리더를 선출하여 서비스 지속성을 유지.
- 트랜잭션:
- etcd는 원자적 트랜잭션을 지원하여 데이터의 일관성을 유지.
- 클라이언트 요청은 커밋 로그를 통해 기록되고, 모든 노드에 반영.
- 클러스터 구성:
- etcd 클러스터는 최소 3개 이상의 노드로 구성하여 고가용성을 유지.
- 홀수 개의 노드를 권장하여 합의(Quorum) 과정을 효율적으로 처리.
Kubernetes와 etcd의 관계
- Kubernetes는 etcd를 사용해 API 객체(예: Pod, Service 등)의 상태를 저장하고 관리.
- 모든 Kubernetes 컴포넌트(API Server, Controller Manager 등)는 etcd와 통신하여 클러스터 상태를 확인하고 업데이트.
안정적인 etcd 운영을 위한 고려사항
- 백업 및 복구:
- 정기적인 스냅샷 백업으로 데이터 손실 방지.
- 장애 발생 시 빠른 복구 가능.
- 모니터링:
- etcd의 성능 및 상태를 지속적으로 모니터링하여 잠재적 문제를 사전에 감지.
- 성능 최적화:
- 디스크 I/O 성능이 중요한 요소이므로 SSD 사용 권장.
- 네트워크 지연 시간 최소화 필요.
- 보안 강화:
- TLS 인증 및 암호화를 통해 데이터 전송 보호.
- 접근 제어를 설정하여 불필요한 접근 차단.
Raft의 작동 메커니즘
(1) 리더 선출
-
- 서버는 팔로워(follower) 상태로 시작하며, 일정 시간 동안 리더의 신호(heartbeat)를 받지 못하면 후보(candidate) 상태로 전환.
- 후보는 자신에게 투표하고 다른 서버에 투표 요청(RequestVote RPC)을 보냄.
- 과반수의 투표를 얻으면 **리더(leader)**가 됨.
- 랜덤화된 타임아웃을 사용하여 투표 충돌을 최소화.
(2) 로그 복제
-
- 리더는 클라이언트 요청을 받아들여 로그 항목을 생성하고 이를 팔로워들에게 복제(AppendEntries RPC)함.
- 과반수 서버에 로그 항목이 저장되면 해당 항목은 "커밋" 상태가 됨.
- 팔로워들은 커밋된 로그 항목을 순서대로 상태 머신에 적용.
(3) 안전성 보장
-
- 각 로그 항목은 고유한 "용어(term)"와 함께 저장되며, 동일한 용어와 인덱스를 가진 항목은 모든 서버에서 동일해야 함.
- 새로운 리더는 이전 리더의 커밋된 모든 로그 항목을 포함해야 함(리더 완전성 속성).
3. 주요 속성
- Raft는 다음과 같은 안전성과 일관성을 보장:
- 선거 안전성: 하나의 용어(term)에서 최대 한 명의 리더만 선출 가능.
- 로그 일치: 동일한 인덱스와 용어를 가진 로그 항목은 모든 서버에서 동일.
- 리더 추가/삭제 제한: 새로운 리더는 이전에 커밋된 모든 로그 항목을 포함해야 함.
4. 클러스터 구성 변경
-
- 기존 구성에서 새로운 구성으로의 안전한 전환을 위해 "공동 합의" 단계 도입:
- 두 구성 모두에서 과반수 동의를 요구.
- 단계적 전환으로 두 개의 독립적인 다수결 그룹이 동시에 존재하는 상황 방지.
- 기존 구성에서 새로운 구성으로의 안전한 전환을 위해 "공동 합의" 단계 도입:
https://www.kimsehwan96.com/raft-consensus-algorithm/
Raft 알고리즘 알아보기
💡온프레미스 쿠버네티스 클러스터를 구축하기 위해 준비하면서 etcd에 대해서 자세히 알아보고자 etcd 의 근간이 되는 Raft 합의 알고리즘을 자세하게 알아보게 되었습니다. 전반적으로 Raft 알고
www.kimsehwan96.com
https://www.ibm.com/kr-ko/topics/etcd
etcd란? | IBM
Kubernetes 및 기타 분산 플랫폼의 기본 데이터 백본 역할을 수행하는 결함 허용 오픈소스 키-값 데이터베이스인 etcd에 대해 자세히 알아봅니다.
www.ibm.com
https://www.youtube.com/watch?v=OmphHSaO1sE
etcd의 역할
etcd 데이터 스토어는 클러스터에 관한 다양한 정보를 저장합니다.
예를 들어, 다음과 같은 정보들이 etcd에 저장됩니다:
- 노드(nodes)
- 파드(pods)
- 컨픽(config)
- 시크릿(secrets)
- 계정(accounts)
- 역할(roles)
- 역할 바인딩(role bindings) 등
Kubernetes에서 kubectl get 명령어를 실행할 때 보이는 모든 정보는 etcd 서버에서 가져옵니다.
또한 클러스터에 변경 사항을 적용할 때, 예를 들어:
- 추가 노드를 추가하거나
- 파드를 배포하거나
- 복제 세트를 생성할 때
이 변경 사항은 etcd 서버에 업데이트됩니다.
etcd 서버에 변경 사항이 저장되어야만 변경이 완료된 것으로 간주됩니다.
Kubernetes 클러스터에서 etcd 설정 방법
클러스터 설정 방식에 따라 etcd는 다르게 배포됩니다.
이번 섹션에서는 두 가지 Kubernetes 배포 방식을 다룰 예정입니다:
- 스크래치부터 직접 배포하는 방식
- kubeadm 도구를 사용하는 방식
연습 테스트 환경은 kubeadm 도구를 사용하여 배포되며,
강의 후반부에서는 스크래치부터 클러스터를 설정하는 방법을 배울 것입니다.
따라서 두 방식의 차이를 이해하는 것이 중요합니다.
1. 스크래치부터 배포
스크래치부터 클러스터를 설정할 경우, 다음 과정을 통해 etcd를 배포합니다:
- etcd 바이너리를 직접 다운로드
- 바이너리를 설치하고 설정
- etcd를 마스터 노드에서 서비스로 구성
이 과정에서 여러 옵션을 설정할 수 있습니다.
특히 중요한 옵션 중 다수는 TLS 인증서와 관련이 있습니다.
이 강의 후반부에서는 인증서를 생성하고 구성하는 방법을 배울 것입니다.
(예: TLS 인증서를 다루는 별도의 섹션이 마련되어 있습니다.)
또한, etcd를 클러스터 환경으로 설정할 때 사용하는 추가 옵션도 있습니다.
이를 통해 고가용성을 설정하는 방법을 배울 것입니다.
현재 주목해야 할 옵션은 advertised client URL입니다.
- 이 URL은 etcd가 요청을 수신하는 주소를 나타냅니다.
- 기본적으로 etcd는 서버의 IP와 포트 2379에서 요청을 수신합니다.
- 이 URL은 Kube API 서버가 etcd 서버에 접근할 때 사용되므로, API 서버에 적절히 구성되어야 합니다.
2. kubeadm 도구 사용
kubeadm을 사용하여 클러스터를 설정하는 경우:
- kubeadm은 etcd 서버를 자동으로 배포합니다.
- etcd 서버는 kube-system 네임스페이스에서 실행되는 Pod 형태로 배포됩니다.
Pod 내에서 etcdctl 유틸리티를 사용하여 etcd 데이터베이스를 탐색할 수 있습니다.
예를 들어, Kubernetes에 저장된 모든 키를 나열하려면 다음 명령을 실행합니다:
etcdctl get --prefix /
Kubernetes는 데이터를 특정 디렉터리 구조에 저장합니다:
- 루트 디렉터리는 /registry입니다.
- /registry 아래에는 노드(minions/nodes), 파드(pods), 복제 세트(replica sets), 배포(deployments) 등과 같은 다양한 Kubernetes 리소스가 저장됩니다.
고가용성(High Availability)
고가용성 환경에서는 클러스터에 여러 개의 마스터 노드가 있습니다.
따라서 etcd 인스턴스도 여러 마스터 노드에 분산됩니다.
이 경우, etcd 인스턴스가 서로를 인지하도록 설정해야 합니다.
이를 위해 etcd 서비스 구성에서 initial-cluster 옵션을 설정합니다.
- 이 옵션에서 etcd 서비스의 여러 인스턴스를 지정해야 합니다.
'쿠버네티스 > 쿠버네티스' 카테고리의 다른 글
Kube-API Server 개요 (1) | 2024.12.12 |
---|---|
ETCDCTL API 버전별 명령어 (0) | 2024.12.12 |
개요 (1) | 2024.12.11 |
Pod Task (0) | 2024.12.04 |
쿠버네티스를 사용하여 마이크로서비스 아키텍처 배포-1 (0) | 2024.11.25 |