Настройка классов локального хранилища в K3s
В K3s для автоматического выделения томов для контейнеров по умолчанию используется local-path-provisioner. Научим его работать с двумя типами хранилища: HDD и SSD.
Введение
K3s v1.26 поставляется с local-path-provisioner:v0.0.23, которая не умеет работать с более, чем одним путём хранения в одном приложении. Поэтому в первую очередь нужно обновить Local path provisioner.
Удаление старого Local path provisioner
Стандартные манифесты лежат в директории K3s сервера /var/lib/rancher/k3s/server/manifests/. При запуске сервера все манифесты перетираются. Манифест для Local path provisioner называется local-storage.yaml.
Удаляем старый provisioner:
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 добавляем флаг отключения:
ExecStart=/usr/local/bin/k3s \
server \
'--disable-cloud-controller' \
'--disable' \
'servicelb' \
'--disable' \
'traefik' \
'--disable' \
'local-storage' \
Установка и настройка новой версии Local path provisioner
Монтируем HDD том в каталог /var/lib/rancher/k3s/storage/hdd, а SSD том — в каталог /var/lib/rancher/k3s/storage/ssd.
Редактируем манифест — переименовываем стандартный класс, добавляем класс для SSD, меняем путь хранения по умолчанию, а также настраиваем доступные хранилища на каждой ноде:
--- /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"]
}
]
}
Применяем патч к старому манифесту:
patch -u local-storage.yaml local-storage.diff -o new-local-storage.yaml
Разворачиваем приложение:
kubectl apply -f ./new-local-storage.yaml
Использование
По умолчанию используется класс HDD. Класс SSD указывается явно.
Для volumeClaimTemplates:
volumeClaimTemplates:
- metadata:
name: data
spec:
storageClassName: local-path-ssd
accessModes:
- "ReadWriteOnce"
resources:
requests:
storage: "10Mi"
Для PersistentVolumeClaim:
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data
spec:
storageClassName: local-path-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: "10Mi"