Настраиваем Dynamic Volume Provisioning в k8s с cephКак и обычно, все что можно поставить одной командой не описывают в мануалах. К сожалению просто настроить StorageClass для автоматизации - мало. Самая главная проблема заключается в том, что kube-controller-manager не включает в себя самой малости, ну, казалось бы, абсолютно лишней детали - бинарника rbd. Нет бинарника - контроллер уже никаким образом не может управлять внешними образами и контактировать с ceph. Замечу, что для автопровижена и последующего mount'a используются разные бинарники rbd. в случае создания образов - бинарник находится внутри контейнера, а в случае монтирования томов - это действие выполняет сама ОС ноды. и поставить туда их нужно также, правда здесь это можно сделать пакетным менеджером - пакет ceph-common.
Поэтому мы будем поднимать сторонний контроллер, в котором нужный бинарник присутствует. Все приведенные примеры актуальны для версии куда 1.9+ и могут быть несовместимы с ранними.
1. Создать права. Если вы используете RBAC, то для того чтобы наш сторонний контроллер получил доступ, нужно дать ему права. Можно дать существующие, но я предпочитаю создавать отдельное правило. Итак, создадим аккаунт rbd-provisioner и правило на его основе.
kubectl create serviceaccount --namespace kube-system rbd-provisioner
kubectl create clusterrolebinding rbd-provisioner-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:rbd-provisioner
2. Создать секреты для админа в kube-system и для attach-пользователя в конкретном ns. Здесь речь идет о пользователях ceph. Первый - пользователь с правами создания образов в пуле, второй - пользователь с правами монтирования образов к контейнерам. т.е. по замыслу первый - системный, его надо завести в пространстве kube-system, а второй - просто предоставляет право читать\писать данные из образа в контейнере. И этот серет должен быть в каждом пространстве, где вы хотите испольховать автопровижн. Это может на самом деле быть один и тот же пользователь - зависит от вашей паранои.
apiVersion: v1
data:
key: XXXXXXXXXXXXX
kind: Secret
metadata:
name: ceph-secret-real-admin
type: kubernetes.io/rbd
---
apiVersion: v1
data:
key: XXXXXXXXXXXXXX
kind: Secret
metadata:
name: ceph-secret
namespace: mkctf
type: kubernetes.io/rbd
3. Создаем StorageClass. Это как раз та самая штука, которая знает по каким правилам, кому, где и как создавать нужные образа. Что важно: имя - выбирать то, которое вы потом будете указывать в claim. т.е. в зависимоти от георасположения\скорости\ваших любых других идей вы в claim указываете именно тот StorageClass который отвечает вашим требованиям. второе - "provisioner:
ceph.com/rbd" это то имя, с которорым в апи авторизуется наш сторонний storage controller. Сменить его видимо только через компиляцию бинарника. Это я к вопросу о том, как связаны контейнер нашего стороннего контроллера и StorageClass.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: ceph
provisioner: ceph.com/rbd
parameters:
monitors: 10.10.0.21:6789,10.10.0.22:6789,10.10.0.23:6789
adminId: admin
adminSecretName: ceph-secret-real-admin
adminSecretNamespace: kube-system
pool: kubernetes
userId: kube
userSecretName: ceph-secret
imageFormat: "2"
imageFeatures: "layering"