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/ 로 접속할 수 있습니다.