ETCD

2024. 12. 11. 23:46쿠버네티스/쿠버네티스

728x90
반응형

ETCD란 무엇인가?

ETCD는 분산형, 신뢰성 높은 키-값 저장소로, 간단하고 안전하며 빠른 성능을 제공합니다. 이는 분산 시스템에서 데이터를 저장하고 관리하기 위한 핵심 구성 요소로, 특히 Kubernetes와 같은 클러스터 환경에서 중요한 역할을 합니다.

키-값 저장소란?

  • **전통적인 데이터베이스(예: SQL)**는 데이터를 행(row)과 열(column) 형태의 테이블로 저장합니다. 새로운 정보를 추가하면 전체 테이블에 영향을 미치며, 빈 셀이 생길 가능성이 있습니다.
  • 키-값 저장소는 데이터를 독립적인 문서 또는 페이지로 저장합니다. 각 문서는 특정 키와 그에 대응하는 값으로 구성되며, 다른 문서에 영향을 주지 않고 개별적으로 수정 가능합니다. JSON이나 YAML 같은 데이터 형식으로 저장 및 관리됩니다.

ETCD의 주요 특징

  1. 분산 시스템 지원: ETCD는 여러 노드로 구성된 클러스터에서 동작하며, 고가용성과 데이터 일관성을 제공합니다.
  2. RAFT 합의 알고리즘: 데이터를 안전하게 복제하고 분산된 상태에서도 일관성을 유지하기 위해 RAFT 알고리즘을 사용합니다.
  3. 빠르고 간단한 설치:
    • 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의 기본 동작 원리

  1. 데이터 저장 및 관리:
    • etcd는 클라이언트 요청을 받아 데이터를 저장하며, 이 데이터는 Raft 알고리즘을 통해 클러스터 내 모든 노드에 복제됩니다.
    • 클러스터 내 다수 노드가 동일한 데이터를 유지하도록 보장.
  2. Raft 알고리즘:
    • 리더(Leader)와 팔로워(Follower)로 구성된 구조.
    • 리더는 클라이언트 요청을 처리하며, 팔로워는 리더로부터 로그를 복제.
    • 장애 발생 시 새로운 리더를 선출하여 서비스 지속성을 유지.
  3. 트랜잭션:
    • etcd는 원자적 트랜잭션을 지원하여 데이터의 일관성을 유지.
    • 클라이언트 요청은 커밋 로그를 통해 기록되고, 모든 노드에 반영.
  4. 클러스터 구성:
    • etcd 클러스터는 최소 3개 이상의 노드로 구성하여 고가용성을 유지.
    • 홀수 개의 노드를 권장하여 합의(Quorum) 과정을 효율적으로 처리.

Kubernetes와 etcd의 관계

  • Kubernetes는 etcd를 사용해 API 객체(예: Pod, Service 등)의 상태를 저장하고 관리.
  • 모든 Kubernetes 컴포넌트(API Server, Controller Manager 등)는 etcd와 통신하여 클러스터 상태를 확인하고 업데이트.

안정적인 etcd 운영을 위한 고려사항

    1. 백업 및 복구:
      • 정기적인 스냅샷 백업으로 데이터 손실 방지.
      • 장애 발생 시 빠른 복구 가능.
    2. 모니터링:
      • etcd의 성능 및 상태를 지속적으로 모니터링하여 잠재적 문제를 사전에 감지.
    3. 성능 최적화:
      • 디스크 I/O 성능이 중요한 요소이므로 SSD 사용 권장.
      • 네트워크 지연 시간 최소화 필요.
    4. 보안 강화:
      • TLS 인증 및 암호화를 통해 데이터 전송 보호.
      • 접근 제어를 설정하여 불필요한 접근 차단.

Raft의 작동 메커니즘

    1.  

(1) 리더 선출

      • 서버는 팔로워(follower) 상태로 시작하며, 일정 시간 동안 리더의 신호(heartbeat)를 받지 못하면 후보(candidate) 상태로 전환.
      • 후보는 자신에게 투표하고 다른 서버에 투표 요청(RequestVote RPC)을 보냄.
      • 과반수의 투표를 얻으면 **리더(leader)**가 됨.
      • 랜덤화된 타임아웃을 사용하여 투표 충돌을 최소화.

(2) 로그 복제

      • 리더는 클라이언트 요청을 받아들여 로그 항목을 생성하고 이를 팔로워들에게 복제(AppendEntries RPC)함.
      • 과반수 서버에 로그 항목이 저장되면 해당 항목은 "커밋" 상태가 됨.
      • 팔로워들은 커밋된 로그 항목을 순서대로 상태 머신에 적용.

(3) 안전성 보장

      • 각 로그 항목은 고유한 "용어(term)"와 함께 저장되며, 동일한 용어와 인덱스를 가진 항목은 모든 서버에서 동일해야 함.
      • 새로운 리더는 이전 리더의 커밋된 모든 로그 항목을 포함해야 함(리더 완전성 속성).

3. 주요 속성

    1. 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 배포 방식을 다룰 예정입니다:

  1. 스크래치부터 직접 배포하는 방식
  2. 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