ETCD 데이터베이스 공간 초과 시 데이터베이스 공간 확보 방법

작성자 김효상 수정일 2023-06-02 17:54

#etcd

들어가며

  •  이 글은 K8s 클러스터에 이상이 있는 상태에서 오랜동안 방치를 하면서 etcd database 공간이 가득차  오류가 발생했던 내용이며 일반적인 K8s 클러스터 상황에서는 발생하지 않을 것으로 예상됩니다.

    ETCD 용량이 초과 되었을 때는 새롭게 deploy를 하거나 deploy 를 삭제 할 경우아래와 같은 오류 메세지를 확인할 수 있습니다.
    etcdserver: mvcc: database space exceeded

  • ETCD 데이터 조각모음을 통해 ETCD 데이터베이스를 용량을 확보할 수 있습니다.


ETCD REVISION

Etcd에 대한 설명은 검색을 통해 많은 자료가 있어 간단한 의미와 Revision에 

Etcd는 key-value 형태의 데이터를 저장하는 데이터베이스(스토리지)입니다. 

각각의 key에 대한 모든 변경 사항은 스템에 기록되며 이 부분을 REVISION이라고 합니다.


ETCD 공간 확보하기

ETCDCTL 명령어 3.4 이상 기준

  1. Mater(Control-plane Etcdctl) 노드에 접속합니다.

  2. ETCD database를 백업 합니다.
    mkdir etcd-backup && cp -r /var/lib/etcd/ etcd-backup


  3. Etcdctl 실행 파일을 etcd 컨테이너에서 복사합니다.
    kubectl cp etcd-$(hostname):/usr/local/bin/etcdctl ./etcdctl -n kube-system && chmod +x etcdctl && cp etcdctl /usr/local/bin/etcdctl 

    ※ etcd 파드에 접근하여 etcdctl 파일 복사가 되지 않을 경우도 있어 https://github.com/etcd-io/etcd/releases 사이트에 접속하여 etcd 버전에 맞는 etcdclt 파일을 다운로드 및 압축해제 후 etcdctl 파일을 /usr/local/bin/ 폴더에 복사합니다.

    # 버전 확인
    kubectl exec etcd-$(hostname) -n kube-system -- etcdctl version


    ETCD가 주기적으로 재시작 될 경우 health check 부분을 주석 처리 후 명령어를 실행합니다.
    /etc/kubernetes/manifests/etcd.yaml

  4. Etcd status를 확인 합니다.

    ETCDCTL_API=3 etcdctl  --endpoints=https://127.0.0.1:2379  --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/peer.crt  --key=/etc/kubernetes/pki/etcd/peer.key endpoint status --write-out=table 


  5. Etcd 알람 목록을 확인 합니다.

    ETCDCTL_API=3 etcdctl  --endpoints=https://127.0.0.1:2379  --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/peer.crt  --key=/etc/kubernetes/pki/etcd/peer.key alarm list 


  6. Etcd revision을 compaction 합니다.
    ◪ compact를 진행하더라도 용량이 삭제 되는 것이 아니기 때문에 defrag를 진행해야합니다.

    REVISION=$(ETCDCTL_API=3 etcdctl --endpoints=https://127.0.0.1:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/peer.crt --key=/etc/kubernetes/pki/etcd/peer.key endpoint status --write-out="json" | egrep -o '"revision":[0-9]*' | egrep -o '[0-9].*') 
    
    ETCDCTL_API=3 etcdctl  --endpoints=https://127.0.0.1:2379  --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/peer.crt  --key=/etc/kubernetes/pki/etcd/peer.key compact ${REVISION} 


  7. Etcd database 조각모음(defrag)을 진행합니다.

    ETCDCTL_API=3 etcdctl  --endpoints=https://127.0.0.1:2379  --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/peer.crt  --key=/etc/kubernetes/pki/etcd/peer.key defrag 


  8. Etcd alarm을 삭제 합니다.

    ETCDCTL_API=3 etcdctl  --endpoints=https://127.0.0.1:2379  --cacert=/etc/kubernetes/pki/etcd/ca.crt  --cert=/etc/kubernetes/pki/etcd/peer.crt  --key=/etc/kubernetes/pki/etcd/peer.key alarm disarm 


  9. etcd.yaml 파일에 주석을 해제 후 정상 동작 유무를 확인 합니다.

ETCDCTL 명령어 단축 버전

# 명령어 설정
export ETCDCTL_API=3
ETCD_CMD="etcdctl  --endpoints=https://127.0.0.1:2379  --cacert=/etc/kubernetes/pki/etcd/ca.crt  --
cert=/etc/kubernetes/pki/etcd/peer.crt  --key=/etc/kubernetes/pki/etcd/peer.key" 

# status 확인
${ETCD_CMD} endpoint status --write-out=table

# alam 목록 확인
${ETCD_CMD} alarm list

# Etcd revision compacttion
${ETCD_CMD} compact ${REVISION}

# Etcd 조각 모음
${ETCD_CMD} defrag

# Etcd 알람 해제
${ETCD_CMD} alarm disarm



마치며

  • Revision이 클러스터 이상으로 인해 계속적으로 쌓이게 되면서 데이터베이스 용량을 초과한 상황에서 발생한 오류이며  K8s 클러스터 상태가 빈번하게 바뀌는 경우에도 용량이 초과 할 수 있기 때문에 Compaction 및 Defrag를 통해 관리가 필요합니다.


아티클이 유용했나요?

훌륭합니다!

피드백을 제공해 주셔서 감사합니다.

도움이 되지 못해 죄송합니다!

피드백을 제공해 주셔서 감사합니다.

아티클을 개선할 수 있는 방법을 알려주세요!

최소 하나의 이유를 선택하세요
CAPTCHA 확인이 필요합니다.

피드백 전송

소중한 의견을 수렴하여 아티클을 개선하도록 노력하겠습니다.

02-558-8300