본문 바로가기

kubernetes, helm, rancher

kubernetes HA(Highly Available), multi master node

기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.

https://kubernetes.io/docs/home/

 

Kubernetes Documentation

Kubernetes is an open source container orchestration engine for automating deployment, scaling, and management of containerized applications. The open source project is hosted by the Cloud Native Computing Foundation.

kubernetes.io

 

  • control plane(master node)를 최소 3개이상 운영함으로써 Highly Available(HA) cluster 운영.
  • load balancer를 실행 및 여러 master node와 연결 및 etcd 동기화 작업, 여러 대의 etcd 중 leader를 뽑고 write권한이 있으며, 다른 etcd에 copy한다. -> RAFT 프로토콜
  • 만약 다른 노드가 죽어서 etcd를 copy를 못시킨다면, quorum에 따라 결과가 다르게 나타난다.
  • majority/2 + 1을 내림한 값(quorum)이 최소한의 살아있는 node개수여야한다.
  • worker nodes은 master node와 아니라 load balancer와 연결.
  • load balancer는 어떤 master node가 active되고 standby되는지 결정해야한다.
  • load balancer를 제외한 master node가 3개 이상, 홀수개수면 etcd 운영에 있어서 좋다.
# master nodes의 controller manager, scheduler의 작동방식
kube-controller-manager --leader-elect true 
                        --leader-elect-lease-duration 15s 
                        --leader-elect-renew-deadline 10s
                        --leader-elect-retry-period 2s
 
# etcd같은 경우는 같은 노드에 있을 경우 위험성이 높고
# 다른 노드에 설치할 경우 설정하기 까다롭고 자원소모가 크다.
# 다른 노드에 설치한다면 아래와 같이 etcd server 위치를 설정
ExecStart=/usr/local/bin/kube-apiserver \\
...
--etcd-servers=https://ip:port,https://ip:port
  • HA cluster는 기본 single master setting에서 LB(Load Balancer) 구성(nginx)과 master2, master3를 master1에 join이 추가.
  • single master setting은 https://cksdid4993.tistory.com/24 참고
  1. docker 설치(모든 노드들에 설치)
  2. kubeadm 설치(master와 worker 노드들에만 설치)
  3. kubeadm, kubelet, kubectl 설치(master, worker 노드들에만 설치)
  4. LB(Load Balancer) 구성
mkdir /etc/nginx
cat << END > /etc/nginx/nginx.conf
events {}
stream {
    upstream stream_backend {
        least_conn;
        server 10.100.0.101:6443;
        server 10.100.0.102:6443;
        server 10.100.0.103:6443;
    }
    server {
        listen         6443;
        proxy_pass stream_backend;
        proxy_timeout 300s;
        proxy_connect_timeout 1s;
    }
}
END​

 

  1. docker run --name proxy -v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro --restart=always -p 6443:6443 -d nginx -> --restart=always(항상 docker daemon과 함께 실행)
  2. kubeadm init --control-plane-endpoint "[LB ip혹은 domain:6443]" --upload-certs -> master1 kubeadm init 명령으로 초기화 -> master node join용 token과 worker node join용 token이 나온다.
  3. kubeadm token list -> token 정보
    kubeadm token delete [token 값]
    kubeadm token create --ttl [시간]
  4. token을 이용해서 master2, master3 노드들에 join 명령어 입력.
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')"​

Weave Net CNI 설치는 통해 각 노드들을 READY로.

 

  1. worker node에서 join 명령어 입력
kubeadm join [Master IP] --token [Master token] --discovery-token-ca-cert-hash [hash value] -> node가 master에 join 한다.

   2. worker node에서 kubectl 명령어 입력하고 싶을 때

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