Kubernetes – local-storage

By | 2022년 10월 31일
Table of Content

Kubernetes – local-storage

우선 여기 를 참조하여,
local-storage 에 어떤 제약사항이 있고,
회피하기 위해서는 어떤 조치를 취해야 하는지 확인해야 합니다.

아래 내용은 데이타를 저장하기 위한 용도로 local-storage 를 사용했고,
제약사항을 회피하기 위해,
각 node 에 각각 하나의 PV 를 생성하고,
또 node 에 Pod 도 하나씩만 생성되도록 하는 설정입니다.

StorageClass 생성

StorageClass 에는 namespace 를 지정할 수 없다.

vi local-storage-class.yaml
---------------------------
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---------------------------
kubectl create -f local-storage-class.yaml

디렉토리 생성

모든 노드에 동일한 디렉토리를 생성해야 한다.

sudo mkdir -p /data/my-app

# docker image 상의 계정 user/group 이 필요하다.
# ex : 472:472 for grafana
# sudo chown -R 유저:그룹 /data/my-app
# chmod 755 /data/my-app

chmod 777 /data/my-app

PV 생성

PV 를 여러개 생성해야 하면,
my-app-pv-0, my-app-pv-1, my-app-pv-2 … 로 만들어줍니다.

claimRef 는 {volumeClaimTemplate 이름}-{statefulset 이름}-숫자 형식입니다.

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-app-pv-0
  namespace: my-app
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  claimRef:
    name: myappvol-my-app-0
    namespace: my-app
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/my-app          # 호스트 폴더경로
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - mynode-0            # 노드 이름(hostname, 소문자로 입력)

---

apiVersion: v1
kind: PersistentVolume
metadata:
  name: my-app-pv-1
  namespace: my-app
spec:
  capacity:
    storage: 5Gi
  accessModes:
  - ReadWriteOnce
  claimRef:
    name: myappvol-my-app-1
    namespace: my-app
  persistentVolumeReclaimPolicy: Retain
  storageClassName: local-storage
  local:
    path: /data/my-app          # 호스트 폴더경로
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - mynode-1            # 노드 이름(hostname, 소문자로 입력)

StatefulSet 생성

volumeClaimTemplates 에 의해,
myappvol-my-app-0, myappvol-my-app-1 형식의 PVC 를 자동으로 생성합니다.

replicas 갯수 이상의 PV 를 미리 만들어 두어야 합니다.
부족한 경우 pending 이 됩니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-app                ## Statefulset 이름
  namespace: my-app
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
      - name: nginx
        image: k8s.gcr.io/nginx-slim:0.8
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: myappvol
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: myappvol          # volumeClaimTemplate 이름
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: local-storage
      resources:
        requests:
          storage: 100Gi

Headless Service

만약 외부에 서버를 오픈해야 한다면,
아이피 대신 도메인을 이용해 접근하도록 변경해 주어야 한다.

각각의 Pod 에 각각 다른 데이타가 저장되므로,
특정서버로 접속해야 하기 때문이다.

답글 남기기