GlusterFS 개요 및 주요 아키텍처
GlusterFS는 여러 서버에 분산된 디스크 리소스를 단일 네임스페이스로 통합하여 관리하는 확장형 분산 파일 시스템입니다. 대규모 데이터 처리를 위해 설계되었으며, 높은 가용성과 확장성을 제공하는 것이 특징입니다.
- 확장성: 수 페타바이트(PB) 이상의 데이터와 수천 개의 클라이언트를 수용할 수 있습니다.
- 표준 인터페이스: POSIX 호환을 지원하며 NFS, SMB 등 표준 프로토콜을 통해 접근이 가능합니다.
- 고가용성: 복제(Replication) 및 자가 치유(Self-healing) 기능을 통해 노드 장애 시에도 데이터 연속성을 보장합니다.
- 유연성: 상용 하드웨어를 그대로 사용할 수 있으며, ext4나 XFS 같은 기존 파일 시스템 위에서 동작합니다.
주요 용어 정리
| 용어 | 설명 |
|---|---|
| Brick | 데이터 저장의 기본 단위로, 특정 서버의 특정 디렉토리를 의미합니다. |
| Volume | 여러 Brick의 논리적인 집합체입니다. |
| GFID | 파일 및 디렉토리에 부여되는 고유한 128비트 식별자(inode 역할)입니다. |
| Heketi | GlusterFS 볼륨의 수명 주기를 관리하는 RESTful API 계층입니다. |
GlusterFS 서버 클러스터 구축
실습 환경은 3개의 노드로 구성하며, 각 노드에는 GlusterFS 패키지가 설치되어 있어야 합니다.
# 필수 종속성 설치
yum install -y rpcbind psmisc attr
# GlusterFS 패키지 설치 (버전 7.x 기준)
yum install -y glusterfs glusterfs-libs glusterfs-server glusterfs-fuse glusterfs-cli
# 서비스 활성화 및 시작
systemctl enable --now glusterd glusterfsd
클러스터 구성을 위해 마스터 노드에서 다른 노드들을 피어로 추가합니다.
# 피어 추가 예시
gluster peer probe 10.10.20.101
gluster peer probe 10.10.20.102
# 클러스터 상태 확인
gluster pool list
Heketi를 이용한 동적 볼륨 관리
Heketi는 Kubernetes의 요청에 따라 GlusterFS 볼륨을 자동으로 생성하고 관리해 줍니다. SSH 방식으로 GlusterFS 노드를 제어하도록 설정합니다.
Heketi 설정 및 인증 구성
# SSH 키 생성 및 배포 (Heketi가 각 노드에 접근하기 위함)
ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ''
ssh-copy-id -i /etc/heketi/heketi_key.pub root@10.10.20.100
# /etc/heketi/heketi.json 주요 설정 예시
{
"port": "8080",
"use_auth": true,
"jwt": {
"admin": { "key": "AdminAuthPass" },
"user": { "key": "UserAuthPass" }
},
"glusterfs": {
"executor": "ssh",
"sshexec": {
"keyfile": "/etc/heketi/heketi_key",
"user": "root",
"port": "22",
"fstab": "/etc/fstab"
},
"db": "/var/lib/heketi/heketi.db"
}
}
토폴로지 구성 및 로드
GlusterFS 클러스터의 물리적 구조를 정의하는 JSON 파일을 생성하여 Heketi에 반영합니다.
{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": ["10.10.20.100"],
"storage": ["10.10.20.100"]
},
"zone": 1
},
"devices": ["/dev/sdb"]
}
]
}
]
}
# 토폴로지 데이터 로드
export HEKETI_CLI_SERVER=http://10.10.20.100:8080
heketi-cli -s $HEKETI_CLI_SERVER --user admin --secret 'AdminAuthPass' topology load --json=topology.json
Kubernetes StorageClass 및 PVC 적용
이제 Kubernetes에서 해당 스토리지를 동적으로 할당받을 수 있도록 StorageClass를 정의합니다.
1. StorageClass 생성
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: gfs-dynamic-sc
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://10.10.20.100:8080"
restauthenabled: "true"
restuser: "admin"
restuserkey: "AdminAuthPass"
volumetype: "replicate:3"
reclaimPolicy: Retain
allowVolumeExpansion: true
2. PersistentVolumeClaim(PVC) 요청
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: web-storage-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
storageClassName: gfs-dynamic-sc
3. 애플리케이션 연결 (Deployment)
생성된 PVC를 컨테이너 내부에 마운트하여 실제 서비스를 실행합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-gfs-deploy
spec:
replicas: 3
selector:
matchLabels:
app: web-server
template:
metadata:
labels:
app: web-server
spec:
containers:
- name: nginx-app
image: nginx:stable-alpine
volumeMounts:
- name: data-volume
mountPath: /usr/share/nginx/html
volumes:
- name: data-volume
persistentVolumeClaim:
claimName: web-storage-pvc
위 설정이 완료되면 Kubernetes는 Heketi API를 통해 GlusterFS 볼륨을 자동으로 생성하고, 생성된 볼륨은 정의된 모든 Pod에서 공유하여 사용할 수 있게 됩니다.