Kubernetes
March 24, 2023

Создать свой StorageClass и PVC с подом

В данной статье создадим кастомный SC на базе стандартного SC YC. Создадим под с PVC, в котором будет указан новый SC.

Поехали!

Создадим кастомный StorageClass и укажем политику по-умолчанию Retain.

cat <<EOF | kubectl apply -f -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: cam-hdd-retain
  namespace: default
  labels:
    sc: hdd-retain
  annotations:
    author: cameda
provisioner: disk-csi-driver.mks.ycloud.io
volumeBindingMode: WaitForFirstConsumer
parameters:
  type: network-hdd
  csi.storage.k8s.io/fstype: ext4
allowVolumeExpansion: false
reclaimPolicy: Retain
EOF
kubectl get sc
NAME                           PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
cam-hdd-retain                 disk-csi-driver.mks.ycloud.io   Retain          WaitForFirstConsumer   false                  7s
csi-s3                         ru.yandex.s3.csi                Delete          Immediate              false                  9d
local-path                     rancher.io/local-path           Delete          WaitForFirstConsumer   false                  20d
yc-network-hdd (default)       disk-csi-driver.mks.ycloud.io   Delete          WaitForFirstConsumer   true                   31d
yc-network-nvme                disk-csi-driver.mks.ycloud.io   Delete          WaitForFirstConsumer   true                   31d
yc-network-ssd                 disk-csi-driver.mks.ycloud.io   Delete          WaitForFirstConsumer   true                   31d
yc-network-ssd-nonreplicated   disk-csi-driver.mks.ycloud.io   Delete          WaitForFirstConsumer   true                   31d

Устанавливаем тип StorageClass cam-hdd-retain по-умолчанию:

kubectl patch storageclass cam-hdd-retain \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
kubectl patch storageclass yc-network-hdd \
-p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'

Создадим PVC и под.

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nginx
  namespace: default
  labels:
    pvc: nginx
  annotations:
    author: cameda
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 6Gi
EOF
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cameda-nginx
  namespace: default
  labels:
    app: nginx
    env: prod
  annotations:
    author: cameda
spec:
  containers:
  - name: cameda-nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: 300m
        memory: 300Mi
      limits:
        memory: 500Mi
    ports:
    - containerPort: 80
    - containerPort: 443
    livenessProbe:
      failureThreshold: 10
      successThreshold: 1
      httpGet:
        path: /
        port: 80
      periodSeconds: 10
      timeoutSeconds: 1
      initialDelaySeconds: 5
    readinessProbe:
      failureThreshold: 3
      successThreshold: 1
      exec:
        command:
        - curl
        - http://127.0.0.1:80
      periodSeconds: 10
      timeoutSeconds: 1
      initialDelaySeconds: 7
    volumeMounts:
    - name: cam-volume
      mountPath: /mnt/cameda
  restartPolicy: OnFailure
  volumes:
  - name: cam-volume
    persistentVolumeClaim:
      claimName: pvc-nginx
  securityContext:
    fsGroup: 1000
    runAsUser: 0
EOF
kubectl get po
NAME           READY   STATUS    RESTARTS        AGE
cameda-nginx   1/1     Running   0               46s