
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에서 제공됩니다.
| 6443 | TCP | Kubernetes API | RKE2 agent 노드 |
| 9345 | TCP | 노드 등록 | RKE2 server/agent 노드 |
| 2379 | TCP | etcd 클라이언트 포트 | RKE2 server 노드 |
| 2380 | TCP | etcd 피어 포트 | RKE2 server 노드 |
| 8472 | UDP | Flannel VXLAN | 모든 노드 |
| 10250 | TCP | kubelet | 모든 노드 |
로드밸런서 설정 및 구성
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 vCPU | 8GB RAM | 100GB SSD | 1Gbps |
| 워커 노드 | 2+ vCPU | 4+ GB RAM | 50+ GB SSD | 1Gbps |
| 로드밸런서 | 2 vCPU | 4GB RAM | 20GB SSD | 1Gbps |
보안 강화 설정
# 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 구성은 복잡한 외부 데이터스토어 설정 없이도 고가용성 쿠버네티스 클러스터를 구축할 수 있게 해줍니다. 정기적인 백업과 모니터링, 그리고 체계적인 장애 복구 계획을 통해 비즈니스 크리티컬한 환경에서도 안정적인 쿠버네티스 서비스를 제공할 수 있을 것입니다.
'IT기술 > 쿠버네티스 (k8s)' 카테고리의 다른 글
| RKE2 모니터링과 로깅 완벽 가이드: Prometheus, Grafana, Loki 통합 구축 (6) | 2025.07.18 |
|---|---|
| RKE2 인그레스 완벽 가이드: 외부 트래픽 라우팅과 로드밸런서 구축 (4) | 2025.07.16 |
| Rancher와 RKE2 완벽 가이드: 차세대 쿠버네티스 플랫폼 구축과 자동화 (4) | 2025.07.14 |
| RKE2 NAS 스토리지와 GPU 가속 연동 완벽 가이드: 온프레미스 AI/ML 인프라 구축 (6) | 2025.07.12 |
| RKE2 스토리지 완벽 가이드: 로컬부터 분산 스토리지까지 모든 환경 대응 전략 (0) | 2025.07.11 |