LVM-operator#

LVM-operator — компонент, который позволяет взаимодействовать с пользовательскими ресурсами LVMCluster для развертывания и управления LVM-хранилищами в кластерах DropApp.

LVM-operator использует драйвер TopoLVM CSI Driver на внутреннем сервере для динамического создания физических томов LVM, групп томов и логических томов и привязывает их к PersistentVolumeClaim-ресурсам. Это позволяет приложениям, работающим в кластере, использовать логические тома LVM, поддерживаемые драйвером TopoLVM CSI Driver.

graph LR LVMOperator((LVMOperator))-->|Управляет| LVMCluster LVMOperator-->|Управляет| StorageClass StorageClass-->|Создает| PersistentVolumeA StorageClass-->|Создает| PersistentVolumeB PersistentVolumeA-->LV1 PersistentVolumeB-->LV2 LVMCluster-->|Состоит из|Disk1((Disk1)) LVMCluster-->|Состоит из|Disk2((Disk2)) LVMCluster-->|Состоит из|Disk3((Disk3)) subgraph Logical Volume Manager Disk1-->|Использует абстракцию|PV1 Disk2-->|Использует абстракцию|PV2 Disk3-->|Использует абстракцию|PV3 PV1-->VG PV2-->VG PV3-->VG LV1-->VG LV2-->VG end

Развертывание LVM-operator#

Предусловия#

  1. Убедитесь, что есть доступ к Kubernetes-кластеру.

  2. Убедитесь, что kubectl настроен и может взаимодействовать с кластером.

  3. Установите Prometheus.

Развертывание#

Для развертывания LVM-operator выполните шаги:

  1. Создайте namespace openshift-storage командой:

    kubectl create namespace openshift-storage
    
  2. Сгенерируйте сертификаты SSL командой:

    openssl genrsa -out ca.key 2048
    openssl req -x509 -new -key ca.key -days 3650 -out ca.crt
    openssl req -new -x509 -key ca.key -out webhook-server-cert.pem -days 365 -config openssl.cnf
    

    Пример используемого файла openssl.cnf (имя и содержание файла могут отличаться от приведенного в примере):

    openssl.cnf
    [req]
    default_bits = 2048
    default_md = sha256
    distinguished_name = req_distinguished_name
    x509_extensions = v3_req
    
    [req_distinguished_name]
    countryName = Country Name (2 letter code)
    countryName_default = US
    stateOrProvinceName = State or Province Name (full name)
    stateOrProvinceName_default = California
    localityName = Locality Name (eg, city)
    localityName_default = San Francisco
    organizationName = Organization Name (eg, company)
    organizationName_default = Example Corp
    organizationalUnitName = Organizational Unit Name (eg, section)
    organizationalUnitName_default = IT Department
    commonName = Common Name (e.g. server FQDN or YOUR name)
    commonName_default = lvms-webhook-service.openshift-storage.svc
    emailAddress = Email Address
    emailAddress_default = admin@example.com
    
    [v3_req]
    # Extensions to add to a certificate request
    # basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    extendedKeyUsage = critical, clientAuth, serverAuth
    subjectAltName = @alt_names
    
    [alt_names]
    DNS.1 = lvms-webhook-service.openshift-storage.svc
    DNS.2 = vg-manager-metrics-service.openshift-storage.svc
    
    [v3_ca]
    subjectKeyIdentifier = hash
    authorityKeyIdentifier = keyid,issuer:always
    basicConstraints = critical, CA:true
    keyUsage = critical, digitalSignature, cRLSign, keyCertSign
    
  3. Создайте три секрета kubernetes: lvms-operator-webhook-server-cert, lvms-operator-metrics-cert, vg-manager-metrics-cert командами:

    kubectl create secret tls lvms-operator-webhook-server-cert  --cert=webhook-server-cert.pem  --key=ca.key  -n openshift-storage
    kubectl create secret tls lvms-operator-metrics-cert  --cert=webhook-server-cert.pem  --key=ca.key  -n openshift-storage
    kubectl create secret tls vg-manager-metrics-cert --cert=webhook-server-cert.pem  --key=ca.key  -n openshift-storage
    
  4. Задайте PriorityClass:

    • openshift-user-critical для компонента K8SC;

    • dropapp-user-critical для компонента K8SU.

    Пример команды:

    kubectl apply -f - <<EOF 
    apiVersion: scheduling.k8s.io/v1 
    kind: PriorityClass 
    metadata: 
      name: openshift-user-critical 
    value: 1000000 
    globalDefault: false 
    description: "This priority class is for critical user applications." 
    EOF
    
  5. Создайте манифест deployment.yaml и и укажите в нем image и PriorityClassName:

    image: quay.io/lvms_dev/lvms-operator:latest
    ...
    priorityClassName: openshift-user-critical 
    
  6. Примените манифест:

    kubectl apply -f <path-to-deployment.yaml>
    
  7. После успешного завершения предыдущей команды переключите namespace на openshift-storage:

    kubectl config set-context --current --namespace=openshift-storage
    
  8. Откройте информацию о pods и дождитесь, когда все pods запустятся (статус Running):

    kubectl get pods -w
    
  9. После запуска всех pods создайте экземпляр пользовательского ресурса LVMCluster (customer resource CR):

    kubectl create -n openshift-storage -f <path-to-lvm_v1alpha1_lvmcluster.yaml>
    

    Пример манифеста:

    Пример lvm_v1alpha1_lvmcluster.yaml:
    apiVersion: lvm.topolvm.io/v1alpha1
    kind: LVMCluster
    metadata:
    name: my-lvmcluster
    spec:
    storage:
    deviceClasses:
    - name: vg1
        default: true
        thinPoolConfig:
        name: thin-pool-1
        sizePercent: 90
        overprovisionRatio: 10
        fstype: xfs
    
  10. После развертывания пользовательского ресурса выполнятся действия:

    • Создается группа томов Logical Volume Manager (LVM) с именем vg1, использующая все доступные диски в кластере.

    • В группе томов vg1 создается тонкий пул thin-pool-1 размером 90% от vg1;

    • Разворачивается плагин TopoLVM Container Storage Interface (CSI).

    • Создаются класс хранилища и класс моментальных снимков тома, оба с именем lvms-vg1. Это облегчает предоставление хранилища для рабочих нагрузок DropApp. Класс хранения настроен на режим привязки тома WaitForFirstConsumer, который используется в многоузловой конфигурации для оптимизации планирования размещения pods. Эта стратегия предусматривает приоритетное распределение pods на nodes с наибольшим количеством доступной емкости хранения.

    • Система LVMS создает два внутренних пользовательских ресурса для поддержки своей функциональности:

      • LVMVolumeGroup — создается и управляется LVMS для мониторинга отдельных групп томов на нескольких nodes кластера.

      • LVMVolumeGroupNodeStatus — создается Volume Group Manager. Этот пользовательский ресурс используется для мониторинга состояния групп томов на отдельных nodes кластера.

  11. Выполните команду:

    kubectl get lvmclusters.lvm.topolvm.io my-lvmcluster
    

    и дождитесь статуса Ready у LVMCluster:

    NAME            STATUS
    my-lvmcluster   Ready
    
  12. Выполните команду и дождитесь, когда все pods станут активны:

    kubectl get pods -w
    

После запуска всех pods, LVMS готов управлять логическими томами и делает их доступными для использования в приложениях.