Cloud

GlusterFS & Heketi on Rhel7 설치 1

naleejang 2021. 1. 13. 12:24

이번에는 쿠버네티스에서 필요한 퍼시스턴트 볼륨을 생성하기 위한 GlusterFS를 설치해 보고, GlusterFS의 RestAPI 서버 역할을 해 주는 Heketi 서버를 설치해 보고자 한다. 우선, 설치 순서는 아래와 같다.

 

1. VM 생성

  • GlusterFS용 VM 생성

  • Heketi API 서버용 VM 생성

2. VM 환경설정

  • 네트워크 설정

  • SSH keygen 설치 및 설정

  • 서브스크립션 등록 및 시스템 업데이트

3. GlusterFS 설치

  • GlusterFS 패키지 설치

  • GlusterFS 방화벽 설정

  • GlusterFS Peer 등록

4. Heketi API 서버 설치

  • Heketi 패키지 설치

  • Heketi SSH 인증키 생성 및 복사

  • Heketi와 GlusterFS 연동을 위한 환경설정 파일 생성

  • Heketi 서비스 시작

  • Heketi 서비스 토폴로지 생성 및 로딩

  • Heketi 서비스 테스트

5. 쿠버네티스와 GlusterFS 연동

  • 네트워크 연동 테스트

  • PV(Provision a Volume) 생성

  • PVC(Persistent Volume Claim) 생성

  • PVC를 사용한 Pod 생성 및 테스트

1. VM 생성

먼저 vm을 생성해야 한다. 나같은 경우는 KVM을 사용하여 vm을 생성했다. vm의 사양은 아래와 같다. 이렇게 작게 설정한것은 내 노트북에 자원이 없기도 하고, 테스트이기에 vm 사양을 작게 생성했다.

 

  • heketi 1대 - cpu 1 core / memory 2 GB / Disk 20 GB / NIC - NAT 1 / OS - rhel7.8
  • gluster server 3대 - cpu 1 core / memory 2 GB / Disk 20 GB / NIC - NAT 1 / OS - rehl7.8
  • data volume disk - gluster server당 10 GB 2개씩 - 총 6개

1) 먼저 virt-manager를 통해 create vm을 선택후 아래와 같이 CPU와 메모리 사양을 설정한다.

2) 디스크 사이즈는 기본으로 설정되어 있는 20 GB를 그대로 설정한다.

3) vm 이름은 식별하기 쉽게 입력하고, 네트워크는 인터넷 사용을 위해 NAT 네트워크로 설정한다. 

4) 이렇게 생성된 vm들은 아래와 같다. 

2. VM 환경설정

vm 생성이 완료되면 vm의 기본 환경설정을 해 주어야 한다. 여기서는 네트워크를 설정하고, ssh-keygen을 생성하여 패스워드 없이 ssh 접속을 할 수 있게 설정할 예정이다. 그리고, 패키지 설치를 위해 서브스크립션 등록을 한다.

2.1 네트워크 설정

heketi 서버를 비롯하여 모든 서버의 네트워크 설정을 한다. Rhel 7의 경우에는 네트워크 설정시 /etc/sysconfig/network-scripts 디렉토리 아래 ifcfg-eth0 파일에서 아래와 같이 설정할 수 있다. 여기서 DNS도 함께 설정해 주어야 인터넷이 가능하다.

# heketi 서버 네트워크 설정
[root@heketi ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.0.199
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1

# gfs-server1 네트워크 설정
[root@gfs-server1 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.0.200
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1

# gfs-server2 네트워크 설정
[root@gfs-server2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.0.201
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1

# gfs-server3 네트워크 설정
[root@gfs-server3 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.0.202
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
DNS1=192.168.0.1

2.2 SSH keygen 설치 및 설정

네트워크 설정이 끝나면 /etc/hosts에 각 노드의 IP와 호스트명을 등록해 준다. 그리고, ssh-keygen 명령어를 이용해 ssh key를 생성한다. 생성된 key는 ssh-copy-id 명령어를 이용해 다른 노드로 복사해 준다. 그러면, ssh 접속시 패스워드 없이 접속이 가능하다.

# /etc/hosts 파일에 호스트명 등록
[root@gfs-server1 ~]# echo "192.168.0.199 heketi" >> /etc/hosts
[root@gfs-server1 ~]# echo "192.168.0.200 gfs-server1" >> /etc/hosts
[root@gfs-server1 ~]# echo "192.168.0.201 gfs-server2" >> /etc/hosts
[root@gfs-server1 ~]# echo "192.168.0.202 gfs-server3" >> /etc/hosts

# ssh-keygen으로 키 생성
[root@gfs-server1 ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:RB9ppukKJ2cjeEs0GeQohwHthS+AlYoH+8SkgZNLiSA root@gfs-server1
The key's randomart image is:
+---[RSA 2048]----+
|E+o+.   . ..     |
|@==oo  . .+.     |
|=&oo.o  .=.      |
|*o* =  .o        |
| + + . .S        |
|  o * = .        |
|   o O o         |
|    . .          |
|                 |
+----[SHA256]-----+

# ssh-copy-id 명령어를 이용하여 다른 gluster 노드로 key 복사
[root@gfs-server1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@gfs-server2
[root@gfs-server1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@gfs-server3
[root@gfs-server1 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@heketi

2.3 서브스크립션 등록 및 시스템 업데이트

이번에는 패키지 설치를 위한 서브스크립션을 등록한다. glusterfs를 설치하기 위해 필요한 패키지 레파지토리는 rhel-7-server-rpms, rh-gluster-3-for-rhel-7-server-rpms, rh-gluster-3-nfs-for-rhel-7-server-rpms, rh-gluster-3-samba-for-rhel-7-server-rpms, rhel-ha-for-rhel-7-server-rpms 이다. 서브스크립션을 등록하고 필요한 패키지 레파지토리를 활성화하면 시스템을 업데이트하고 재부팅한다.

# heketi 및 gluster 전 노드에 서브스크립션 등록 및 시스템 업데이트
[root@gfs-server1 ~]# subscription-manager register
[root@gfs-server1 ~]# subscription-manager attach --pool=8a85f99a752e…
[root@gfs-server1 ~]# subscription-manager repos \
--enable=rhel-7-server-rpms \
--enable=rh-gluster-3-for-rhel-7-server-rpms \
--enable=rh-gluster-3-samba-for-rhel-7-server-rpms \
--enable=rh-gluster-3-nfs-for-rhel-7-server-rpms \
--enable=rhel-ha-for-rhel-7-server-rpms
[root@gfs-server1 ~]# yum update -y
[root@gfs-server1 ~]# reboot

3. GlusterFS 설치

glusterfs를 설치하기 위한 사전 준비가 완료되었다. 이제 glusterfs를 설치해보자. glusterfs를 설치하기 위해 매뉴얼도 살펴보고, centos에서는 어떻게 설치를 하지는 살펴보았다. 그런데, centos에서 설치되는 glusterfs 패키지명과 rhel7에서 제공하는 패키지 레파지토리를 통해 설치하는 패키지명을 달랐다. 

3.1 GlusterFS 패키지 설치

yum install 명렬어를 이용해 우선, gfs-server1에 redhat-storage-server 를 설치하고 systemctl 명령어를 이용해 glusterd 라는 서비스를 활성화하고 시작한다. 그리고, ssh를 통해 gfs-server2와 gfs-server3에도 패키지를 설치하고, 서비스를 활성화하고 시작한다.

# gfs-server1 에 glusterfs 패키지인 redhat-storage-server 설치 및 서비스 시작
[root@gfs-server1 ~]# yum install redhat-storage-server -y
[root@gfs-server1 ~]# systemctl enable glusterd.service
[root@gfs-server1 ~]# systemctl start glusterd

# ssh를 이용해 gfs-server2,3에 redhat-storage-server 설치 및 서비스 시작
[root@gfs-server1 ~]# for i in {2..3}; do \
ssh root@gfs-server$i yum install redhat-storage-server -y \
ssh root@gfs-server$i systemctl enable glusterd.service
ssh root@gfs-server$i systemctl start glusterd
done

3.2 GlusterFS 방화벽 설정

이번에는 glusterfs cluster 설정과 외부에서 glusterfs를 사용할 수 있도록 하기 위해 방화벽을 설정한다. glusterfs에서 오픈해 주어야 할 방화벽 포트는 상당히 많으므로 아래와 같이 쉘 스크립트를 작성하여 실행하면 효율적으로 방화벽에 포트를 추가할 수 있다. gfs-server1의 방화벽 설정이 끝나면 여기서 생성했던 쉘 스크립트를 복사하여 gfs-server2와 gfs-server3에 복사한 후 실행한다.

# 방화벽 설정을 위한 쉘 스크립트 작성 및 적용
[root@gfs-server1 ~]# cat set-firewall.sh 
#!/bin/bash

tcp_port="111 139 445 2049 4379 5667 662 32803 20048 875 2224 3121 21064 49152-49664"
udp_port="111 137-138 2049 662 32803 32769 20048 875 5404-5405"

for i in $tcp_port
do 
  firewall-cmd --add-port=$i/tcp
  firewall-cmd --add-port=$i/tcp --permanent
done

for i in $udp_port
do
  firewall-cmd --add-port=$i/udp
  firewall-cmd --add-port=$i/udp --permanent
done
[root@gfs-server1 ~]# sh set-firewall.sh

# gfs-server2,3에 작성한 쉘 스크립트 복사 및 실행
[root@gfs-server1 ~]# for i in {2..3}; do \
  scp set-firewall.sh root@gfs-server$i:~/ \
  ssh root@gfs-server$i sh set-firewall.sh \
done

3.3 GlusterFS Peer 등록

방화벽 포트 오픈이 끝나면 gfs-server1 에서 gfs-server2와 gfs-server3을 peer로 아래와 같이 등록한다. 그리고, gluster peer status 명령어를 이용하여 peer 상태를 확인할 수 있다.

# gfs-server1에서 gfs-server2, gfs-server3 peer 등록
[root@gfs-server1 ~]# gluster peer probe gfs-server2
Probe successful
[root@gfs-server1 ~]# gluster peer probe gfs-server3
Probe successful

# 등록한 peer 상태 확인
[root@gfs-server1 ~]# gluster peer status
Number of Peers: 2

Hostname: gfs-server2
Uuid: 2bc17aea-e256-4ae2-a100-eaba1c7b6efc
State: Peer in Cluster (Connected)

Hostname: gfs-server3
Uuid: afdfdf44-3999-4f3d-bb4d-6845f56f65a7
State: Peer in Cluster (Connected)

이렇게 해서 glusterfs 기본 설치를 진행하였다. 다음 포스팅에서는 이어서 heketi 서버를 설치하고, heketi 를 이용해 gluster 스토리지에서 사용할 볼륨을 등록해 보겠다.