Longhorn 기반 클라우드 네이티브 분산 스토리지의 리소스 구성 예제

Block Volume 설정 예시

블록 장치 모드로 동작하는 볼륨을 정의합니다. 이는 직접 블록 디바이스 접근을 허용하며, 컨테이너 내부에서 /dev 경로로 직접 사용 가능합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-block-volume
spec:
  accessModes:
    - ReadWriteOnce
  volumeMode: Block
  storageClassName: longhorn
  resources:
    requests:
      storage: 2Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: block-device-test
  namespace: default
spec:
  containers:
    - name: test-container
      image: nginx:stable-alpine
      imagePullPolicy: IfNotPresent
      volumeDevices:
        - devicePath: /dev/longhorn/blocktest
          name: block-claim
      ports:
        - containerPort: 80
  volumes:
    - name: block-claim
      persistentVolumeClaim:
        claimName: longhorn-block-volume

CSI 기반 지속적 볼륨 구성

Ceph와 유사한 방식으로, CSI 드라이버를 통해 외부 스토리지 시스템과 통합되는 구조입니다. 볼륨은 외부에서 사전 생성된 PV에 바인딩됩니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: longhorn-csi-pv
spec:
  capacity:
    storage: 2Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: longhorn
  csi:
    driver: driver.longhorn.io
    fsType: ext4
    volumeAttributes:
      numberOfReplicas: "3"
      staleReplicaTimeout: "2880"
    volumeHandle: existing-longhorn-volume
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: longhorn-csi-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  volumeName: longhorn-csi-pv
  storageClassName: longhorn
---
apiVersion: v1
kind: Pod
metadata:
  name: csi-volume-test
  namespace: default
spec:
  restartPolicy: Always
  containers:
    - name: app-container
      image: nginx:stable-alpine
      imagePullPolicy: IfNotPresent
      livenessProbe:
        exec:
          command:
            - ls
            - /data/lost+found
        initialDelaySeconds: 5
        periodSeconds: 5
        timeoutSeconds: 4
      volumeMounts:
        - name: data-volume
          mountPath: /data
  volumes:
    - name: data-volume
      persistentVolumeClaim:
        claimName: longhorn-csi-pvc

Deployment를 통한 데이터베이스 애플리케이션 배포

MySQL과 같은 상태 유지형 서비스를 배포할 때, 지속 가능한 저장소를 활용하여 데이터 손실을 방지합니다.

apiVersion: v1
kind: Service
metadata:
  name: mysql-service
  labels:
    app: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: mysql-data-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql-deployment
  labels:
    app: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      restartPolicy: Always
      containers:
        - name: mysql-server
          image: mysql:5.6
          env:
            - name: MYSQL_ROOT_PASSWORD
              value: "rancher"
          ports:
            - containerPort: 3306
              name: mysql
          volumeMounts:
            - name: mysql-storage
              mountPath: /var/lib/mysql
          livenessProbe:
            exec:
              command:
                - ls
                - /var/lib/mysql/lost+found
            initialDelaySeconds: 5
            periodSeconds: 5
            timeoutSeconds: 4
      volumes:
        - name: mysql-storage
          persistentVolumeClaim:
            claimName: mysql-data-pvc

간단한 볼륨 사용 패턴

기본적인 파드 및 볼륨 연결 예제입니다. 볼륨은 단순한 PVC로 선언되며, 컨테이너에 마운트됩니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: simple-pvc
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: longhorn
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
  name: simple-app-pod
  namespace: default
spec:
  restartPolicy: Always
  containers:
    - name: app
      image: nginx:stable-alpine
      imagePullPolicy: IfNotPresent
      volumeMounts:
        - name: data-mount
          mountPath: /data
      ports:
        - containerPort: 80
  volumes:
    - name: data-mount
      persistentVolumeClaim:
        claimName: simple-pvc

StatefulSet을 통한 고가용성 웹 서버 그룹 구성

상태 유지형 애플리케이션을 여러 인스턴스로 확장할 때, 각 인스턴스에 독립적인 스토리지를 제공합니다.

apiVersion: v1
kind: Service
metadata:
  name: web-svc
  labels:
    app: nginx
spec:
  ports:
    - port: 80
      name: http
  selector:
    app: nginx
  type: NodePort
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: nginx-statefulset
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "web-svc"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      restartPolicy: Always
      terminationGracePeriodSeconds: 10
      containers:
        - name: nginx-server
          image: k8s.gcr.io/nginx-slim:0.8
          ports:
            - containerPort: 80
              name: http
          volumeMounts:
            - name: html-data
              mountPath: /usr/share/nginx/html
          livenessProbe:
            exec:
              command:
                - ls
                - /usr/share/nginx/html/lost+found
            initialDelaySeconds: 5
            periodSeconds: 5
            timeoutSeconds: 4
      volumeClaimTemplates:
        - metadata:
            name: html-data
          spec:
            accessModes:
              - ReadWriteOnce
            storageClassName: longhorn
            resources:
              requests:
                storage: 1Gi

StorageClass 설정

동적 볼륨 프로비저닝을 활성화하기 위한 기본 클래스 정의입니다. 복제 수, 타임아웃, 백업 옵션 등을 포함합니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: longhorn
provisioner: driver.longhorn.io
allowVolumeExpansion: true
parameters:
  numberOfReplicas: "3"
  staleReplicaTimeout: "2880"
  fromBackup: ""
# diskSelector: "ssd,fast"
# nodeSelector: "storage,fast"
# fsType: "ext4"
# recurringJobs: '[
#   {
#     "name": "snapshot",
#     "task": "snapshot",
#     "cron": "*/1 * * * *",
#     "retain": 1
#   },
#   {
#     "name": "backup",
#     "task": "backup",
#     "cron": "*/2 * * * *",
#     "retain": 1,
#     "labels": {
#       "interval": "2m"
#     }
#   }
# ]'

백업 복원 작업 수행 (파일로 복구)

외부 저장소(예: S3)에서 백업된 데이터를 로컬 파일로 복원하는 작업을 수행합니다. 특수한 보안 권한과 함께 실행되어야 합니다.

apiVersion: v1
kind: Pod
metadata:
  name: restore-from-backup
  namespace: longhorn-system
spec:
  nodeName: 
  containers:
    - name: restore-job
      command:
        - /bin/sh
        - -c
        - longhorn backup restore-to-file ''
          --output-file '/tmp/restore/output.img'
          --output-format raw
      image: longhorn/longhorn-engine:v0.4.1
      imagePullPolicy: IfNotPresent
      securityContext:
        privileged: true
      volumeMounts:
        - name: output-dir
          mountPath: /tmp/restore
      env:
        - name: AWS_ACCESS_KEY_ID
          valueFrom:
            secretKeyRef:
              name: s3-credentials
              key: AWS_ACCESS_KEY_ID
        - name: AWS_SECRET_ACCESS_KEY
          valueFrom:
            secretKeyRef:
              name: s3-credentials
              key: AWS_SECRET_ACCESS_KEY
        - name: AWS_ENDPOINTS
          valueFrom:
            secretKeyRef:
              name: s3-credentials
              key: AWS_ENDPOINTS
  volumes:
    - name: output-dir
      hostPath:
        path: /tmp/restore
  restartPolicy: Never

참고: `ext4` 파일 시스템은 볼륨이 비정상적으로 분리되었을 경우 자동 재마운트를 지원합니다. 다른 파일 시스템은 해당 기능을 제공하지 않습니다.

태그: Longhorn kubernetes CSI StorageClass PersistentVolumeClaim

6월 26일 16:42에 게시됨