#2 Kubernetes Service와 이기종 분산 스토리지와의 연동하기

송창안
NAVER CLOUD PLATFORM
20 min readNov 6, 2019

--

​이번 회차에서는 ‘네이버 클라우드 플랫폼에서 Server 노드를 이용한 이기종 분산형 스토리지 구성 하는 방법’ 에 대해 알아보겠습니다.

Naver Cloud Platform 에서의 이기종 분산형 스토리지(GlusterFS) 구성도

​우선 이를 이해하기 위해, 이기종 분산형 스토리지(GlusterFS)에 대한

시나리오 구성에 대해 차근차근 알아보겠습니다.

0. 네이버 클라우드 플랫폼에서 서버 노드를 구성합니다. 서버 구성 후, 스토리지를 추가합니다.

(자세한 링크는 아래의 서버 생성 가이드를 참조 부탁드립니다.)

서버 생성 타입 UI (부팅디스크 크기 및 이미지 타입, OS 이미지파일 서버 타입)
서버 생성 타입 UI (서버 사양 타입과 서버 갯수 그리고 서버 이름)
생성 후 사양 및 IP 주소 확인
추가된 스토리지 확인
생성된 GlusterFS 관련 노드들 SSH 포트에 대한 포트 포워딩

아래는 전체 시스템 정보의 예시입니다.

사용자 분들이 구성하는 경우, 각 상황에 맞게 표를 만들어서 구성 하는 것을 추천드립니다.

또한, 자세한 네이버 클라우드 플랫폼의 서버 노드 구성 메뉴얼을 참조 부탁드립니다.

https://guide.ncloud-docs.com/docs/compute-compute-1-1-v2

※필수조건

Gluster node의 ACG 룰에 24007–24008에 대한 TCP 룰과 49152에서 부터 49156에 대한 TCP 룰을 추가 해야 합니다. 이는 Gluster node에 대한 방화벽 설정 부분입니다.

예를 들어, 사용하는 Gluster 노드의 brick이 5개가 있다면 49152 에서 49156로 열어 줘야 하며, 6개인 경우, 49152에서 49157로 기준으로 한개씩 더 포트를 추가해줘야 합니다.

1. putty를 통해, 각 노드로 ssh 접속을 시도합니다.

​아래의 링크 ‘리눅스 서버 접속 가이드’를 통해 좀 더 자세히 확인이 가능합니다.

2. 각 서버노드에 gluster repository를 구성합니다.

cat /etc/yum.repos.d/glusterfs.repo [gluster3.12] name = Gluster 3.12 baseurl = http://mirror.centos.org/centos/$releasever/storage/$basearch/gluster-3.12/ gpgcheck = 0 enabled = 1

3. glusterfs-server 패키지를 설치합니다.

yum install glusterfs-server -y

4. glusterd 서비스를 부팅 시 활성화 및 시작 그리고 상태를 확인합니다.

systemctl enable glusterd; systemctl start glusterd; systemctl status glusterd systemctl enable glusterd; systemctl start glusterd; systemctl status glusterd Created symlink from /etc/systemd/system/multi-user.target.wants/glusterd.service to /usr/lib/systemd/system/glusterd.service. ● glusterd.service — GlusterFS, a clustered file-system server Loaded: loaded (/usr/lib/systemd/system/glusterd.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2019–10–02 11:44:16 KST; 4ms ago Process: 3943 ExecStart=/usr/sbin/glusterd -p /var/run/glusterd.pid — log-level $LOG_LEVEL $GLUSTERD_OPTIONS (code=exited, status=0/SUCCESS) Main PID: 3944 (glusterd) CGroup: /system.slice/glusterd.service └─3944 /usr/sbin/glusterd -p /var/run/glusterd.pid — log-level INFO Oct 02 11:44:16 gluster-node-001 systemd[1]: Starting GlusterFS, a clustered file-….. Oct 02 11:44:16 gluster-node-001 systemd[1]: Started GlusterFS, a clustered file-s…r. Hint: Some lines were ellipsized, use -l to show in full.

5. 각각 서버노드에 추가한 물리 스토리지에 bricks가 사용할 base filesystem인 XFS를 구성합니다.

mkfs.xfs -i size=512 /dev/xvdb mkdir -p /bricks/brick1

6. 각각 서버노드에 위에서 구성한 bricks에 대해서 /etc/fstab에 추가합니다.

vi /etc/fstab … /dev/xvdb /bricks/brick1 xfs defaults 1 2 …

7. 각각 서버노드에 마운트를 합니다.

mount -a && mount … /dev/xvdb on /bricks/brick1 type xfs (rw,relatime,attr2,inode64,noquota) ..

8. 각각 서버노드에서 df를 통해 마운트 정보를 확인합니다.

df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda3 48G 2.7G 46G 6% / devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.7G 0 3.7G 0% /dev/shm tmpfs 3.7G 8.4M 3.7G 1% /run tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup tmpfs 757M 0 757M 0% /run/user/0 /dev/xvdb 50G 33M 50G 1% /bricks/brick

9. 각각 서버노드에 /etc/hosts에 gluster 관련 노드를 추가합니다.

cat /etc/hosts … 10.41.4.98 gluster01 10.41.82.227 gluster02 10.41.85.32 gluster03 10.41.165.122 gluster04 …

10. ​gluster-node-001 노드에서 ssh-keygen 수행후, 각 노드에 생성한 키를 복제합니다.

ssh-keygen ssh-copy-id gluster02 ssh-copy-id gluster03 ssh-copy-id gluster04

11. gluster-node-001 노드에서 gluster peer 관련 명령어를 통하여 pool를 구성합니다.

[root@gluster-node-001 ~]# gluster peer probe gluster02 peer probe: success. [root@gluster-node-001 ~]# gluster peer probe gluster03 peer probe: success. [root@gluster-node-001 ~]# gluster peer probe gluster04 peer probe: success.

12. gluster-node-001 노드에서 status를 확인합니다.

gluster peer status Number of Peers: 3 Hostname: gluster02 Uuid: 1a384ed4-c603–43ac-893d-ec27c61404a2 State: Peer in Cluster (Connected) Hostname: gluster03 Uuid: 61522c7f-3d38–4187-a25c-09940ad74267 State: Peer in Cluster (Connected) Hostname: gluster04 Uuid: 449ee492–2907–481a-8267–4e545c2fcac9 State: Peer in Cluster (Connected)

13. 각각 서버노드에서 여러 volume들을 테스트를 위해

임시적으로 각 노드의 bricks에 해당할 디렉토리를 생성 합니다.

mkdir /bricks/brick1/re2

14. 분산 2벌 복제 구성을 만들기 위해 아래와 같이 구성합니다.

gluster volume create ngs replica 2 gluster01:/bricks/brick1/re2 gluster02:/bricks/brick1/re2 gluster03:/bricks/brick1/re2 gluster04:/bricks/brick1/re2 Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/. Do you still want to continue? (y/n) y volume create: ngs: success: please start the volume to access data

15. volume 구성을 확인합니다.

#gluster volume info Volume Name: ngs Type: Distributed-Replicate Volume ID: 4250db23–0b5c-4d1c-8120-d0cdea3430c6 Status: Created Snapshot Count: 0 Number of Bricks: 2 x 2 = 4 Transport-type: tcp Bricks: Brick1: gluster01:/bricks/brick1/re2 Brick2: gluster02:/bricks/brick1/re2 Brick3: gluster03:/bricks/brick1/re2 Brick4: gluster04:/bricks/brick1/re2 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off

16. 해당 volume에 대해 시작을 수행 및 volume 상태를 확인합니다.

# gluster volume start ngs # gluster volume status Status of volume: ngs Gluster process TCP Port RDMA Port Online Pid — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — Brick gluster01:/bricks/brick1/re2 49152 0 Y 17535 Brick gluster02:/bricks/brick1/re2 49152 0 Y 16795 Brick gluster03:/bricks/brick1/re2 49152 0 Y 16784 Brick gluster04:/bricks/brick1/re2 49152 0 Y 17103 Self-heal Daemon on localhost N/A N/A Y 17556 Self-heal Daemon on gluster02 N/A N/A Y 16816 Self-heal Daemon on gluster03 N/A N/A Y 16805 Self-heal Daemon on gluster04 N/A N/A Y 17124 Task Status of Volume ngs — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — There are no active volume tasks

17.해당 볼륨에 대해서 gluster-node-004 에서 마운트를 테스트합니다.

# mount -t glusterfs gluster01:/ngs /test00 # df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda3 48G 2.0G 47G 4% / devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.7G 0 3.7G 0% /dev/shm tmpfs 3.7G 8.4M 3.7G 1% /run tmpfs 3.7G 0 3.7G 0% /sys/fs/cgroup tmpfs 757M 0 757M 0% /run/user/0 /dev/xvdb 50G 33M 50G 1% /bricks/brick1 gluster01:/ngs 100G 65M 100G 1% /test00

18. 중제자 복재 볼륨 구성을 만들기 위해 아래와 같이 구성합니다.

# gluster volume create ngsa replica 3 arbiter 1 gluster01:/bricks/brick1/ab gluster02:/bricks/brick1/ab gluster03:/bricks/brick1/ab volume create: ngsa: success: please start the volume to access data

19. 해당 volume에 대해 시작을 수행 및 volume 상태를 확인합니다.

# gluster volume start ngsa volume start: ngsa: success # gluster volume info Volume Name: ngs Type: Distributed-Replicate Volume ID: 4250db23–0b5c-4d1c-8120-d0cdea3430c6 Status: Started Snapshot Count: 0 Number of Bricks: 2 x 2 = 4 Transport-type: tcp Bricks: Brick1: gluster01:/bricks/brick1/re2 Brick2: gluster02:/bricks/brick1/re2 Brick3: gluster03:/bricks/brick1/re2 Brick4: gluster04:/bricks/brick1/re2 Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off Volume Name: ngsa Type: Replicate Volume ID: ce52a208-f5b8–4834–8eed-0b75393442b3 Status: Started Snapshot Count: 0 Number of Bricks: 1 x (2 + 1) = 3 Transport-type: tcp Bricks: Brick1: gluster01:/bricks/brick1/ab Brick2: gluster02:/bricks/brick1/ab Brick3: gluster03:/bricks/brick1/ab (arbiter) Options Reconfigured: transport.address-family: inet nfs.disable: on performance.client-io-threads: off

20. Kubernetes Service를 구성합니다. (아래의 링크를 참고해주세요)

https://blog.naver.com/casong99/221651334277

21. 각 Kubernetes Service 워커 노드로 SSH접속을 시도합니다.

각 워커 노드에는 아래와 같이 포트 포워딩을 통해 접속을 진행합니다.

// 예제에 3개의 워커노드를 생성 하였기 때문에, 3개의 워커 노드에 작업이 필요합니다.

22. root로 접속하여, 서버에서 선택한 GlusterFS 3.12 버전의 클라이언트를 설치합니다.

add-apt-repository ppa:gluster/glusterfs-3.12 apt-get update apt install glusterfs-client -y

23. 아래와 같이 /etc/hosts에 앞에서 구성한 GlusterFS 노드에 대한 정보를 추가합니다.

cat /etc/hosts …. 10.41.4.98 gluster01 10.41.82.227 gluster02 10.41.85.32 gluster03 10.41.165.122 gluster04

24. 패키지 설치 후, 각각 워커 노드의 ssh 연결을 통해 마운트 테스트를 진행합니다.

mount -t glusterfs gluster01:/ngsa /test0 umount /test0​

25. 관리 노드에서 Kubernetes 와 GlusterFS와 구성하기 위한 예제를 git을 통해 clone합니다.

git clone https://github.com/kubernetes/examples.git

Server 노드에 구성한 GlusterFS와 Kubernetes Service와의 연동 구조

Kubernetes 와 GlusterFS의 연동 설정에 대한 자세한 설명은 아래의 링크를 참조 부탁드립니다.

26. 위와 같이 GlusterFS Endpoint를 구성 하기 위해 아래와 같이 glusterfs-endpoints.json를 수정하여 적용합니다.

아래에 ip 요소에 앞에서 구성한 노드의 IP를 기입합니다.

kubectl — kubeconfig=$KUBE_CONFIG create -f examples/volumes/glusterfs/glusterfs-endpoints.json …. cat examples/volumes/glusterfs/glusterfs-endpoints.json { “kind”: “Endpoints”, “apiVersion”: “v1”, “metadata”: { “name”: “glusterfs-cluster” }, “subsets”: [ { “addresses”: [ { “ip”: “10.41.4.98” } ], “ports”: [ { “port”: 1 } ] }, { “addresses”: [ { “ip”: “10.41.82.227” } ], “ports”: [ { “port”: 1 } ] }, { “addresses”: [ { “ip”: “10.41.85.32” } ], “ports”: [ { “port”: 1 } ] }, { “addresses”: [ { “ip”: “10.41.165.122” } ], “ports”: [ { “port”: 1 } ] } ] }

27. glusterfs-service를 구성합니다.

kubectl — kubeconfig=$KUBE_CONFIG create -f examples/volumes/glusterfs/glusterfs-service.json cat examples/volumes/glusterfs/glusterfs-service.json { “kind”: “Service”, “apiVersion”: “v1”, “metadata”: { “name”: “glusterfs-cluster” }, “spec”: { “ports”: [ {“port”: 1} ] } }

28. GlusterFS와 Kubernetes Service 연동 테스트를 위한 glusterfs-pod를 구성합니다.

  • GlusterFS와 Kubernetes Service 연동 테스트는 중제자 복재 볼륨에 대해 구성하겠습니다.

kubectl — kubeconfig=$KUBE_CONFIG create -f examples/volumes/glusterfs/glusterfs-pod.json cat examples/volumes/glusterfs/glusterfs-pod.json { “apiVersion”: “v1”, “kind”: “Pod”, “metadata”: { “name”: “glusterfs” }, “spec”: { “containers”: [ { “name”: “glusterfs”, “image”: “nginx”, “volumeMounts”: [ { “mountPath”: “/mnt/glusterfs”, “name”: “glusterfsvol” } ] } ], “volumes”: [ { “name”: “glusterfsvol”, “glusterfs”: { “endpoints”: “glusterfs-cluster”, “path”: “ngsa”, “readOnly”: true } } ] } }

29. pod를 확인 후, 해당 pod의 mount 정보를 확인합니다.

kubectl — kubeconfig=$KUBE_CONFIG get pods kubectl — kubeconfig=$KUBE_CONFIG exec glusterfs — mount | grep gluster

글을 마무리하며…

지금까지 네이버 클라우드 플랫폼에서 Server 노드를 이용한 이기종 분산형 스토리지(GlusterFS) 구성을 하는 방법을 알아보았습니다.

총 2회차에 걸쳐서 GlusterFS의 개념부터 실습까지 모두 이해할 수 있는 시간이 되셨길 바라면서,

앞으로도 더욱 다양하고 유익한 콘텐츠로 찾아뵙는 네이버 클라우드 플랫폼이 되겠습니다.​

끝까지 읽어주셔서 감사합니다!

--

--

송창안
NAVER CLOUD PLATFORM

안녕하세요? Naver Cloud Platform Evangelist 송창안입니다. 복잡한 클라우드 기술을 여러분과 함께 확인 하며, 쉽게 풀어가보고 싶습니다.