쿠버네티스 클러스터 장애 복구

쿠버네티스 클러스터 장애 복구

- 장애 복구 전략과 실습
- 키워드: 쿠버네티스 장애 복구, Kubernetes 장애 복구 전략


서론


쿠버네티스(Kubernetes)는 컨테이너화된 애플리케이션의 배포, 확장 및 관리를 자동화하는 강력한 플랫폼입니다. 그러나 클러스터 환경에서 장애는 언제든지 발생할 수 있으며, 이러한 장애를 신속하게 복구하는 것은 시스템의 가용성과 안정성을 유지하는 데 매우 중요합니다. 이번 포스팅에서는 쿠버네티스 클러스터의 장애 복구 전략과 실습을 초보자도 이해할 수 있도록 자세히 설명합니다.


본론


장애 복구의 중요성


쿠버네티스 클러스터는 다양한 이유로 장애가 발생할 수 있습니다. 네트워크 장애, 하드웨어 고장, 소프트웨어 버그 등 다양한 요인으로 인해 서비스가 중단될 수 있습니다. 이러한 장애를 신속하게 복구하는 것은 사용자 경험을 보호하고, 비즈니스 연속성을 유지하는 데 필수적입니다.


장애 복구 전략


1. 백업 및 복원


백업은 장애 발생 시 데이터를 복구하는 데 필수적입니다. 쿠버네티스에서 etcd는 클러스터의 상태를 저장하는 분산 키-값 데이터베이스입니다. etcd의 정기적인 백업은 클러스터 복구에 중요한 역할을 합니다.


etcd 백업


ETCDCTL_API=3 etcdctl snapshot save snapshot.db

etcd 복원


ETCDCTL_API=3 etcdctl snapshot restore snapshot.db

2. 고가용성 구성


고가용성(HA) 클러스터는 단일 장애 지점을 제거하여 클러스터의 가용성을 높입니다. 이를 위해 다중 마스터 노드와 로드 밸런서를 구성할 수 있습니다.


마스터 노드 구성


kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:6443" --upload-certs
kubeadm join LOAD_BALANCER_DNS:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH> --control-plane --certificate-key <CERTIFICATE_KEY>

3. 노드 및 파드 복구


노드나 파드에 장애가 발생했을 때, 쿠버네티스의 자체 복구 기능을 활용하여 자동으로 복구할 수 있습니다. kubelet은 노드에서 실행되는 에이전트로, 파드를 모니터링하고 문제가 발생하면 자동으로 다시 시작합니다.


파드 자동 복구 설정


apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: mycontainer
        image: myimage
        resources:
          requests:
            memory: "64Mi"
            cpu: "250m"
          limits:
            memory: "128Mi"
            cpu: "500m"
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 3
          periodSeconds: 3

4. 모니터링 및 알림


장애를 조기에 감지하고 대응하기 위해 모니터링과 알림 시스템을 설정합니다. Prometheus와 Grafana는 쿠버네티스 클러스터 모니터링에 널리 사용되는 도구입니다.


Prometheus 설치


kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml

Grafana 설치


kubectl apply -f https://raw.githubusercontent.com/grafana/grafana/master/deploy/kubernetes/grafana.yaml

장애 복구 실습


시나리오 1: etcd 데이터 복구


  1. etcd 데이터 백업

ETCDCTL_API=3 etcdctl snapshot save snapshot.db

  1. etcd 데이터 손상 시 복원

ETCDCTL_API=3 etcdctl snapshot restore snapshot.db

시나리오 2: 마스터 노드 장애 복구


  1. 새로운 마스터 노드 추가

kubeadm join LOAD_BALANCER_DNS:6443 --token <TOKEN> --discovery-token-ca-cert-hash sha256:<HASH> --control-plane --certificate-key <CERTIFICATE_KEY>

  1. 기존 마스터 노드 재설정

kubeadm reset
kubeadm init --control-plane-endpoint "LOAD_BALANCER_DNS:6443" --upload-certs

시나리오 3: 노드 장애 시 파드 복구


  1. 노드 장애 시 자동 파드 복구 설정

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: mycontainer
        image: myimage
        livenessProbe:
          httpGet:
            path: /healthz
            port: 8080
          initialDelaySeconds: 3
          periodSeconds: 3

  1. 노드 장애 시 복구 확인

kubectl get pods -o wide

추가적인 복구 방법


스토리지 복구


Persistent Volume(PV)와 Persistent Volume Claim(PVC)을 사용하여 데이터 손실을 방지하고 복구할 수 있습니다.


apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv0001
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data"

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc0001
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

로그 분석을 통한 장애 원인 파악


EFK(Elasticsearch, Fluentd, Kibana) 스택을 사용하여 로그 데이터를 수집하고 분석합니다.


kubectl apply -f https://raw.githubusercontent.com/fluent/fluentd-kubernetes-daemonset/master/fluentd-daemonset-elasticsearch-rbac.yaml
kubectl apply -f https://raw.githubusercontent.com/elastic/kibana/master/deploy/kubernetes/kibana.yaml

모니터링 도구 활용


Prometheus와 Grafana를 사용하여 클러스터 상태를 모니터링하고, 문제가 발생하면 즉시 알림을 받을 수 있도록 설정합니다.


Prometheus 및 Grafana 설치


kubectl apply -f https://raw.githubusercontent.com/prometheus-operator/prometheus-operator/main/bundle.yaml
kubectl apply -f https://raw.githubusercontent.com/grafana/grafana/master/deploy/kubernetes/grafana.yaml

경고 설정


groups:
- name: example
  rules:
  - alert: HighRequestLatency
    expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
    for: 10m
    labels:
      severity: page
    annotations:
      summary: "High request latency"
      description: "Request latency is above 0.5s for more than 10 minutes."

결론


쿠버네티스 클러스터의 장애 복구는 서비스의 가용성과 안정성을 유지하는 데 매우 중요합니다. 이번 포스팅에서는 다양한 장애 복구 전략과 실습을 통해 클러스터의 복구 방법을 상세히 설명했습니다. 백업 및 복원, 고가용성 구성, 노드 및 파드 복구, 모니터링 및 알림 설정 등 다양한 방법을 통해 쿠버네티스 클러스터의 신뢰성을 높일 수 있습니다. 이를 통해 안정적이고 신뢰할 수 있는 클러스터 환경을 구축할 수 있기를 바랍니다.

다음 이전