IT기술/쿠버네티스 (k8s)

RKE2 고가용성(HA) 클러스터 완벽 가이드: 엔터프라이즈급 쿠버네티스 인프라 구축

후스파 2025. 7. 16. 06:51
반응형

RKE2(Rancher Kubernetes Engine 2)의 고가용성 클러스터는 단일 장애점을 제거하고 시스템의 연속성을 보장하는 핵심 아키텍처입니다. HA RKE2 클러스터는 고정 등록 주소, 홀수 개의 서버 노드(권장 3개), 그리고 0개 이상의 에이전트 노드로 구성됩니다. 이러한 구조는 특정 노드의 장애 발생 시에도 클러스터가 정상적으로 운영될 수 있도록 보장합니다.
etcd 클러스터는 홀수 개의 서버 노드로 구성되어야 하는데, 이는 etcd가 쿼럼(quorum)을 유지하기 위해서입니다. n개의 서버가 있는 클러스터에서 쿼럼은 (n/2)+1입니다. 홀수 크기의 클러스터에서 노드를 추가하면 항상 쿼럼에 필요한 노드 수가 증가하지만, 동일한 수의 노드 장애를 허용하면서도 더 많은 노드가 장애를 일으킬 수 있어 장애 허용성 측면에서는 더 나은 선택입니다.


RKE2 HA 클러스터 구성 요소

핵심 아키텍처 구성 요소

고정 등록 주소서버 노드 앞단 로드밸런서Layer 4 TCP 로드밸런서
서버 노드etcd, Kubernetes API, 제어평면 서비스최소 3개 (홀수)
에이전트 노드앱과 서비스 실행0개 이상
로드밸런서고가용성 및 트래픽 분산HAProxy + Keepalived 권장

네트워크 포트 구성

RKE2 HA 클러스터에서는 특정 포트들이 올바르게 구성되어야 합니다. rke2 server 프로세스는 새로운 노드가 등록될 때 포트 9345에서 수신 대기하며, Kubernetes API는 일반적으로 포트 6443에서 제공됩니다.

6443TCPKubernetes APIRKE2 agent 노드
9345TCP노드 등록RKE2 server/agent 노드
2379TCPetcd 클라이언트 포트RKE2 server 노드
2380TCPetcd 피어 포트RKE2 server 노드
8472UDPFlannel VXLAN모든 노드
10250TCPkubelet모든 노드

로드밸런서 설정 및 구성

HAProxy와 Keepalived를 활용한 HA 구성

고가용성 로드밸런서 구성을 위해서는 HAProxy와 Keepalived의 조합이 가장 널리 사용됩니다. HAProxy는 실제 트래픽 분산을 담당하고, Keepalived는 가상 IP(VIP)를 관리하여 로드밸런서 자체의 고가용성을 보장합니다.

HAProxy 설정 예시

# HAProxy 설치 (두 LB 노드 모두)
sudo apt update
sudo apt install -y haproxy keepalived

# HAProxy 설정
sudo tee /etc/haproxy/haproxy.cfg > ~/.bashrc

# 클러스터 상태 확인
kubectl get nodes
kubectl get pods -A

# etcd 클러스터 상태 확인
sudo /var/lib/rancher/rke2/bin/crictl exec $(sudo /var/lib/rancher/rke2/bin/crictl ps --name etcd --quiet) etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
  --cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt \
  --key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key \
  member list -w table

백업 및 복구 전략

etcd 스냅샷 생성 및 관리

RKE2에서는 스냅샷이 기본적으로 활성화되어 있으며, 스냅샷 디렉토리는 /var/lib/rancher/rke2/server/db/snapshots에 기본 설정됩니다.

# 수동 스냅샷 생성
sudo rke2 etcd-snapshot save --name pre-upgrade-snapshot-$(date +%Y%m%d-%H%M%S)

# 스냅샷 목록 확인
sudo rke2 etcd-snapshot list

# 스냅샷 상태 확인
sudo ls -la /var/lib/rancher/rke2/server/db/snapshots/

자동화된 백업 시스템

# S3 백업 설정 추가
sudo tee -a /etc/rancher/rke2/config.yaml > $LOG_FILE

# etcd 스냅샷 생성
if rke2 etcd-snapshot save --name $BACKUP_NAME; then
    echo "$(date): Backup completed successfully: $BACKUP_NAME" >> $LOG_FILE
else
    echo "$(date): Backup failed: $BACKUP_NAME" >> $LOG_FILE
    exit 1
fi

# 로컬 정리 (7일 이상 된 백업 삭제)
find /var/lib/rancher/rke2/server/db/snapshots -name "*.zip" -mtime +7 -delete

echo "$(date): Backup cleanup completed" >> $LOG_FILE
EOF

sudo chmod +x /usr/local/bin/rke2-backup.sh

# Cron 작업 설정
echo "0 2 * * * /usr/local/bin/rke2-backup.sh" | sudo crontab -

클러스터 리셋 및 복구

# 쿼럼 손실 시 클러스터 리셋
sudo systemctl stop rke2-server

# 스냅샷에서 복구
sudo rke2 server --cluster-reset --cluster-reset-restore-path=/var/lib/rancher/rke2/server/db/snapshots/pre-upgrade-snapshot

# 서비스 재시작
sudo systemctl start rke2-server

# 클러스터 상태 확인
kubectl get nodes
kubectl get pods -A

모니터링 및 관리 자동화

Prometheus를 활용한 etcd 모니터링

etcd 클러스터의 상태를 모니터링하기 위해서는 Prometheus와 Grafana를 활용할 수 있습니다.

# etcd 메트릭 활성화 설정
# /etc/rancher/rke2/config.yaml에 추가
etcd-expose-metrics: true
# etcd ServiceMonitor 생성
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: etcd
  namespace: kube-system
  labels:
    app: etcd
spec:
  selector:
    matchLabels:
      component: etcd
  endpoints:
  - port: http-metrics
    interval: 30s
    path: /metrics
    scheme: http

서비스모니터 구성

# Prometheus Operator 설치
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace \
  --set prometheus.prometheusSpec.retention=30d \
  --set grafana.persistence.enabled=true

# etcd 대시보드 임포트 (Grafana ID: 3070)

알림 규칙 설정

# etcd 알림 규칙
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
  name: etcd-alerts
  namespace: kube-system
spec:
  groups:
  - name: etcd
    rules:
    - alert: EtcdClusterUnavailable
      expr: up{job="etcd"} == 0
      for: 3m
      labels:
        severity: critical
      annotations:
        summary: "etcd cluster is unavailable"
        description: "etcd cluster has been unavailable for more than 3 minutes."

    - alert: EtcdHighNumberOfLeaderChanges
      expr: increase(etcd_server_leader_changes_seen_total[1h]) > 3
      for: 5m
      labels:
        severity: warning
      annotations:
        summary: "etcd has seen too many leader changes"
        description: "etcd has seen {{ $value }} leader changes in the last hour."

장애 복구 및 문제 해결

노드 장애 시나리오 대응

# 마스터 노드 상태 확인
kubectl get nodes
kubectl describe node master-01

# etcd 클러스터 상태 확인
sudo /var/lib/rancher/rke2/bin/crictl exec $(sudo /var/lib/rancher/rke2/bin/crictl ps --name etcd --quiet) etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
  --cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt \
  --key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key \
  endpoint health

# 장애 노드 제거 (필요 시)
kubectl delete node master-02

# 새 노드로 교체
# 동일한 설정으로 새 마스터 노드 추가

업그레이드 전략

# 업그레이드 전 백업
sudo rke2 etcd-snapshot save --name pre-upgrade-$(date +%Y%m%d-%H%M%S)

# 순차적 업그레이드 (첫 번째 마스터부터)
sudo systemctl stop rke2-server
curl -sfL https://get.rke2.io | sudo INSTALL_RKE2_VERSION="v1.28.6+rke2r1" INSTALL_RKE2_TYPE="server" sh -
sudo systemctl start rke2-server

# 클러스터 상태 확인 후 다음 노드 진행
kubectl get nodes
kubectl get pods -A

네트워크 문제 해결

# 포트 연결 테스트
nc -zv 192.168.1.101 6443
nc -zv 192.168.1.101 9345
nc -zv 192.168.1.101 2379

# 방화벽 상태 확인
sudo ufw status
sudo iptables -L

# 네트워크 정책 확인
kubectl get networkpolicies -A
kubectl describe networkpolicy -A

성능 최적화 및 모범 사례

하드웨어 요구사항 최적화

HA RKE2 클러스터의 성능을 최적화하기 위해서는 적절한 하드웨어 리소스 할당이 중요합니다.

컨트롤 플레인4 vCPU8GB RAM100GB SSD1Gbps
워커 노드2+ vCPU4+ GB RAM50+ GB SSD1Gbps
로드밸런서2 vCPU4GB RAM20GB SSD1Gbps

보안 강화 설정

# CIS 프로파일 적용
# /etc/rancher/rke2/config.yaml
profile: "cis"
selinux: true
secrets-encryption: true
protect-kernel-defaults: true

# Pod Security Standards 설정
kube-apiserver-arg:
  - "admission-control-config-file=/etc/rancher/rke2/pss.yaml"

# 감사 로깅 활성화
audit-policy-file: /etc/rancher/rke2/audit-policy.yaml
kube-apiserver-arg:
  - "audit-log-maxage=30"
  - "audit-log-maxbackup=10"
  - "audit-log-maxsize=100"
  - "audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log"

네트워크 지연시간 최소화

Rancher 구성요소와 Kubernetes API 간의 트래픽은 네트워크 지연시간에 특히 민감하며, etcd 노드 간 트래픽도 마찬가지입니다. 성능 향상을 위해서는 모든 업스트림 클러스터 노드를 동일한 위치에 배치하고, 특히 etcd 노드와 Rancher 간의 지연시간을 최소화해야 합니다.

# 네트워크 지연시간 측정
ping -c 10 192.168.1.101
mtr --report --report-cycles 10 192.168.1.101

# etcd 성능 벤치마크
sudo /var/lib/rancher/rke2/bin/crictl exec $(sudo /var/lib/rancher/rke2/bin/crictl ps --name etcd --quiet) etcdctl \
  --endpoints=https://127.0.0.1:2379 \
  --cacert=/var/lib/rancher/rke2/server/tls/etcd/server-ca.crt \
  --cert=/var/lib/rancher/rke2/server/tls/etcd/server-client.crt \
  --key=/var/lib/rancher/rke2/server/tls/etcd/server-client.key \
  check perf

마무리

RKE2 클러스터의 고가용성 구성은 현대적인 쿠버네티스 환경에서 안정적이고 확장 가능한 서비스를 제공하기 위한 핵심 요소입니다. 홀수 개의 서버 노드 구성, 적절한 로드밸런서 설정, 그리고 체계적인 백업 및 모니터링 시스템을 통해 단일 장애점을 제거하고 서비스 연속성을 보장할 수 있습니다.
특히 HAProxy와 Keepalived를 활용한 로드밸런서 HA 구성, etcd 스냅샷을 통한 정기적인 백업, 그리고 Prometheus를 활용한 실시간 모니터링은 안정적인 클러스터 운영의 필수 요소입니다. 또한 CIS 벤치마크를 준수한 보안 설정과 적절한 성능 최적화를 통해 운영 환경에서 요구되는 보안성과 성능을 동시에 만족시킬 수 있습니다.
핵심 포인트:

  • 홀수 개 서버 노드 구성으로 etcd 쿼럼 보장
  • HAProxy + Keepalived로 로드밸런서 고가용성 구현
  • embedded etcd 활용으로 외부 데이터스토어 불필요
  • 자동화된 백업 시스템으로 데이터 보호
  • Prometheus 모니터링으로 실시간 상태 추적
  • CIS 프로파일 적용으로 보안 강화

RKE2의 강력한 보안 기능과 embedded etcd를 활용한 간편한 HA 구성은 복잡한 외부 데이터스토어 설정 없이도 고가용성 쿠버네티스 클러스터를 구축할 수 있게 해줍니다. 정기적인 백업과 모니터링, 그리고 체계적인 장애 복구 계획을 통해 비즈니스 크리티컬한 환경에서도 안정적인 쿠버네티스 서비스를 제공할 수 있을 것입니다.

반응형