Содержание

Настройка классов локального хранилища в K3s

В K3s для автоматического выделения томов для контейнеров по умолчанию используется local-path-provisioner. Научим его работать с двумя типами хранилища: HDD и SSD.

K3s v1.26 поставляется с local-path-provisioner:v0.0.23, которая не умеет работать с более, чем одним путём хранения в одном приложении. Поэтому в первую очередь нужно обновить Local path provisioner.

Стандартные манифесты лежат в директории K3s сервера /var/lib/rancher/k3s/server/manifests/. При запуске сервера все манифесты перетираются. Манифест для Local path provisioner называется local-storage.yaml.

Удаляем старый provisioner:

shell-session

kubectl delete -f /var/lib/rancher/k3s/server/manifests/local-storage.yaml
rm /var/lib/rancher/k3s/server/manifests/local-storage.yaml

Отключаем деплой стандартного Local path provisioner — в файл cat /etc/systemd/system/k3s.service добавляем флаг отключения:

cfg

ExecStart=/usr/local/bin/k3s \
    server \
        '--disable-cloud-controller' \
        '--disable' \
        'servicelb' \
        '--disable' \
        'traefik' \
        '--disable' \
        'local-storage' \

Монтируем HDD том в каталог /var/lib/rancher/k3s/storage/hdd, а SSD том — в каталог /var/lib/rancher/k3s/storage/ssd.

Редактируем манифест — переименовываем стандартный класс, добавляем класс для SSD, меняем путь хранения по умолчанию, а также настраиваем доступные хранилища на каждой ноде:

diff

--- /var/lib/rancher/k3s/server/manifests/local-storage.yaml 2023-01-01 00:00:00.000000000 +0000
+++ local-storage.yaml 2023-01-01 00:00:00.000000000 +0000
@@ -90,12 +90,27 @@
 apiVersion: storage.k8s.io/v1
 kind: StorageClass
 metadata:
-  name: local-path
+  name: local-path-hdd
   annotations:
     storageclass.kubernetes.io/is-default-class: "true"
+    defaultVolumeType: local
 provisioner: rancher.io/local-path
+parameters:
+  nodePath: /var/lib/rancher/k3s/storage/hdd
 volumeBindingMode: WaitForFirstConsumer
 reclaimPolicy: Delete
+---
+apiVersion: storage.k8s.io/v1
+kind: StorageClass
+metadata:
+  name: local-path-ssd
+  annotations:
+    defaultVolumeType: local
+provisioner: rancher.io/local-path
+parameters:
+  nodePath: /var/lib/rancher/k3s/storage/ssd
+volumeBindingMode: WaitForFirstConsumer
+reclaimPolicy: Delete
 ---
 apiVersion: storage.k8s.io/v1
 kind: StorageClass
@@ -108,7 +123,11 @@
       "nodePathMap":[
       {
         "node":"DEFAULT_PATH_FOR_NON_LISTED_NODES",
-        "paths":["/var/lib/rancher/k3s/storage"]
+        "paths":["/var/lib/rancher/k3s/storage/hdd"]
+      },
+      {
+        "node":"node1.example.com",
+        "paths":["/var/lib/rancher/k3s/storage/hdd", "/var/lib/rancher/k3s/storage/ssd"]
       }
       ]
     }

Применяем патч к старому манифесту:

shell-session

patch -u local-storage.yaml local-storage.diff -o new-local-storage.yaml

Разворачиваем приложение:

shell-session

kubectl apply -f ./new-local-storage.yaml

По умолчанию используется класс HDD. Класс SSD указывается явно.

Для volumeClaimTemplates:

yaml

volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      storageClassName: local-path-ssd
      accessModes:
        - "ReadWriteOnce"
      resources:
        requests:
          storage: "10Mi"

Для PersistentVolumeClaim:

yaml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: data
spec:
  storageClassName: local-path-ssd
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: "10Mi"
  1. K3s - Managing Packaged Components
  2. Local Path Provisioner