Kubernetes 환경에서 GlusterFS 기반 StorageClass 구성 및 동적 프로비저닝 구현

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에서 공유하여 사용할 수 있게 됩니다.

태그: GlusterFS kubernetes Heketi StorageClass persistentvolume

8월 2일 05:07에 게시됨