티스토리 뷰

배경

회사에서 쿠버네티스 HA구성을 해야 하는 일이 생겼다. (정확히는 control plane HA)

나는 HAProxy를 모른다. 그래서 공부를 해보게 되었다.

쿠버네티스 HA 구성?

stack etcd 방식의 HA 구성

테스트 환경에서 쿠버네티스 클러스터를 만드는 경우 control plane을 하나로 두고 다수의 worker 노드를 두고 구성한다.

하지만 이런 구성의 경우, control plane 노드가 죽었을 때 쿠버네티스의 상태와 config, secret 등 중요한 정보가 들어있는 etcd의 데이터가 유실될 위험이 있다.

 

따라서 프로덕션 환경에서는 쿠버네티스 관리의 고가용성을 위해 apiserver를 HA로 구성하고, 중요한 정보의 유실을 방지하기 위해 etcd의 정보의 redunduncy를 확보해야 한다. 이러한 구성은 kubeadm을 사용하여 init 과정에서 모두 달성할 수 있다. 하지만 다수의 control plane 노드로 로드밸런싱 해주는 로드밸런서는 따로 직접 구성해야 한다. 그리고 이 로드밸런서로 사용되는 것이 HAProxy이다.

로드밸런서를 외부에 두지 않고, 각 control plane에 HAProxy와 keepalived를 통해 클러스터 내부에 구성할 수 있다. 이 경우에는 설정이 달라지고, 필자의 환경에서는 로드밸런서를 따로 둘 수 있는 여유 머신이 존재하여 외부에 구성하였다.
(솔직히 vip와 keepalived까지 구성하기 귀찮았다는건 안비밀...ㅋㅋ)

로드밸런싱?

여러 control plane을 구성하는 주된 이유는 etcd 데이터의 보존에 있지만, 위에서 말했던 것처럼 apiserver의 가용성을 높이는 목적도 있다. apiserver가 하나만 존재한다면 단시간의 여러 트래픽이 몰리는 경우 이를 처리하는데 시간이 걸릴 것이다. 따라서 다수의 apiserver를 구성한 뒤 이 부하(load)를 분산(balancing) 해줄 필요가 있다. 이때 어떤 서버로 얼마의 트래픽을 보낼지 찾는 것이 로드밸런싱이고, 이를 하는 구현체가 로드밸런서이다.

 

로드밸런싱 알고리즘에는 다음과 같은 것이 있다.

  • 라운드로빈 - 순서대로 돌아가면서 공평하게 할당
  • 가중 라운드로빈 - 가중치가 높은 곳에 우선 할당
  • IP 해시 - 특정 IP를 특정 서버로 할당
  • 최소 연결 - 가장 적은 연결상태의 서버에 우선 할당
  • 최소 리스폰 타임 - 연결상태, 응답시간을 모두 고려해 할당

또한 어떤 네트워크 레이어에서 로드밸런싱 하냐에 따라 L4/L7 로드밸런싱으로 나뉜다.

OSI 7 계층에 따라 L4 로드밸런싱은 IP와 Port 번호 등으로 트래픽을 나누고, L7 로드밸런싱은 URL 등으로 트래픽을 나눈다.


HAProxy란

HAProxy는 고성능의 TCP/HTTP 로드 밸런서 및 프록시 서버로, 웹 서버의 로드 밸런싱과 고가용성을 제공하도록 설계되었다. 오픈소스로 제공되며, 대규모 웹 사이트에서 많이 사용되는 신뢰할 수 있는 솔루션이다.

HAProxy의 특징

  1. 고성능: HAProxy는 높은 네트워크 트래픽을 다룰 수 있으며, 일반적으로 한 서버에서 수십만 개의 동시 연결을 처리할 수 있다.
  2. 고가용성: HAProxy는 서버나 서비스가 실패하는 경우에도 계속 작동하도록 설계되었다.
    이것은 트래픽을 여러 서버 간에 분산시키는 로드 밸런싱뿐만 아니라, 주 서버가 다운되는 경우를 대비한 대체 서버 (failover) 지정 기능을 통해 이루어진다. (keepalived와 같이 사용)
  3. 유연성: 다양한 로드 밸런싱 알고리즘을 지원하며, 트래픽 라우팅과 관련된 광범위한 옵션을 제공한다. 또한 HTTP, HTTPS, TCP 등 다양한 프로토콜을 지원한다.
  4. 보안: SSL/TLS 암호화를 지원하며, HTTP 요청 및 응답에 대한 상세한 통제를 제공함으로써 안전한 웹 통신을 가능하게 한다.

HAProxy의 동작방식

HAProxy는 기본적으로 클라이언트가 HAProxy 서버에 요청을 보내면, HAProxy는 이 요청을 로드 밸런싱 알고리즘에 따라 여러 백엔드 서버 중 하나에게 요청을 전달한다(Proxy).

이때, HAProxy는 서버의 상태를 모니터링하며, 서버가 다운되면 자동으로 다른 서버로 요청을 전달하여 고가용성을 유지한다. 또한, 클라이언트와 서버 사이에 위치하여 트래픽을 변형이나 개입 없이 처리한다. 따라서 클라이언트와 서버는 HAProxy가 로드밸런싱을 한다는 사실을 모르게 할 수 있다. 

 

그러나 HAProxy는 필요에 따라 요청과 응답을 조작하거나 분석할 수도 있다. 예를 들어, 특정 HTTP 헤더를 추가하거나 변경하거나, 요청 또는 응답을 특정 조건에 따라 차단하거나, 요청이나 응답의 특정 내용을 로그에 기록하는 등의 기능을 수행할 수 있다. 이렇게 하면 HAProxy는 단순한 트래픽 중계자 이상의 역할을 하게 되며, 트래픽의 흐름을 더욱 세밀하게 제어할 수 있게 된다.


HAProxy를 사용한 L4 레이어 라운드로빈 로드밸런싱 설정

이제 HAProxy를 사용하여 간단하게 L4 레이어에서 라운드로빈 방식으로 로드밸런싱 설정하는 방법에 대해 예제와 함께 알아보자.

 

1. HAProxy 설정 파일(haproxy.cfg)을 열어보자. 대부분의 경우 /etc/haproxy/haproxy.cfg에 위치한다.

2. 설정 파일에서 frontend, backend 섹션을 설정한다. 아래는 예제 설정이다:

frontend http_front
   bind *:80
   default_backend http_back

backend http_back
   balance roundrobin
   server server1 192.168.1.1:80 check
   server server2 192.168.1.2:80 check
  • 'frontend'에서는 HAProxy가 클라이언트의 연결을 받아들일 IP와 포트를 지정한다.
  • 'backend'에서는 로드 밸런싱 방식과 백엔드 서버들을 지정한다. 
  • 'roundrobin'은 각 서버에 순서대로 연결을 분배하는 방식이다. check 옵션은 HAProxy가 정기적으로 서버 상태를 체크하게 한다.

3. 설정 파일을 저장하고 HAProxy를 재시작합니다.

sudo service haproxy restart

이렇게 하면 HAProxy를 이용하여 간단하게 L4레이어에서 라운드 로빈 방식으로 로드밸런싱을 설정할 수 있다.

 

HAProxy를 이용해 쿠버네티스 HA 구성하기

대충 그림으로 설명하면 다음과 같이 설정이 가능하다. 이렇게 설정하면 HAProxy가 80/443으로 들어오는 트래픽을 쿠버네티스 클러스터 안에서 돌고 있는 ingress controller로 트래픽을 잘 전달된다. 하지만 왜인지 쿠버네티스 안쪽에서 ingress가 이전과 같이 동작하지 않는다...ㅠㅜ 해결하면 다음 포스트(추가: 결국 작성했다. 여기에서 확인 가능하다.)로 다룰 예정이다.

 

그림에는 나오지 않았지만, 쿠버네티스 apiserver의 진입점인 6443 포트로 트래픽을 전달하게 설정이 되어있다. 따라서 worker노드와 외부(ArgoCD와 같은 서비스 등)에서 쿠버네티스에 명령을 보내는 경우 HAProxy의 6443 포트를 통해서 control plane과 연결된다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함