Cloud/Kubernates

# k8s 외부 ETCD HA 구성

skysoo1111 2019. 9. 10. 15:48

이전 글 ( "# k8s + keepalived + haproxy HA 구성" ) 에서는 쿠버네티스의 클러스터에 대한 HA 구성을 진행했다.

 

ETCD란? 쿠버네티스의 모든 클러스터 데이터를 담는 일종의 DB로 사용되며, 클러스터의 각종 서버 정보와 상태 정보를 key-value 형태로 저장한다.

 

Kubeadm은 기본적으로 kubelet에 의해 관리되는 static pod에서 Single Member ETCD 클러스터를 실행합니다.

 

이렇게 Single Member ETCD는 서버가 Down되게 된다면, 고 가용성을 유지할 수 없다.

 

따라서 kubeadm을 사용하여 kubernetes 클러스터를 설정할 때 외부 ETCD로 사용할 수있는 3개의 멤버로 구성된 고 가용성 ETCD 클러스터를 만드는 방법에 대해 알아보자.

 

ETCD HA 구성에 앞서 아래 3 가지 조건을 충족해야 한다.

  • 3개의 Master Node는 포트 2379 및 2380을 통해 서로 통신 할 수 있어야한다. 그러나 포트는 kubeadm 구성 파일을 통해 원하는대로 구성 할 수 있다.
  • 각 호스트에는 docker, kubelet 및 kubeadm이 설치되어 있어야한다.
  • 호스트간에 파일을 복사하기 위한 일부 인프라를 사용할 수 있어야한다. (ex. ssh 및 scp)
  • 외부 ETCD 서버 3대

다음 스크립트를 사용하여 etcd 멤버가 실행될 각 호스트에 대해 하나의 kubeadm 구성 파일을 생성해라.

# HOST0, HOST1, HOST2를 실 사용 IP로 업데이트
$ export HOST0=10.0.0.6
$ export HOST1=10.0.0.7
$ export HOST2=10.0.0.8

$ mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/
$ ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2})
$ NAMES=("infra0" "infra1" "infra2")

for i in "${!ETCDHOSTS[@]}"; do
HOST=${ETCDHOSTS[$i]}
NAME=${NAMES[$i]}
cat << EOF > /tmp/${HOST}/kubeadmcfg.yaml
apiVersion: "kubeadm.k8s.io/v1beta2"
kind: ClusterConfiguration
etcd:
    local:
        serverCertSANs:
        - "${HOST}"
        peerCertSANs:
        - "${HOST}"
        extraArgs:
            initial-cluster: ${NAMES[0]}=https://${ETCDHOSTS[0]}:2380,${NAMES[1]}=https://${ETCDHOSTS[1]}:2380,${NAMES[2]}=https://${ETCDHOSTS[2]}:2380
            initial-cluster-state: new
            name: ${NAME}
            listen-peer-urls: https://${HOST}:2380
            listen-client-urls: https://${HOST}:2379
            advertise-client-urls: https://${HOST}:2379
            initial-advertise-peer-urls: https://${HOST}:2380
EOF
done

 

[인증 기관 생성]

$ kubeadm init phase certs etcd-ca

# 아래 두 파일 생성 확인 
# /etc/kubernetes/pki/etcd/ca.crt
# /etc/kubernetes/pki/etcd/ca.key

[ 각 etcd 멤버에 대한 인증서 작성 ]

# Master Node 1 에서만 작성
$ kubeadm init phase certs etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yaml
$ kubeadm init phase certs etcd-peer --config=/tmp/${HOST2}/kubeadmcfg.yaml
$ kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
$ kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST2}/kubeadmcfg.yaml
$ cp -R /etc/kubernetes/pki /tmp/${HOST2}/

# cleanup non-reusable certificates
$ find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete

$ kubeadm init phase certs etcd-server --config=/tmp/${HOST1}/kubeadmcfg.yaml
$ kubeadm init phase certs etcd-peer --config=/tmp/${HOST1}/kubeadmcfg.yaml
$ kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
$ kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST1}/kubeadmcfg.yaml
$ cp -R /etc/kubernetes/pki /tmp/${HOST1}/
$ find /etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -delete

$ kubeadm init phase certs etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yaml
$ kubeadm init phase certs etcd-peer --config=/tmp/${HOST0}/kubeadmcfg.yaml
$ kubeadm init phase certs etcd-healthcheck-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
$ kubeadm init phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml
# No need to move the certs because they are for HOST0

# clean up certs that should not be copied off this host
$ find /tmp/${HOST2} -name ca.key -type f -delete
$ find /tmp/${HOST1} -name ca.key -type f -delete

[ 인증서 및 kubeadm 설정값 복사 ]

 USER=ubuntu
 HOST=${HOST1}
 scp -r /tmp/${HOST}/* ${USER}@${HOST}:
 ssh ${USER}@${HOST}
 USER@HOST $ sudo -Es
 root@HOST $ chown -R root:root pki
 root@HOST $ mv pki /etc/kubernetes/

[ 정적 pod 매니페스트 작성 ]

root@HOST0 $ kubeadm init phase etcd local --config=/tmp/${HOST0}/kubeadmcfg.yaml
root@HOST1 $ kubeadm init phase etcd local --config=/home/ubuntu/kubeadmcfg.yaml
root@HOST2 $ kubeadm init phase etcd local --config=/home/ubuntu/kubeadmcfg.yaml

[ Cluster Health Check ]

아래 명령 중 ectd:v3.3.11 => 각자 맞는 버전을 입력하면 된다.

$ docker run --rm -it --net host -v /etc/kubernetes:/etc/kubernetes quay.io/coreos/etcd:v3.3.11 etcdctl --cert-file /etc/kubernetes/pki/etcd/peer.crt --key-file /etc/kubernetes/pki/etcd/peer.key --ca-file /etc/kubernetes/pki/etcd/ca.crt --endpoints https://${HOST0}:2379 cluster-health

 

<참고 사이트>

https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/setup-ha-etcd-with-kubeadm/

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

'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 + keepalived + haproxy HA 구성  (6) 2019.09.06
# k8s + docker 개념  (0) 2019.09.06