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 |