k8s etcd란

🗄️ etcd란 무엇인가?

etcd는 Kubernetes 클러스터의 “두뇌” 역할을 하는 분산 키-값 저장소입니다.
etcd가 저장하는 정보들:

  • 클러스터 설정 정보
  • 노드 정보 (마스터, 워커 노드 상태)
  • 파드, 서비스, 디플로이먼트 등 모든 Kubernetes 오브젝트 정보
  • 네트워크 설정, 시크릿, 컨피그맵 등
  • 쉽게 말해 = kubectl로 생성/조회하는 모든 것들이 etcd에 저장됨
# 예를 들어, 이런 명령들로 생성하는 모든 정보가 etcd에 저장됩니다
kubectl create deployment nginx --image=nginx
kubectl create service clusterip my-service --tcp=80:80
kubectl create secret generic my-secret --from-literal=password=123456

🏗️ etcd 구성 방식

1) Stacked etcd (일반적인 방식) - 아마 당신이 사용 중인 방식

┌─────────────────┐
│   Master Node   │
│  ┌───────────┐  │
│  │ API Server│  │
│  ├───────────┤  │
│  │   etcd    │  │  ← etcd가 마스터 노드 안에 같이 실행
│  ├───────────┤  │
│  │Controller │  │
│  │Scheduler  │  │
│  └───────────┘  │
└─────────────────┘

2) External etcd (별도 구성)

┌─────────────────┐    ┌─────────────────┐
│   Master Node   │    │  External etcd  │
│  ┌───────────┐  │    │  ┌───────────┐  │
│  │ API Server│──┼────┼──│   etcd    │  │
│  ├───────────┤  │    │  └───────────┘  │
│  │Controller │  │    └─────────────────┘
│  │Scheduler  │  │
│  └───────────┘  │
└─────────────────┘

🔍 현재 구성 확인하기

etcd가 어떻게 실행되고 있는지 확인:

# 1. etcd 파드로 실행되는지 확인 (Stacked 방식)
kubectl get pods -n kube-system | grep etcd

# 2. systemd 서비스로 실행되는지 확인 (External 방식)
sudo systemctl status etcd

# 3. 프로세스로 직접 확인
ps aux | grep etcd

대부분의 경우 다음과 같이 나올 겁니다:

kube-system   etcd-master1   1/1   Running   0   2d   <-- 이렇게 나오면 Stacked 방식

📂 etcd 데이터 위치와 백업

etcd 데이터 저장 위치:

# 일반적인 etcd 데이터 디렉토리
/var/lib/etcd/

# 확인 방법
sudo ls -la /var/lib/etcd/

간단한 etcd 백업:

# etcd 백업 생성
sudo ETCDCTL_API=3 etcdctl snapshot save /backup/etcd-backup-$(date +%Y%m%d).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
  --key=/etc/kubernetes/pki/etcd/healthcheck-client.key

# 백업 상태 확인
sudo ETCDCTL_API=3 etcdctl --write-out=table snapshot status /backup/etcd-backup-*.db

🔧 일반적인 etcd 관련 명령어

# etcd 클러스터 상태 확인
sudo ETCDCTL_API=3 etcdctl endpoint health \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
  --key=/etc/kubernetes/pki/etcd/healthcheck-client.key

# etcd에 저장된 키 목록 보기 (주의: 매우 많음)
sudo ETCDCTL_API=3 etcdctl get "" --prefix --keys-only \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
  --key=/etc/kubernetes/pki/etcd/healthcheck-client.key

💡 실무적인 관점

대부분의 소규모 클러스터(당신의 경우)에서는:

  • etcd가 마스터 노드 안에서 파드로 실행됨 (Stacked 방식)
  • 별도로 etcd를 구성할 필요 없음
  • 다만 etcd 백업은 정기적으로 수행하는 것이 좋음

언제 별도 etcd를 구성하나요?

  • 대규모 프로덕션 환경
  • 고가용성이 매우 중요한 경우
  • etcd 클러스터를 3개 이상으로 구성할 때

🎯 당신이 지금 해야 할 것

현재 etcd 상태 확인:

kubectl get pods -n kube-system | grep etcd

간단한 백업 스크립트 만들기:

# backup-etcd.sh
#!/bin/bash
sudo ETCDCTL_API=3 etcdctl snapshot save /home/user/etcd-backup-$(date +%Y%m%d).db \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/etc/kubernetes/pki/etcd/ca.crt \
  --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt \
  --key=/etc/kubernetes/pki/etcd/healthcheck-client.key

🏗️ HA 마스터 구성 아키텍처

방식 1: Stacked etcd (권장 - 소규모 클러스터)

┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
│   Master-1      │  │   Master-2      │  │   Master-3      │
│  ┌───────────┐  │  │  ┌───────────┐  │  │  ┌───────────┐  │
│  │API Server │  │  │  │API Server │  │  │  │API Server │  │
│  ├───────────┤  │  │  ├───────────┤  │  │  ├───────────┤  │
│  │   etcd    │◄─┼──┼──┤   etcd    │◄─┼──┼──┤   etcd    │  │
│  ├───────────┤  │  │  ├───────────┤  │  │  ├───────────┤  │
│  │Controller │  │  │  │Controller │  │  │  │Controller │  │
│  │Scheduler  │  │  │  │Scheduler  │  │  │  │Scheduler  │  │
│  └───────────┘  │  │  └───────────┘  │  │  └───────────┘  │
└─────────────────┘  └─────────────────┘  └─────────────────┘
         │                     │                     │
         └─────────────────────┼─────────────────────┘
                    ┌─────────────────┐
                    │  Load Balancer  │  ← HAProxy/nginx
                    │ (VIP: 10.0.0.100)│
                    └─────────────────┘

방식 2: External etcd (대규모 환경)

┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
│   Master-1      │  │   Master-2      │  │   Master-3      │
│  ┌───────────┐  │  │  ┌───────────┐  │  │  ┌───────────┐  │
│  │API Server │  │  │  │API Server │  │  │  │API Server │  │
│  ├───────────┤  │  │  ├───────────┤  │  │  ├───────────┤  │
│  │Controller │  │  │  │Controller │  │  │  │Controller │  │
│  │Scheduler  │  │  │  │Scheduler  │  │  │  │Scheduler  │  │
│  └───────────┘  │  │  └───────────┘  │  │  └───────────┘  │
└────────┬────────┘  └────────┬────────┘  └────────┬────────┘
         │                    │                    │
    ┌────┴────────────────────┼────────────────────┴────┐
    │                         │                         │
┌───▼───────┐         ┌───────▼───┐             ┌───────▼───┐
│  etcd-1   │◄────────┤  etcd-2   │◄────────────┤  etcd-3   │
└───────────┘         └───────────┘             └───────────┘