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` 파일 시스템은 볼륨이 비정상적으로 분리되었을 경우 자동 재마운트를 지원합니다. 다른 파일 시스템은 해당 기능을 제공하지 않습니다.