MicroService

CoreOS etcd cluster 사이즈 변경하기

behonestar 2016. 8. 10. 09:25

CoreOS 설치


Document를 보고 AWS EC2 환경에 CoreOS 클러스터를 구축하였습니다. CloudFormation으로 구축하니 클릭 몇번으로 환경이 구성되어 굉장히 편리하네요.



각 인스턴스의 UserData는 아래와 같이 구성되었습니다. 만약 UserData를 변경하고 싶다면 인스턴스를 Stop한 경우에만 가능하다고 하네요.




Cluster 사이즈 변경


etcd의 discovery값은 etcd 클러스터 개수에 기반하여 생성된 값입니다. 그렇다면 etcd 클러스터 사이즈를 늘리기 위해서는 인스턴스들을 정지시키고 User Data를 모두 변경해줘야 할까요?


Document를 조금 더 읽어보니 etcdctl 명령어를 사용하면 downtime없이 클러스터를 추가하거나 삭제하는 것이 가능하다고 하네요. 직접 확인해보기로 하였습니다.


Changing Cluster Size

After your cluster is up and running, adding or removing members is done via runtime reconfiguration, which allows the cluster to be modified without downtime. The etcdctl tool has member list, member add and member remove commands to complete this process.


현재 클러스터 상태를 확인해봅니다.


$ etcdctl cluster-health

member 713c502a7e25bd01 is healthy: got healthy result from http://172.31.29.103:2379

member 7cc9bfe3dc785752 is healthy: got healthy result from http://172.31.6.44:2379

member ef90985d6207ea94 is healthy: got healthy result from http://172.31.6.43:2379

cluster is healthy


현재 클러스터 멤버를 확인해봅니다.


$ etcdctl member list

713c502a7e25bd01: name=de53964f7e9b427aa198c613e1d59d0a peerURLs=http://172.31.29.103:2380 clientURLs=http://172.31.29.103:2379 isLeader=false

7cc9bfe3dc785752: name=8b32e59fd309452bb8e9caa1bec7b66f peerURLs=http://172.31.6.44:2380 clientURLs=http://172.31.6.44:2379 isLeader=false

ef90985d6207ea94: name=9c1cba3901a8487e821539c8ef2a1ce8 peerURLs=http://172.31.6.43:2380 clientURLs=http://172.31.6.43:2379 isLeader=true


멤버를 추가하기 위해서 CoreOS 인스턴스를 하나 더 생성합니다. 이미 생성된 CoreOS 인스턴스를 선택하고 마우스 오른쪽 버튼을 누른 후 'Launch More Like This'를 눌러줍니다.



인스턴스 생성이 완료되면 클러스터 멤버로 추가합니다. 명령을 실행하면 출력되는 문자열은 나중에 환경변수로 등록해야하니 기억해두도록 합니다.


$ etcdctl member add instance4 http://172.31.22.9:2380

Added member named instance4 with ID c815853c77ea5901 to cluster


ETCD_NAME="instance4"

ETCD_INITIAL_CLUSTER="de53964f7e9b427aa198c613e1d59d0a=http://172.31.29.103:2380,..."

ETCD_INITIAL_CLUSTER_STATE="existing"


현재 클러스터 멤버를 다시 확인해봅니다. 멤버로 등록은 되었지만 "unstarted"로 표시됩니다. etcd가 실행될 때 기존 클러스터에 추가되는 설정으로 실행되지 않았기 때문입니다. etcd 설정을 변경하고 재시작해야 합니다.


$ etcdctl member list

713c502a7e25bd01: name=de53964f7e9b427aa198c613e1d59d0a peerURLs=http://172.31.29.103:2380 clientURLs=http://172.31.29.103:2379 isLeader=false

7cc9bfe3dc785752: name=8b32e59fd309452bb8e9caa1bec7b66f peerURLs=http://172.31.6.44:2380 clientURLs=http://172.31.6.44:2379 isLeader=false

c815853c77ea5901[unstarted]: peerURLs=http://172.31.22.9:2380

ef90985d6207ea94: name=9c1cba3901a8487e821539c8ef2a1ce8 peerURLs=http://172.31.6.43:2380 clientURLs=http://172.31.6.43:2379 isLeader=true


새로 생성된 인스턴스의 User Data는 아래와 같이 설정되어있으며 이로부터 생성된 파일이 20-cloudinit.conf 입니다. 현재 etcd는 20-cloudinit.conf에 정의된 환경변수를 설정값으로 사용하여 데몬 형태로 실행되고 있습니다.


User Data

#cloud-config


coreos:

  etcd2:

    discovery: https://discovery.etcd.io/fe86a59a6724e67fc59047d4daf583b7

    advertise-client-urls: http://$private_ipv4:2379

    initial-advertise-peer-urls: http://$private_ipv4:2380

    listen-client-urls: http://0.0.0.0:2379,http://0.0.0.0:4001

    listen-peer-urls: http://$private_ipv4:2380

  units:

    - name: etcd2.service

      command: start

    - name: fleet.service

      command: start


20-cloudinit.conf (/run/systemd/system/etcd2.service.d/)

[Service]

Environment="ETCD_ADVERTISE_CLIENT_URLS=http://172.31.22.9:2379"

Environment="ETCD_DISCOVERY=https://discovery.etcd.io/fe86a59a6724e67fc59047d4daf583b7"

Environment="ETCD_INITIAL_ADVERTISE_PEER_URLS=http://172.31.22.9:2380"

Environment="ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379,http://0.0.0.0:4001"

Environment="ETCD_LISTEN_PEER_URLS=http://172.31.22.9:2380"


새로운 etcd 노드가 기존 클러스터에 추가되어야하는 경우에는 ETCD_NAME, ETCD_INITIAL_CLUSTER, ETCD_INITIAL_CLUSTER_STATE 환경변수를 설정해줘야 합니다. 이 변수들은 etcdctl member add 명령을 실행했을 때 결과로 출력되었습니다. 


또한 20-cloudinit.conf가 정의한 ETCD_DISCOVERY를 제거해줘야 ETCD_INITIAL_CLUSTER 값이 적용됩니다. ETCD_DISCOVERY는 ETCD_INITIAL_CLUSTER보다 우선순위가 높기 때문입니다.


저는 임시로 데몬을 생성하여 위와 같은 작업을 수행하도록 하였습니다. 아래의 내용대로 99-restore.conf 파일을 작성합니다. 그리고 데몬을 갱신하고 필요한 작업을 수행하고 etcd를 재시작합니다.


99-restore.conf (/run/systemd/system/etcd2.service.d/)

[Service]

ExecStartPre=/usr/bin/rm -rf /var/lib/etcd2/proxy

Environment="ETCD_NAME=instance4"

Environment="ETCD_DISCOVERY="

Environment="ETCD_INITIAL_CLUSTER=de53964f7e9b427aa198c613e1d59d0a=http://172.31.29.103:2380,..."

# If this option is set to existing, etcd will attempt to join the existing cluster.

Environment="ETCD_INITIAL_CLUSTER_STATE=existing"


$ sudo systemctl daemon-reload

$ sudo journalctl _PID=1 -e -u etcd2

$ sudo systemctl restart etcd2


참고로 EC2 인스턴스의 User Data를 수정해서 20-cloudinit.conf의 환경변수 자체를 변경하는 방법도 있습니다.


#cloud-config


hostname: etcd-node

coreos:

  etcd2:

    name: instance4

    advertise-client-urls: http://$private_ipv4:2379

    initial-advertise-peer-urls: http://$private_ipv4:2380

    listen-client-urls: http://0.0.0.0:2379

    listen-peer-urls: http://$private_ipv4:2380

    initial-cluster: de53964f7e9b427aa198c613e1d59d0a=http://172.31.29.103:2380,...

    initial-cluster-state: "existing"

  units:

    - name: etcd2.service

      command: start


등록된 멤버를 다시 확인합니다. 정상적으로 표시되는 것을 볼 수 있습니다.


$ etcdctl member list

713c502a7e25bd01: name=de53964f7e9b427aa198c613e1d59d0a peerURLs=http://172.31.29.103:2380 clientURLs=http://172.31.29.103:2379 isLeader=false

7cc9bfe3dc785752: name=8b32e59fd309452bb8e9caa1bec7b66f peerURLs=http://172.31.6.44:2380 clientURLs=http://172.31.6.44:2379 isLeader=false

c815853c77ea5901: name=instance4 peerURLs=http://172.31.22.9:2380 clientURLs=http://172.31.22.9:2379 isLeader=false

ef90985d6207ea94: name=9c1cba3901a8487e821539c8ef2a1ce8 peerURLs=http://172.31.6.43:2380 clientURLs=http://172.31.6.43:2379 isLeader=true


이제 restore 데몬은 필요없으므로 제거합니다.


$ sudo rm /run/systemd/system/etcd2.service.d/99-restore.conf

$ sudo systemctl daemon-reload





참고


'MicroService' 카테고리의 다른 글

Consul & Registrator  (0) 2016.10.05
CoreOS fleet unit 작성 및 실행  (0) 2016.08.12
CoreOS etcd 클러스터 구축하기  (0) 2016.08.11