Search

'etcd'에 해당되는 글 2건

  1. 2016.08.11 CoreOS etcd 클러스터 구축하기
  2. 2016.08.10 CoreOS etcd cluster 사이즈 변경하기

CoreOS etcd 클러스터 구축하기

MicroService 2016.08.11 22:11 Posted by 김한별 behonestar

오늘은 CoreOS cluster architecutres 문서에 기술된 Production cluster with central services를 구축해보려고 합니다. 



큰 규모의 서비스를 운영해야하는 경우 이 아키텍쳐를 사용하는 것이 좋습니다. 3~5개의 머신으로 etcd 클러스터를 별도로 구성하고 Worker 머신에는 etcd를 Proxy로 실행시키는 방식입니다. 그러면 Worker는 etcd proxy를 통해 Central Services의 etcd를 사용할 수 있습니다. etcd Proxy는 etcd 클러스터의 write 성능에 아무런 영향을 끼치지 않는다고 하네요.



Security Group 생성


Security Group을 하나 생성합니다. 저는 SSH 접속을 위해 22번 포트를 열었고, etcd 동작을 위해 2379,2380,4001,7001 포트를 열었습니다. 보안을 위해 Security Group을 사용하는 인스턴스들의 접근만 허용하였습니다.




Discovery token 생성


저는 etcd 머신 3개로 Central Services를 구축하려고 합니다. 브라우저에 https://discovery.etcd.io/new?size=3을 입력하면 token이 생성됩니다.




etcd 인스턴스 생성


이 곳에서 원하는 리전의 AMI를 선택하면 자동으로 EC2 인스턴스 생성 페이지로 리다이렉트됩니다.




t2.micro 인스턴스 타입을 선택하고 3단계(Configure Instance Details)로 넘어갑니다. Number of Instance에는 3을 입력하고 하단의 Advanced Detail를 누르면 보이는 User data에는 아래와 같이 입력합니다. discovery 필드에는 위에서 생성했던 token값을 입력합니다.


#cloud-config


coreos:

  etcd2:

    discovery: https://discovery.etcd.io/01c2a1176262ee319fc12b2403411ae2

    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

  fleet:

    metadata: "role=services"

  units:

    - name: etcd2.service

      command: start

    - name: fleet.service

      command: start


6단계(Configure Security Group)으로 넘어가서 'Select an existing security group'을 선택하고 위에서 생성했던 Security Group을 선택합니다. 이상이 없는지 마지막으로 검토 후 인스턴스를 생성합니다. 


인스턴스가 정상적으로 생성되면 SSH로 로그인 후 아래 명령어를 입력합니다. 3개의 member가 모두 표시되면 Central Services가 성공적으로 구성된 것입니다. Discovery token을 생성할 때 size=3을 입력했기 때문에 3개의 etcd 머신이 모두 활성화되어야만 bootstraping이 완료됩니다. 아직 생성이 완료되지 않은 인스턴스가 있다면 조금 더 기다려봅니다.


$ etcdctl cluster-health

member 1114b60d574a4daa is healthy: got healthy result from http://172.31.21.216:2379

member 8684e0306035e0ac is healthy: got healthy result from http://172.31.21.217:2379

member e9276cc3ae55e7e2 is healthy: got healthy result from http://172.31.21.218:2379

cluster is healthy



Worker 인스턴스 생성


위와 동일한 방법으로 인스턴스를 2개 더 생성합니다. 단, User Data는 아래와 같이 입력합니다. discovery 필드에는 위에서 생성했던 token값을 입력합니다. 


참고로 Discovery token을 생성할 때 설정한 size만큼의 etcd memeber가 모두 준비된 상태이면 etcd를 proxy로 설정하지 않더라도 이후의 etcd는 proxy로 동작합니다.


#cloud-config


coreos:

  etcd2:

    discovery: https://discovery.etcd.io/01c2a1176262ee319fc12b2403411ae2

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

  fleet:

    metadata: "role=worker"

    etcd_servers: "http://localhost:2379"

  locksmith:

    endpoint: "http://localhost:2379"

  units:

    - name: etcd2.service

      command: start

    - name: fleet.service

      command: start


인스턴스 생성이 완료되면 etcd proxy를 통해 central service에 접근이 가능한지 cluster-health 명령어를 입력해봅니다.


$ etcdctl cluster-health

member 1114b60d574a4daa is healthy: got healthy result from http://172.31.21.216:2379

member 8684e0306035e0ac is healthy: got healthy result from http://172.31.21.217:2379

member e9276cc3ae55e7e2 is healthy: got healthy result from http://172.31.21.218:2379

cluster is healthy


한 worker에서 key, value를 기록하고 다른 worker에서 읽어봅니다. 


core@ip-172-31-23-177 ~ $ etcdctl set /message Hello

Hello


core@ip-172-31-23-178 ~ $ etcdctl get /message

Hello


성공하셨다면 Service Discovery를 위한 아키텍쳐가 준비된 것입니다. fleet을 이용하여 worker가 실행될 때 자동으로 host, port를 etcd에 기록할 수 있습니다. 이 방법은 "Run a simple sidekick" 도큐먼트를 참고하세요.



참고


'MicroService' 카테고리의 다른 글

Consul & Registrator  (0) 2016.10.05
CoreOS fleet unit 작성 및 실행  (0) 2016.08.12
CoreOS etcd 클러스터 구축하기  (0) 2016.08.11
CoreOS etcd cluster 사이즈 변경하기  (0) 2016.08.10
TAG cluster, etcd

CoreOS etcd cluster 사이즈 변경하기

MicroService 2016.08.10 09:25 Posted by 김한별 behonestar

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
CoreOS etcd cluster 사이즈 변경하기  (0) 2016.08.10