etcd

etcd는 쿠버네티스 클러스터의 상태 정보를 저장하고 관리하는 분산형 키-값 저장소이다. 이 글에서는 etcd의 개념, 역할, 구성, 설치 및 업그레이드 방법, 그리고 고가용성 설정에 대해 설명한다.

etcd란?

etcd는 고가용성과 일관성을 제공하는 분산형 키-값 저장소로, 쿠버네티스의 핵심 데이터 저장소로 사용된다. etcd는 모든 클러스터 데이터를 저장하며, 클러스터의 상태를 유지하기 위한 중요한 역할을 한다.

주요 역할

클러스터 상태 관리

etcd는 쿠버네티스 클러스터의 상태 정보를 저장하고 관리한다. 이는 클러스터의 모든 구성 요소와 리소스의 상태를 영구적으로 저장하고, 이를 기반으로 클러스터를 관리한다.

고가용성과 일관성 제공

etcd는 Raft 합의 알고리즘을 사용하여 고가용성과 일관성을 제공한다. 이를 통해 클러스터 내의 데이터가 항상 일관되게 유지되며, 장애 발생 시에도 데이터를 안정적으로 복구할 수 있다.

데이터 보안

etcd는 데이터 암호화와 인증 메커니즘을 제공하여 데이터의 보안을 유지한다. 이는 클러스터 데이터의 무결성과 기밀성을 보장한다.

구성

etcd 클러스터

etcd는 다중 노드로 구성된 클러스터 형태로 운영된다. 각 노드는 서로 통신하며 데이터를 복제하고, 장애 복구를 지원한다. etcd 클러스터는 최소 3개의 노드로 구성하는 것이 일반적이며, 이를 통해 고가용성과 데이터 일관성을 유지한다.

데이터 모델

etcd는 단순한 키-값 데이터 모델을 사용한다. 각 키는 고유하며, 값은 JSON 형식으로 저장될 수 있다. 이는 데이터의 효율적인 저장과 조회를 가능하게 한다.

Raft 합의 알고리즘

etcd는 Raft 합의 알고리즘을 사용하여 데이터 일관성과 노드 간의 동기화를 보장한다. 이를 통해 모든 노드는 동일한 데이터를 유지하며, 노드 장애 발생 시에도 데이터를 안전하게 복구할 수 있다.

설치 및 업그레이드

설치

etcd는 다양한 설치 방법을 제공한다. kubeadm을 사용하여 쿠버네티스 클러스터와 함께 etcd를 설치하는 것이 일반적이다. 다음은 kubeadm을 사용하여 etcd를 설치하는 예제이다:

kubeadm init --config=kubeadm-config.yaml

업그레이드

etcd의 업그레이드는 클러스터의 안정성을 유지하기 위해 중요한 작업이다. 업그레이드 절차는 다음과 같다:

  1. 백업: 업그레이드 전에 현재 데이터를 백업한다.
  2. 업그레이드: etcd 바이너리를 업그레이드하고, 새 버전의 etcd를 시작한다.
  3. 확인: 업그레이드 후 클러스터의 상태를 확인하여 문제가 없는지 확인한다.

고가용성 설정

Stacked 컨트롤 플레인과 etcd 노드

Stacked 컨트롤 플레인 설정은 컨트롤 플레인 노드와 etcd 노드를 동일한 서버에 배치하는 방식이다. 이는 설정이 간단하고 관리가 용이하지만, 서버 장애 시 클러스터 전체에 영향을 미칠 수 있다.

외부 etcd 노드

외부 etcd 설정은 컨트롤 플레인 노드와 etcd 노드를 분리하여 운영하는 방식이다. 이는 고가용성을 높이고, 장애 시 영향 범위를 최소화할 수 있다. 다음은 외부 etcd 클러스터를 설정하는 예제이다:

  1. etcd 클러스터 생성
  2. kubeadm을 사용하여 컨트롤 플레인 노드 설치 시 외부 etcd 클러스터 정보를 제공
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "LOAD_BALANCER_DNS:LOAD_BALANCER_PORT" # change this (see below)
etcd:
  external:
    endpoints:
      - https://ETCD_0_IP:2379 # change ETCD_0_IP appropriately
      - https://ETCD_1_IP:2379 # change ETCD_1_IP appropriately
      - https://ETCD_2_IP:2379 # change ETCD_2_IP appropriately
    caFile: /etc/kubernetes/pki/etcd/ca.crt
    certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt
    keyFile: /etc/kubernetes/pki/apiserver-etcd-client.key