Cloud/Kubernates

# k8s + keepalived + haproxy HA 구성

skysoo1111 2019. 9. 6. 18:04

k8s(쿠버네티스)는 여러 장점을 가진 컨테이너 제공 플랫폼이지만 단일 서버로만 서비스를 제공한다면, 그 서비스는 언제든 중단될 수 있는 불완전한 서비스일 것이다.

 

따라서 쿠버네티스는 HA 구성을 지원한다.

 

HA란?

High Availavility의 약자로 고 가용성을 뜻하며, 서버와 네트워크, 프로그램 등의 정보 시스템이 상당히 오랜 기간 동안 지속적으로 정상 운영이 가능한 성질을 말한다.

 

[ k8s HA 구성 전 필수 확인 사항 ]

  • kubeadm의 최소 요구 사항을 충족하는 3대의 Master 시스템
  • kubeadm의 최소 요구 사항을 충족하는 3대의 Worker 시스템
  • 클러스터의 모든 시스템 (공용 또는 개인 네트워크) 간의 모든 네트워크 연결
  • 모든 장치에 대한 sudo 권한
  • 하나의 장치에서 모든 노드의 SSH 액세스 권한
  • 모든 시스템에 설치된 시스템 kubeadm 및 kubelet. kubectl은 선택 사항

[ 아래 순서로 진행 ]

Step 1. keepalived 설치 및 기동 - All Master Node 설정
Step 2. haproxy 설치 및 기동 - All Master Node 설정
Step 3. kubeadm / kubectl / kubelet 설치
Step 4. kubeadm-config.yaml 작성
Step 5. Master Node 1 설정
Step 6. Master Node 1 네트워크 설정
Step 7. Master Node 2 설정
Step 8. Master Node 3 설정

=> 해당 과정은 시스템 방화벽을 내린 상태로 진행했기 때문에 방화벽을 올리고 설치해야 한다면 필요한 방화벽 포트를 다 뚫어줘야 한다. ( 기동에 필요한 방화벽 오픈 목록은 추후에 정리해서 포스팅 하겠다. )

 

[ SSH 설정 - 필수는 아님 ]

- 서버간 파일 전송시 매번 암호/패스워드를 묻는 과정을 반복하는건 상당히 귀찮다. SSH 설정으로 해당 작업을 없애자.

# Master Node 1
$ rm -rf /root/.ssh/*
$ ssh <master ip 1> pwd
$ ssh <master ip 2> rm -rf /root/.ssh/*
$ ssh <master ip 3> rm -rf /root/.ssh/*
$ ssh <master ip 2> mkdir -p /root/.ssh/
$ ssh <master ip 3> mkdir -p /root/.ssh/
 
$ scp /root/.ssh/known_hosts root@<master ip 2>:/root/.ssh/
$ scp /root/.ssh/known_hosts root@<master ip 3>:/root/.ssh/
 
$ ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
$ cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
$ scp /root/.ssh/authorized_keys root@<master ip 2>:/root/.ssh/
 
# Master Node 2
$ ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
$ cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
$ scp /root/.ssh/authorized_keys root@<master ip 3>:/root/.ssh/
 
# Master Node 3
$ ssh-keygen -t rsa -P '' -f /root/.ssh/id_rsa
$ cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys
$ scp /root/.ssh/authorized_keys root@<master ip 1>:/root/.ssh/
$ scp /root/.ssh/authorized_keys root@<master ip 2>:/root/.ssh/
 
# 접속 테스트
# ssh -A <master ip 1>
# ssh -A <master ip 2>
# ssh -A <master ip 3>

# 혹시 위 설정을 다했는데 password를 요구하면 아래 명령어 실행
$ restorecon -Rv ~/.ssh

kube-apiserver에 대한 Load Balancer 구축 ]

- 모든 요청은 Master Node의 kube-apiserver를 거치게 되어 있으며, 이곳에서 각종 Network Traffic이 발생한다.

- 따라서 kube-apiserver에 대한 Load Balancer가 구축되어 있어야한다.

 

Step 1. keepalived 설치 및 기동 - All Master Node 설정

# keepalived 설치
$ sudo yum install keepalived                            
$ cd /etc/keepalived                                        
$ mv keepalived.conf keepalived.conf.org       # 원본 백업

# keepalived 설정 - Master Node 1
$ vi /etc/keepalived/keepalived.conf
global_defs {
    notification_email {
    test@test.com
    test2 @test.com
}
 
notification_email_from lb1@test.com
    smtp_server localhost 
    smtp_connect_timeout 30
}
 
# haproxy 활성화 체크
vrrp_script chk_haproxy {  
    script "killall -0 haproxy"
    interval 2
    weight 2
}
 
vrrp_instance VI_1 {
    state MASTER
    interface eth0          # 사용할 인터페이스 설정 (ifconfig 로확인 가능)
    virtual_router_id 51    # Master Node 3대가 모두 같은 값이어야 한다. (최대 255까지설정가능)
    priority 101            # 우선순위 설정 (최대 255까지 설정가능)
    advert_int 1            # VRRP패킷 송신 간격 설정 (초단위로 지정)
    authentication {    
        auth_type PASS      # 평문 인증 설정
        auth_pass 1111      # 인증을 위한 키 (All Master 동일값 설정)
    }
    virtual_ipaddress {
         <LoadBalancer_IP>     # VIP설정 - ping을 통해 현재 사용되지 않고 있는 ip로 설정
    }
     
    track_script {
        chk_haproxy
    }
}

# keepalived 설정 -  Master Node 2 
# Master Node 2 에서는 Master Node 1 과 동일하게 구성하되 priority와 라우터 아이디만 다르게 설정 한다.
# vi /etc/keepalived/keepalived.conf
 
global_defs {
    notification_email {
    test@test.com
    test2 @test.com
}
 
notification_email_from lb1@test.com
    smtp_server localhost 
    smtp_connect_timeout 30
}
 
# haproxy 활성화 체크
vrrp_script chk_haproxy {  
    script "killall -0 haproxy"
    interval 2
    weight 2
}
 
vrrp_instance VI_2 {
    state BACKUP
    interface eth0         
    virtual_router_id 51   
    priority 100           
    advert_int 1           
    authentication {    
        auth_type PASS     
        auth_pass 1111     
    }
    virtual_ipaddress {
        <LoadBalancer_IP>    
    }
     
    track_script {
        chk_haproxy
    }
}

# keepalived 설정 -  Master Node 3 
# Master Node 3 에서는 Master Node 1 과 동일하게 구성하되 priority와 라우터 아이디만 다르게 설정 한다.
# vi /etc/keepalived/keepalived.conf

global_defs {
    notification_email {
    test@test.com
    test2 @test.com
}
 
notification_email_from lb1@test.com
    smtp_server localhost 
    smtp_connect_timeout 30
}
 
# haproxy 활성화 체크
vrrp_script chk_haproxy {  
    script "killall -0 haproxy"
    interval 2
    weight 2
}
 
vrrp_instance VI_3 {
    state BACKUP
    interface eth0         
    virtual_router_id 51   
    priority 99        
    advert_int 1           
    authentication {    
        auth_type PASS     
        auth_pass 1111     
    }
    virtual_ipaddress {
        <LoadBalancer_IP>    
    }
     
    track_script {
        chk_haproxy
    }
}


# keepalived 실행 (All Master)
$ systemctl enable keepalived
$ systemctl start keepalived
$ systemctl status keepalived

# keepalived 로 생성한 가상 IP 확인 ( inet이 2개 있어야 한다. )
$ ip addr show eth0

 

Step 2. haproxy 설치 및 기동 - All Master Node 설정

# haproxy 설치
$ sudo yum install haproxy
$ mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.org  # 원본 백업
$ vi /etc/haproxy/haproxy.cfg

global
    log 127.0.0.1 local2
    maxconn 2000
    uid 0
    gid 0
    daemon                      # background process
 
defaults
    log     global              # global 설정 사용
    mode    tcp                 # SSL 통신을 위해서는 TCP모드로 (http모드는 SSL 안됨)
    option  tcplog
    option  dontlognull         # 데이터가 전송되지 않은 연결 로깅 제외
    retries 3                   # 연결요청 재시도 횟수
    maxconn 2000                #option redispatch 
    #timeout http-request   10s
    #timeout queue          1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
  
frontend ssl_front
    bind <LoadBalancer_IP>:16443  #VIP (kube-master 와 같은 머신을 사용하므로 port를 kube-api 서버와 다르게 설정)
    default_backend ssl_backend
  
backend ssl_backend
    balance roundrobin
    option tcp-check            # ssl-hello-chk option 사용하지 말것 - ssl3.0 protocol 이라 k8s api 서버 오류 유발 (TLS 1.2 이상만 지원)
    server hostname1 <master ip 1>:6443 check
    server hostname2 <master ip 2>:6443 check
    server hostname3 <master ip 3>:6443 check
    

# haproxy 실행 (All Master)
$ systemctl enable haproxy
$ systemctl start haproxy
$ systemctl status haproxy

 

[ LoadBalancer 설정 확인 ]
nc -v <LoadBalancer_IP> <Port> (ex: " nc -v 192.10.5.12 16443 ")

=> nc 명령어를 찾을 수 없다고 뜬다면 설치해주길 바란다.

 

Step 3. kubeadm / kubectl / kubelet 설치

# k8s 특정 버전 설치
$ sudo yum -y install kubelet-1.15.3
$ sudo yum -y install kubeadm-1.15.3 kubectl-1.15.3

# 네트워크 iptable 설정
vi /etc/sysctl.conf
$ net.bridge.bridge-nf-call-ip6tables = 1
$ net.bridge.bridge-nf-call-iptables = 1

$ sysctl -p

 

Step 4. kubeadm-config.yaml 작성

# vi kubeadm-config.yaml

apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.15.3
controlPlaneEndpoint: "192.168.10.52:16443"    # LOAD BALANCER IP : PORT 

=> kubernetes는 버전에 예민한 편이다.

필자가 k8s HA 구성시 사용한 버전은 v1.15.3이며, 다른 버전에서는 어떻게 동작할지 모른다.

 

Step 5. Master Node 1 설정

$ sudo kubeadm init --config=kubeadm-config.yaml --upload-certs

# --upload-certs는 모든 클러스터가 공유해야하는 인증서를 클러스터에 업로드하는 옵션.

Master Node 1의 설정이 정상 적용된다면 join문이 두개가 출력된다.

=> Master Node Join / Worker Node Join시 사용할 것 ( 중요 )

1) Master Node Add join문
You can now join any number of control-plane node by running the following command on each as a root:
  kubeadm join 192.168.X.X:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash sha256:<hash 값> --control-plane --certificate-key <key 값>

2) Worker Node Add join문
Then you can join any number of worker nodes by running the following on each as root:
  kubeadm join 192.168.X.X:6443 --token <token 값> --discovery-token-ca-cert-hash sha256:<hash 값>

 

 

Step 6. Master Node 1 kubectl 설정

$ mkdir -p $HOME/.kube
$ cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ chown $(id -u):$(id -g) $HOME/.kube/config

# CNI 설정
$ kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"

 

[ pod 기동 현황 확인 ] 

$ kubectl get pod -n kube-system

 

Step 7. Master Node 2 설정

$ kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash 
sha256:<hash 값> --control-plane 
--certificate-key <key 값>

 

Step 8. Master Node 3 설정

$ kubeadm join 192.168.0.200:6443 --token 9vr73a.a8uxyaju799qwdjv --discovery-token-ca-cert-hash 
sha256:<hash 값> --control-plane 
--certificate-key <key 값>

 

[ Master node 기동 현황 확인 ] 

$ kubectl get nodes

 

 

참조  1) http://wiki.webnori.com/display/kubernetes/Install+-+Highly+Available

        2) https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/

 

 

 

  • 단어장에 추가
     
    • 다음에 대한 단어 목록이 없습니다한국어 -> 영어...
       
    • 새로운 단어 목록 생성...
  • 복사
  • 단어장에 추가
     
    • 다음에 대한 단어 목록이 없습니다영어 -> 한국어...
       
    • 새로운 단어 목록 생성...
  • 복사
  • 단어장에 추가
     
    • 다음에 대한 단어 목록이 없습니다영어 -> 한국어...
       
    • 새로운 단어 목록 생성...
  • 복사
  • 단어장에 추가
     
    • 다음에 대한 단어 목록이 없습니다영어 -> 한국어...
       
    • 새로운 단어 목록 생성...
  • 복사

'Cloud > Kubernates' 카테고리의 다른 글

# k8s Horizontal Pod Autoscaler (HPA) 실습 - 1  (0) 2019.10.23
# k8s Pod Autoscaler 개념  (2) 2019.10.23
# docker + k8s + tensorflow-gpu 구성  (0) 2019.09.26
# k8s 외부 ETCD HA 구성  (0) 2019.09.10
# k8s + docker 개념  (0) 2019.09.06