4 분 소요

게시:

쿠버네티스 환경에서 고가용성(High Availability, HA)은 시스템 안정성의 핵심 요소입니다. 특히 여러 컨트롤 플레인 노드로 구성된 클러스터에서는 API 서버에 대한 트래픽을 효과적으로 분산할 수 있는 로드 밸런서가 필수적입니다. 이 가이드에서는 HAProxy를 사용하여 쿠버네티스 고가용성 로드 밸런싱 환경을 구성하는 방법을 설명합니다.

테스트 환경
· 단일 LB(Bastion) 노드 + Control-Plane 3대 + Worker 2대 (총 6노드)
· Ubuntu 24.04 LTS (GCP Virtual Machune)
· HAProxy 2.9.x(기본 레포지터리)
· 간단한 테스트 클러스터용 예시입니다. 운영 환경에서는 LB ≥ 2대 + Keepalived를 권장합니다.

HA 아키텍처 개요

쿠버네티스 HA 클러스터에서 로드 밸런서는 다음과 같은 중요한 역할을 수행합니다.

  1. 단일 진입점 제공: 여러 컨트롤 플레인 노드에 대한 단일 접속 지점 제공
  2. 트래픽 분산: API 서버로 들어오는 요청을 여러 노드로 분산하여 부하 균형 유지
  3. 장애 감지: 비정상 노드를 감지하고 트래픽 전송 중단
  4. 무중단 운영: 일부 컨트롤 플레인 노드에 장애가 발생해도 클러스터 운영 지속
kubeadm HA topology - stacked etcd
figure 1. kubeadm HA topology - stacked etcd (출처: https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/)

1. 모든 노드에 /etc/hosts 등록

네트워크 DNS 인프라가 없는 환경에서도 노드 간 일관된 이름 해석이 가능하도록 모든 노드에 호스트 정보를 등록합니다. 이는 노드 간 통신과 HAProxy 설정에서 일관성을 보장합니다.

sudo vim /etc/hosts

# --- 예시 ---
10.128.0.34  bastion
10.128.0.35  control-plain-1
10.128.0.36  control-plain-2
10.128.0.37  control-plain-3
10.128.0.38  worker-1
10.128.0.39  worker-2

검증 방법
각 노드에서 호스트명 해석과 네트워크 연결성을 확인합니다.

ping -c 3 control-plain-1

모든 노드 간 통신이 원활해야 클러스터가 정상적으로 동작합니다.


2. Load Balancer 노드(Bastion) 설정

2-1. HAProxy 개요

HAProxy는 TCP/HTTP 기반 애플리케이션을 위한 고성능 로드 밸런서로, 쿠버네티스 API 서버 앞단에서 다음과 같은 기능을 제공합니다.

  • L4/L7 로드 밸런싱: TCP(L4) 또는 HTTP(L7) 수준에서 트래픽 분산
  • 고성능: 단일 프로세스 이벤트 기반 모델로 높은 처리량과 낮은 지연시간 제공
  • 헬스 체크: 주기적인 상태 확인으로 장애 노드 자동 감지 및 제외
  • 세션 유지: 필요시 동일 클라이언트를 같은 서버로 라우팅

2-2. HAProxy 설치

패키지 관리자를 통해 HAProxy를 설치하고 기존 설정을 백업합니다.

sudo apt-get update
sudo apt-get install -y haproxy

# 기본 설정 백업
sudo mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.bak

2-3. HAProxy 설정 파일 작성

사용하는 HAProxy 설정은 크게 global, defaults, frontend, backend 섹션으로 구성됩니다.

sudo vim /etc/haproxy/haproxy.cfg
# ---------- /etc/haproxy/haproxy.cfg ----------
global
    log /dev/log local0
    log /dev/log local1 notice
    chroot /var/lib/haproxy
    stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
    stats timeout 30s
    user haproxy
    group haproxy
    daemon

defaults
    log global
    mode tcp              # L4(TCP) 로드밸런싱
    option tcplog
    option dontlognull
    timeout connect 5000
    timeout client 50000
    timeout server 50000

# --- Kubernetes API 서버 프런트엔드 ---
frontend k8s_api
    bind 0.0.0.0:6443        # 외부에서 6443/TCP 수신
    mode tcp
    option tcplog
    default_backend k8s_api_backend

# --- Control-Plane 노드 백엔드 ---
backend k8s_api_backend
    mode tcp
    balance roundrobin       # 라운드로빈 부하 분산
    option tcp-check         # TCP 헬스체크
    server master-1 10.128.0.35:6443 check fall 3 rise 2
    server master-2 10.128.0.36:6443 check fall 3 rise 2
    server master-3 10.128.0.37:6443 check fall 3 rise 2
# ----------------------------------------------

설정 파일 구성요소 설명

  • global: HAProxy 프로세스 전체에 적용되는 기본 설정
  • defaults: 모든 프록시에 적용되는 기본값
    • mode tcp: L4 로드 밸런싱 사용 (쿠버네티스 API 서버는 HTTPS)
    • timeout: 연결/클라이언트/서버 타임아웃 설정
  • frontend: 클라이언트 연결을 수신하는 설정
    • bind 0.0.0.0:6443: 모든 인터페이스에서 6443 포트 수신
    • default_backend: 트래픽을 전달할 백엔드 지정
  • backend: 실제 서버 정의 및 로드 밸런싱 알고리즘 설정
    • balance roundrobin: 각 서버에 순차적으로 요청 분배
    • option tcp-check: TCP 연결로 서버 가용성 확인
    • check fall 3 rise 2: 3번 실패 시 비정상으로 간주, 2번 성공 시 정상으로 복귀
    • server: 각 API 서버 노드 정의

프로덕션 운영 구성 예시
운영 환경에서는 다음과 같은 설정을 통해 안정성과 성능을 개선해볼 수 있습니다.

frontend k8s_api
    bind 0.0.0.0:6443
    mode tcp
    option tcplog
    default_backend k8s_api_backend

backend k8s_api_backend
    mode     tcp
    balance  source    # 클라이언트 IP 기반 고정 세션
    stick-table type ip size 100k expire 30m         # 세션 테이블 정의
    stick on src                                     # 소스 IP 기반 매핑

    option    httpchk GET /readyz                    # L7 상세 헬스체크
    http-check expect status 200                     # 200 응답 시 정상으로 판단

    server master-1 10.128.0.35:6443 check ssl verify none fall 3 rise 2
    server master-2 10.128.0.36:6443 check ssl verify none fall 3 rise 2
    server master-3 10.128.0.37:6443 check ssl verify none fall 3 rise 2
  • 세션 유지 (Sticky Sessions): 동일 클라이언트는 항상 동일 서버로 연결
  • L7 헬스체크: API 서버의 /readyz 엔드포인트로 더 정확한 상태 확인
  • SSL 검증 옵션: SSL 인증서 검증 설정

2-4. 설정 검증 & 서비스 관리

HAProxy 설정을 적용하기 전에 구문 오류를 검사하고, 서비스를 시작합니다.

# 구문 검사
sudo haproxy -c -f /etc/haproxy/haproxy.cfg

# 재시작 및 부팅 자동실행
sudo systemctl restart haproxy
sudo systemctl enable haproxy

# 상태 확인
systemctl status haproxy --no-pager

3. 부하 분산 메커니즘

HAProxy는 다양한 로드 밸런싱 알고리즘을 지원합니다.

  1. roundrobin: 순차적으로 요청을 분배 (기본 설정)
  2. source: 클라이언트 IP 기반 분배, 세션 유지에 유용
  3. leastconn: 가장 연결 수가 적은 서버로 우선 분배
  4. uri: URI 기반 분배 (HTTP 모드에서만 가능)

본 설정에서는 roundrobin을 사용해 세 개의 API 서버에 균등하게 요청을 분산합니다.

헬스 체크와 장애 감지

HAProxy는 설정된 체크 방식에 따라 각 백엔드 서버의 상태를 주기적으로 확인합니다.

  • TCP 체크: 단순 TCP 연결 성공 여부 확인
  • HTTP 체크: 지정된 URL에 HTTP 요청을 보내 응답 코드 확인

fallrise 파라미터는 다음을 의미합니다.

  • fall 3: 연속 3번 실패 시 서버를 비정상으로 표시
  • rise 2: 연속 2번 성공 시 서버를 정상으로 복귀

이를 통해 일시적 네트워크 불안정으로 인한 오탐지를 방지합니다.

4. 다음 단계

쿠버네티스 클러스터 구성을 위한 다음 단계는 다음과 같습니다. 자세한 내용은 GCP에 VM으로 직접 쿠버네티스 클러스터 구축하는 방법를 참고하세요.

  • 컨트롤 플레인 초기화: kubeadm init --control-plane-endpoint=Bastion:6443 --upload-certs 명령으로 첫 번째 마스터 노드 초기화
  • 추가 컨트롤 플레인 구성: 생성된 조인 토큰을 사용해 나머지 컨트롤 플레인 노드 추가
  • 워커 노드 조인: 워커 노드 조인 토큰으로 워커 노드 추가

운영 환경 고려사항

  • 로드 밸런서 고가용성: 최소 2대의 로드 밸런서와 Keepalived (VRRP)를 구성하여 단일 장애점 제거
  • 세션 지속성: API 서버 호출의 일관성을 위해 세션 유지 설정 고려
  • SSL 종료: 필요에 따라 HAProxy에서 SSL 종료 구성
  • 모니터링: HAProxy 통계 Prometheus 통합으로 모니터링 강화

결론

이 가이드에서는 HAProxy를 사용하여 쿠버네티스 컨트롤 플레인에 대한 고가용성 로드 밸런서를 구성하는 방법을 살펴보았습니다. 적절한 로드 밸런싱 구성은 쿠버네티스 클러스터의 안정성과 가용성을 크게 향상시킬 수 있습니다. 운영 환경에서는 로드 밸런서 자체의 고가용성도 반드시 고려해야 합니다.

참고 링크

댓글남기기