Kubernetes HA with HAProxy

By | 2022년 10월 23일
Table of Content

Kubernetes HA with HAProxy

master 서버와 worker 서버에 대한 로드밸런싱 기능을 구현합니다.
문서를 간단하게 유지하기 위해 keepalive 및 failover 는 설치하지 않습니다.

3대의 master 서버와 2 대의 worker 서버를 설치합니다.
(기존에 설치되어 있는 Kubernetes 클러스터에는 HAProxy 를 연동할 수 없습니다.)

HAProxy (모든 master, worker)

sudo apt-get install -y haproxy

호스트를 등록해 줍니다.

sudo vi /etc/hosts
---------------------------
172.31.20.101 k8s-master1
172.31.20.102 k8s-master2
172.31.20.103 k8s-master3
---------------------------

master 서버

HAProxy 설정

16443 포트로 들어오는 트래픽을 master 서버의 6443 포트로 포워딩합니다.

sudo vi /etc/haproxy/haproxy.cfg
---------------------------
frontend kubernetes-master-lb
        bind 0.0.0.0:16443
        option tcplog
        mode tcp
        default_backend kubernetes-master-nodes

backend kubernetes-master-nodes
        mode tcp
        balance roundrobin
        option tcp-check
        option tcplog
        server node1 k8s-master1:6443 check
        server node2 k8s-master2:6443 check
        server node3 k8s-master3:6443 check
---------------------------
sudo systemctl restart haproxy

Kubernetes 설정

여기 를 참조하여 master 서버를 생성합니다.

단, 아래 명령은 변경해 줍니다.

# sudo kubeadm init
sudo kubeadm init --control-plane-endpoint "k8s-master1:16443" --upload-certs

control-plane-endpoint 는 로드밸런서를 지정하는 것이 가장 좋지만,
위에서는 첫번째 master 서버로 설정합니다.
(k8s-master1 이 SPOF 로 작동합니다.)

master 서버와 worker 서버 모두를 생성해 줍니다.

이것으로 master 서버에 대한 HA 는 설정이 끝납니다.

worker 서버 설정하기

ingress-nginx 를 설치합니다.

git clone https://github.com/kubernetes/ingress-nginx.git
cd ./ingress-nginx/deploy/static/provider/baremetal
kubectl apply -f .
kubectl get deploy -n ingress-nginx
kubectl get svc -n ingress-nginx

# 오류가 발생하면 실행할 것
# kubectl delete -A ValidatingWebhookConfiguration ingress-nginx-admission
kubectl get svc -n ingress-nginx
NAME                                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
ingress-nginx-controller             NodePort    10.106.157.74   <none>        80:31507/TCP,443:30405/TCP   164m
ingress-nginx-controller-admission   ClusterIP   10.105.6.182    <none>        443/TCP                      164m

방법 1 : 모든 worker node 에 설치하기

이 방식은 cpu 100% 이슈가 발생하는 듯 하다.
ArgoCD 가 내부적으로 haproxy 를 사용하는데 쫑나는 듯

호스트 파일에 도메인을 등록합니다.
아이피는 ingress-nginx-controller 의 CLUSTER-IP 입니다.

sudo vi /etc/hosts
---------------------------
10.106.157.74 k8s-jenkins.skyer9.pe.kr
---------------------------
sudo vi /etc/haproxy/haproxy.cfg
---------------------------
frontend jenkins_frontend
    bind *:80
    use_backend jenkins_backend if { hdr(host) -i k8s-jenkins.skyer9.pe.kr }

backend jenkins_backend
    option tcp-check
    server jenkins k8s-jenkins.skyer9.pe.kr
---------------------------
sudo systemctl restart haproxy

http://k8s-jenkins.skyer9.pe.kr/ 로 접속할 수 있습니다.

방법 2 : haproxy 서버 별도 구성

호스트 파일에 worker node 를 등록합니다.
아이피는 worker node 의 private IP 입니다.(EC2 인스턴스의 경우)

sudo vi /etc/hosts
---------------------------
172.31.20.201 k8s-worker1
172.31.20.202 k8s-worker2
---------------------------

포트는 ingress-nginx-controller 의 NodePort 입니다.

sudo vi /etc/haproxy/haproxy.cfg
---------------------------
frontend jenkins_frontend
    bind *:80
    use_backend jenkins_backend if { hdr(host) -i k8s-jenkins.skyer9.pe.kr }

backend jenkins_backend
    mode tcp
    balance roundrobin
    option tcp-check
    option tcplog
    server node1 k8s-worker1:31507 check
    server node2 k8s-worker2:31507 check
---------------------------
sudo systemctl restart haproxy

http://k8s-jenkins.skyer9.pe.kr/ 로 접속할 수 있습니다.

답글 남기기