목차

HA 연결지점의 상태 가져오기 – HAProxy Data Plane API

🗓️

개요

HAProxy를 HA 기능 또는 리버스 프록시 용도의 gateway로 사용하고 있다면 하위의 master와 slave 노드들의 모든 상태를 REST API로 추출할 수 있다. 이것은 어플리케이션의 health check api 뿐만 아니라 TCP, SSH, HTTP 등 다양한 프로토콜에도 대응하기 때문에 특정 프로토콜에 의존적이지 않다. 또한 HAProxy에 하위 프로세스만 띄우는 형식이라 설정이 번잡하지 않고, 모든 노드를 알고 있는 HAProxy를 사용하면 health check 어플리케이션을 구축할 필요가 없으므로 비용도 절감된다.

사용해보기

설치

패키지 관리자에 등록된 형태는 아니고 단일 바이너리로 실행되니 설치에 부담은 없다. 따로 버전 메트릭스는 없는것으로 보이고 HAProxy만 최소 2.0버전 이상이면 된다.

wget https://github.com/haproxytech/dataplaneapi/releases/download/v2.9.1/dataplaneapi_2.9.1_linux_x86_64.tar.gz

tar -zxvf dataplaneapi_2.9.1_linux_x86_64.tar.gz
cp dataplaneapi /usr/local/bin/

다음으로 간단하게 HAProxy와 연결할 설정을 추가한다.

cat << "EOF" >> /etc/haproxy/dataplaneapi.yml
dataplaneapi:
   host: 0.0.0.0
   port: 5555
   transaction:
     transaction_dir: /tmp/haproxy
   user:
   - insecure: true
     password: password0000
     name: admin
haproxy:
   config_file: /etc/haproxy/haproxy.cfg
   haproxy_bin: /usr/sbin/haproxy
   reload:
      reload_delay: 5
      reload_cmd: service haproxy reload
      restart_cmd: service haproxy restart
EOF

마찬가지로 haproxy.cfg 에도 Data plane API 를 구동하기 위해 추가작업을 한다.

global
    ##...
    master-worker
    ##...

program api
    command dataplaneapi -f /etc/haproxy/dataplaneapi.yml
    no option start-on-reload

이렇게 하고 재시작을 해주면 Data plane API 를 별도로 실행할 필요 없이 HAProxy 가 관리해 같이 실행된다.

systemctl restart haproxy
  • systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
     Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled; preset: disabled)
     Active: active (running) since Thu 2024-04-18 04:56:51 EDT; 5 days ago
   Main PID: 3109227 (haproxy)
      Tasks: 39 (limit: 8192)
     Memory: 103.0M
     CGroup: /system.slice/haproxy.service
             ├─3109227 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d -p /run/haproxy.pid
             ├─3109229 dataplaneapi -f /etc/haproxy/dataplaneapi.yml
             └─3109230 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d -p /run/haproxy.pid

사용법

기본적으로 dataplaneapi.yml 에서 설정한 username과 password 를 basic 인증으로 사용하면 된다.

각 연결 지점에 대한 호출은 이 API가 가장 많은 정보를 담고 있었다.

요청

### GET HAProxy sites status
GET http://0.0.0.0:5555/v2/services/haproxy/sites
Authorization: Basic admin password0000

응답

HTTP/1.1 200 OK
Configuration-Version: 16
Content-Type: application/json
Vary: Origin
Date: Mon, 31 Dec 2099 00:00:00 GMT
Connection: close
Transfer-Encoding: chunked

{
  "_version": 16,
  "data": [
    {
      "farms": [
        {
          "balance": {
            "algorithm": "source"
          },
          "forwardfor": {
            "enabled": "enabled"
          },
          "mode": "http",
          "name": "order_service-back",
          "servers": [
            {
              "check": "enabled",
              "fall": 3,
              "health_check_port": 80,
              "inter": 2000,
              "rise": 3,
              "address": "192.168.0.1",
              "name": "node01_order_service_container",
              "port": 80
            },
            {
              "check": "enabled",
              "fall": 3,
              "health_check_port": 80,
              "inter": 2000,
              "rise": 3,
              "address": "192.168.0.2",
              "name": "node02_order_service_container",
              "port": 80
            },
            {
              "check": "enabled",
              "fall": 3,
              "health_check_port": 80,
              "inter": 2000,
              "rise": 3,
              "address": "192.168.0.3",
              "name": "node03_order_service_container",
              "port": 80
            }
          ],
          "use_as": "default"
        }
      ],
      "name": "order_service-front-1",
      "service": {
        "listeners": [
          {
            "name": "192.168.10.1:80",
            "address": "192.168.10.1",
            "port": 80
          }
        ],
        "mode": "http"
      }
    }

##... 하략

설명이 필요없을정도로 연결에 대한 직관적인 정보를 보여준다. 각 연결의 check 를 활용하면 된다. 기본적으로 HAProxy 대시보드에서 보여지는 정보는 모두 Data plane API 로 조회가능하다.

주의할 점

모든 기술이 그렇듯 고려해야할 점이 있다. 반드시 확인해보고 도입하자

  1. HAProxy 가 리스닝 하는 IP로 접근해야 하기 때문에 bind 를 잘 줄 것.
  2. Data plane API는 이번에 소개된 HAProxy의 상태 조회 기능 말고도 HAProxy의 설정까지 동적으로 수정 가능하므로 반드시 인증을 걸고 사용할 것.
  3. 위의 내용대로 HAProxy의 설정을 동적으로 바꾸는 것 때문인지 haproxy.cfg 파일의 인덴트와 설정 위치를 Data plane API가 변경한다.
    만약 haproxy.cfg 를 파싱하는 툴이나 어플리케이션을 사용하고 있다면 상호호환 가능한지 꼭 확인할 것.

참고