본문 바로가기

DevOps/쿠버네티스(Kubernetes)

[CKA] Kubernetes에서의 ETCD의 역할

ETCD란 무엇인가?

 

1. ETCD란 무엇인가?

    - 키 값(Key-Value) 저장이 무엇인가, 기존의 데이터베이스와 무엇이 다른가?

2. ETCD를 빠르게 시작하는 방법

3. 클라이언트 도구를 사용하여 ETCD를 운영하는 방법 

 

 

ETCD란 무엇인가?

간단하고 안전하며 빠른 분산형, 신뢰할 수 있는 키 값 저장소이다.
키 값 저장소는 무엇일까? 전통적으로 데이터베이스는 표 형식이었다. SQL 또는 관계형 데이터베이스, 즉 행과 열의 형태로 저장된 데이터에 대해 들어본 적이 있을 것이다.

Name Age Location
DaHye Lee 28 Seongnam
Seoungsil Sim 28 Seoul
Chung Sim 5 Seoul
Cherry 6 Gwangju

예를 들어, 여기 몇 명의 개인에 대한 정보를 저장하는 표가 있다. 행은 각 사용자를 나타내고 열은 저장되는 정보의 유형을 나타낸다.

 

Key Value
Name DaHye Lee
Age 28
Location Seongnam

 

키 값 저장소는 키 및 값 형식으로 정보를 저장한다. 키와 값을 입력하면 데이터베이스에 저장된다. 그리고 키를 얻으면 값이 반환되고 중복 키를 가질 수 없다.

따라서 일반 표 형식의 데이터베이스를 대체하는 것으로는 사용되지 않는다. 대신 빠른 읽기 및 쓰기가 필요한 구성 데이터와 같은 작은 데이터 청크를 저장하고 검색하는 데 사용된다.

 

 

ETCD를 빠르게 시작하는 방법

ETCD를 설치하고 시작하는것은 쉽다. 바이너리를 다운로드 후 압축을 풀고 실행한다.

1. Download Binaries

curl -L https://github.com/etch-io/etch/releses/download/v3.3.11/etch-v3.3.11-linux-amd64.tsr.gz -o etcd-v3.3.11-linux-amd64.tar.gz

2. Extract

tar xzvf etcd-v3.3.11-linux-amd64.tar.gz

3. Run ETCD Service

./etcd


추출된 GitHub 릴리스 페이지에서 운영 체제에 대한 관련 바이너리를 다운로드하고 압축을 풀고 ETCD 실행 파일을 실행하면 된다.

 

클라이언트 도구를 사용하여 ETCD를 운영하는 방법 

기본적으로 포트 2379에서 수신하는 서비스를 시작한다. 그런 다음 모든 클라이언트를 서비스에 연결하여 정보를 저장하고 검색할 수 있다. 
ETCD와 함께 제공되는 기본 클라이언트는 ETCD 제어 클라이언트(ETCD control client)이다. ETCD 제어 클라이언트는 ETCD용 명령줄 클라이언트이다.

 

./etcdctl set key1 value1


이 명령을 사용하여 키 값 쌍을 저장 및 검색하고 키 값 쌍을 저장하고 제어 set를 실행할 수 있다. 이렇게 하면 정보가 포함된 항목이 데이터베이스에 작성된다.

 

./etcdctl get key1
value1

 

저장된 데이터를 검색하려면 exit 후  get key1 명령을 실행한다.

 

 


 

Kubernetes에서의 ETCD의 역할

 

ETCD 데이터저장소는 노드, 포드, 구성, 암호, 계정, 역할, 바인딩 등과 같은 클러스터 관련 정보를 저장한다.

  • Nodes
  • PODs
  • Configs
  • Secrets
  • Accounts
  • Roles
  • Bindings

kubectl get 명령을 실행할 때 표시되는 모든 정보는 ETCD 서버에서 가져온 것이다.
노드 추가, 포드 또는 ReplicaSet, Deployment 등 클러스터에 대한 모든 변경 사항이 ETCD 서버에서 업데이트된다. ETCD 서버에서 업데이트한 경우에만 변경이 완료된 것으로 간주된다.

클러스터를 설정하는 방법에 따라 ETCD가 다르게 배포된다. 두가지 유형으로 배포가 되는데

1. 처음부터 클러스터를 처음부터 직접 설정

2. kubeadm 도구를 사용하여 배포

실습 테스트 환경은 kubeadm 도구를 사용하여 배포하는 경우이고 나중에 클러스터를 처음부터 설정하는 경우가 있다. 두 가지 방법의 차이를 알아두는 것이 좋다.

 

 

$ wget -q --https-only \
 "https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz"
 
 etcd.service
 ExecStart=/usr/local/bin/etcd \\
    --name ${ETCD_NAME} \\
    --cert-file=/etc/etcd/kubernetes.pem \\
    --key-file=/etc/etcd/kubernetes-key.pem \\
    --peer-cert-file=/etc/etcd/kubernetes.pem \\
    --peer-key-file=/etc/etcd/kubernetes-key.pem \\
    --trusted-ca-file=/etc/etcd/ca.pem \\
    --peer-trusted-ca-file=/etc/etcd/ca.pem \\
    --peer-client-cert-auth \\
    --client-cert-auth \\
    --initial-advertise-peer-urls https://${INTERNAL_IP}:2380 \\
    --listen-peer-urls https://${INTERNAL_IP}:2380 \\
    --listen-client-urls https://${INTERNAL_IP}:2379,https://127.0.0.1:2379 \\
    --advertise-client-urls https://${INTERNAL_IP}:2379 \\
    --initial-cluster-token etcd-cluster-0 \\
    --initial-cluster controller-0=https://${CONTROLLER0_IP}:2380,controller-1=https://${CONTROLLER1_IP}:2380 \\
    --initial-cluster-state new \\
    --data-dir=/var/lib/etcd

클러스터를 처음부터 설정하는 경우 직접 ETCD 바이너리를 다운로드하고 바이너리를 설치하고 ETCD를 배포한다. 마스터 노드에서 ETCD를 구성한다. 서비스에 전달된 옵션 중 다수는 인증서와 관련이 있고 다른 것들은 ETCD를 클러스터로 구성하는 것에 관한 것이다. 

 

--advertise-client-urls https://${INTERNAL_IP}:2379 \\


우리가 kubernetes에서 고가용성을 설정할 때 주목해야 할 유일한 옵션은  client-urls 을 알려주는 것이다.
client-urls은 ETCD가 수신하는 주소이다. 서버의 IP와 ETCD가 수신하는 기본 포트는 2379이다. 이것은 ETCD 서버에 연결하려고 할 때 kube-api 서버에 구성해야 하는 URL이다.

 

 

$ kubectl get pods -n kube-system

    NAMESPACE   NAME                            READY   STATUS   RESTARTS   AGE
    kube-system coredns-78fcdf6894-prwvl        1/1     Running     0       1h
    kube-system coredns-78fcdf6894-vqd9w        1/1     Running     0       1h
    kube-system etcd-master                     1/1     Running     0       1h
    kube-system kube-apiserver-master           1/1     Running     0       1h
    kube-system kube-controller-manager-master  1/1     Running     0       1h
    kube-system kube-proxy-f6k26                1/1     Running     0       1h
    kube-system kube-proxy-hnzsw                1/1     Running     0       1h
    kube-system kube-scheduler-master           1/1     Running     0       1h
    kube-system weave-net-924k8                 2/2     Running     1       1h
    kube-system weave-net-hzfcz                 2/2     Running     1       1h


Kubeadm을 사용하여 클러스터를 설정하는 경우 Kubeadm은 kube-system 네임스페이스에 ETCD 서버를 POD로 배포한다.

 

$ kubectl exec etcd-master –n kube-system etcdctl get / --prefix –keys-only
/registry/apiregistration.k8s.io/apiservices/v1.
/registry/apiregistration.k8s.io/apiservices/v1.apps
/registry/apiregistration.k8s.io/apiservices/v1.authentication.k8s.io
/registry/apiregistration.k8s.io/apiservices/v1.authorization.k8s.io

 

POD 내에서 etcdctl 유틸리티를 사용하여 ETCD  데이터베이스를 탐색할 수 있다. kubernetes에 의해 저장된 모든 키를 나열하려면 다음과 같이 etcdctl get 명령을 실행한다.

Kubernetes는 root 디렉토리가 레지스트리가 되는 특정 디렉토리 구조에 데이터를 저장하며, 그 아래에 미니언 또는 노드, 포드, replicasets, deployment와 같은 다양한 Kubernetes 구조를 가지고 있다.

Registry

  • minions
  • pods
  • replicasets
  • deployment
  • roles
  • secrets

 

--initial-cluster controller-0=https://${CONTROLLER0_IP}:2380,controller-1=https://${CONTROLLER1_IP}:2380 \\

고가용성 환경에서는 클러스터에 여러 개의 마스터 노드가 있을 것이고, 그러면 여러 개의 ETCD 인스턴스가 마스터 노드에 분산될 것이다.

initial-cluster 옵션은 ETCD 서비스의 여러 인스턴스를 지정해야 하는 곳이다.

 

 

 

 

 

 

출처:

https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/learn/lecture/14298420#overview

https://www.udemy.com/course/certified-kubernetes-administrator-with-practice-tests/learn/lecture/14298422#overview