Haproxy/keepalived Ansible 사용

임재성·2026년 1월 23일

kubernetes를 사용해보기위해 작업 진행중 외부에서 접속하는 vip가 필요.
vm을 활용하여 사용하기에 3대의 가상머신만 생성을 해서 haproxy/keepalived를 사용했어야 했다. 그런데 하나의 머신에서 모든 설정을 관리하기위한 방법으로 ansible을 사용하기로 하였음.
유지보수가 쉬워서.

설치

# Ansible 설치(여러대중 하나만 설치하면됨)
sudo apt update && sudo apt install -y ansible

# 인벤토리 파일 생성 (관리할 노드 목록)
sudo vi /etc/ansible/hosts
# 나의경우 위의 방법으로 수행했을때 파일을 쓸 수 없다고 하여.
# sudo touch /etc/ansible/hosts 를 통해서 파일을 생성하였다.
# 당연히 ansible폴더가 있어야한다.

/etc/ansible/hosts

[masters]
node1 ansible_host=<node1 IP> k_priority=80
node2 ansible_host=<node2 IP> k_priority=100
node3 ansible_host=<node3 IP> k_priority=90

[masters:vars]
ansible_user=<계정이름>

ansible 계정 home에 위치(haproxy.cfg.j2)

frontend k8s-api
    bind 10.0.2.10:6444 # loadbalancer server를 따로 두고있지 않으니 포트를 6444로 변경
    default_backend k8s-masters

backend k8s-masters
    balance roundrobin
    server node1 10.0.2.5:6443 check
    server node2 10.0.2.6:6443 check
    server node3 10.0.2.4:6443 check

ansible 계정 home에 위치(keepalived.conf.j2)

vrrp_instance VI_1 {
    state "BACKUP"
    interface enp0s3  # 실제 네트워크 인터페이스명으로 수정하세요
    virtual_router_id 51
    priority {{ k_priority }}
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        10.0.2.10  # 사용할 가상 IP
    }
}

ansible 계정 home에 위치 ha-setup.yml

- hosts: masters
  become: yes
  tasks:
    - name: HAProxy 및 Keepalived 설치
      apt:
        name: [haproxy, keepalived]
        state: present
        update_cache: yes

    - name: HAProxy 설정 파일 배포
      template:
        src: ./haproxy.cfg.j2
        dest: /etc/haproxy/haproxy.cfg
      notify: restart haproxy

    - name: Keepalived 설정 파일 배포
      template:
        src: ./keepalived.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: restart keepalived

    - name: Keepalived # 서비스를 재시작하고 부팅 시 자동 시작 설정
      systemd:
        name: keepalived
        state: restarted    # 서비스를 다시 시작함
        enabled: yes        # 부팅 시 자동으로 켜지게 함 (이게 안 되어 있었을 겁니다)
        daemon_reload: yes  # systemd 설정을 새로고침함

    - name: HAProxy #서비스를 재시작하고 부팅 시 자동 시작 설정
      systemd:
        name: haproxy
        state: restarted
        enabled: yes
        daemon_reload: yes
  handlers:
    - name: restart haproxy
      service: name=haproxy state=restarted
    - name: restart keepalived
      service: name=keepalived state=restarted
# ansible 계정 생성(모든 노드 설정)
sudo useradd -m -s /bin/bash <계정이름>

# ansible 계정 비밀번호 설정 (초기 1회) (모든 노드 설정)
# 실행시 비밀번호 치는 구간이 나옴..
sudo passwd ansible

# sudo 권한 부여 (비밀번호 없이 sudo 가능하게 설정) (모든 노드 설정)
echo "ansible ALL=(ALL) NOPASSWD:ALL" | sudo tee /etc/sudoers.d/ansible


# ssh 인증 설정
# 1. ansible 계정으로 전환 (이미 전환했다면 패스)
sudo su - ansible

# 2. SSH 키 생성 (이미 만들었다면 패스)
# 중요!!!
# *****엔터만 계속 입력*******
ssh-keygen -t rsa

# 3. 각 노드에 내 열쇠(Public Key)를 전달 (비밀번호를 물어보면 아까 ansible 계정 passwd로 정한걸 입력하세요)
ssh-copy-id ansible@10.0.2.4
ssh-copy-id ansible@10.0.2.5
ssh-copy-id ansible@10.0.2.6


# ansible 계정 상태에서 실행
export ANSIBLE_HOST_KEY_CHECKING=False
ansible-playbook -i /etc/ansible/hosts ha-setup.yml


# 상태확인
ansible masters -m shell -a "systemctl is-active haproxy"
ansible masters -m shell -a "systemctl is-active keepalived"

# 특정노드만 실행
# ansible 계정에서 실행
ansible-playbook -i /etc/ansible/hosts ha-setup.yml --limit node1


# 중지
# 모든 마스터 노드의 keepalived와 haproxy 중지
ansible masters -m systemd -a "name=keepalived state=stopped" --become
ansible masters -m systemd -a "name=haproxy state=stopped" --become

문제 발생.

haproxy

  • haproxy를 실행하면서 vip가 할당되는 가상머신을 제외하고는 모두 haproxy가 꺼진다.
  • 리눅스상에서 할당되지 않은 ip를 이용하여 포트를 열려고 시도하면 막아버리기 때문에 옵션을 통한 설정이 필요.
sudo sysctl -w net.ipv4.ip_nonlocal_bind=1
  • 명령을 통해서 성공적인수행 가능.

파일 수정

  • 위에서 작성한 ha-setup.yml 을 아래와 같이 수정한다.
- hosts: masters
  become: yes
  tasks:
    - name: 비로컬 IP 바인딩 허용 (운영 필수 설정)
      sysctl:
        name: net.ipv4.ip_nonlocal_bind
        value: '1'
        state: present
        reload: yes

    - name: HAProxy 및 Keepalived 설치
      apt:
        name: [haproxy, keepalived]
        state: present
        update_cache: yes

    - name: HAProxy 설정 파일 배포
      template:
        src: ./haproxy.cfg.j2
        dest: /etc/haproxy/haproxy.cfg
      notify: restart haproxy

    - name: Keepalived 설정 파일 배포
      template:
        src: ./keepalived.conf.j2
        dest: /etc/keepalived/keepalived.conf
      notify: restart keepalived

    - name: Keepalived # 서비스를 재시작하고 부팅 시 자동 시작 설정
      systemd:
        name: keepalived
        state: restarted    # 서비스를 다시 시작함
        enabled: yes        # 부팅 시 자동으로 켜지게 함 (이게 안 되어 있었을 겁니다)
        daemon_reload: yes  # systemd 설정을 새로고침함

    - name: HAProxy #서비스를 재시작하고 부팅 시 자동 시작 설정
      systemd:
        name: haproxy
        state: restarted
        enabled: yes
        daemon_reload: yes
  handlers:
    - name: restart haproxy
      service: name=haproxy state=restarted
    - name: restart keepalived
      service: name=keepalived state=restarted

참고

  • 해당 내용들은 사용자가 직접 명령을 통해서 끄거나 ansible-playbook 명령을 통해 실행시 실패하더라도 재시작 해주는 파일이 아닙니다.
  • 기능을 구현하기 위해서는 따로 설정을 바꿔줘야하니 참고 바랍니다.
profile
조금씩 앞으로

0개의 댓글