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 │
└───────────┘ └───────────┘ └───────────┘