Инструменты Trident#

Trident#

Trident - инструмент для автоматического управления предоставлением хранилища данных на основе NetApp. Он обеспечивает доступ к хранилищу данных через REST-API, к которому можно подключиться через интерфейс командной строки.

Предварительные условия#

Предварительные условия установки Trident:

  • права администратора кластера DropAPP;

  • возможность монтирования тома со всех рабочих узлов DropApp;

  • установлен kubectl.

Установка#

Для установки Trident выполните шаги:

  1. Загрузите и распакуйте Trident-operator.

    Для установки Trident-operator необходимо создать манифест, который описывает конфигурацию оператора. В манифесте нужно указать имя оператора, версию, настройки ресурсов и другие параметры. Ниже приведен пример манифеста для установки Trident-operator:

    apiVersion: dapp-trident-operator-template
    kind: OperatorGroup
    metadata:
    name: trident
    spec:
    targetNamespace: trident-system
    reconciliation: Periodic
    period: 1m
    
    operators:
    
    – name: trident.io/trident
    version: x.x.x
    

    Это создаст группу операторов Trident с именем Trident и настройкой периодической проверки ресурсов в целевой области Trident-system. Далее можно использовать оператор Trident для управления ресурсами в DropApp.

    Ниже представлен пример готового манифеста:

    Trident.yaml
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: trident
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: trident-operator
      namespace: trident
      labels:
        app: operator.trident.netapp.io
    ---
    # Source: trident-operator/templates/clusterrole.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      creationTimestamp: null
      name: trident-operator
      labels:
        app: operator.trident.netapp.io
    rules:
      # Permissions same as Trident
      - apiGroups:
          - ""
        resources:
          - namespaces
        verbs:
          - get
          - list
      - apiGroups:
          - ""
        resources:
          - persistentvolumes
          - persistentvolumeclaims
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - ""
        resources:
          - persistentvolumeclaims/status
        verbs:
          - update
          - patch
      - apiGroups:
          - storage.k8s.io
        resources:
          - storageclasses
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - ""
        resources:
          - events
        verbs:
          - get
          - list
          - watch
          - create
          - update
          - patch
      - apiGroups:
          - ""
        resources:
          - secrets
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - ""
        resources:
          - resourcequotas
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - ""
        resources:
          - pods
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - ""
        resources:
          - pods/log
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - nodes
        verbs:
          - get
          - list
          - watch
          - update
      - apiGroups:
          - storage.k8s.io
        resources:
          - volumeattachments
        verbs:
          - get
          - list
          - watch
          - update
          - patch
      - apiGroups:
          - storage.k8s.io
        resources:
          - volumeattachments/status
        verbs:
          - update
          - patch
      - apiGroups:
          - snapshot.storage.k8s.io
        resources:
          - volumesnapshots
          - volumesnapshotclasses
        verbs:
          - get
          - list
          - watch
          - update
          - patch
      - apiGroups:
          - snapshot.storage.k8s.io
        resources:
          - volumesnapshots/status
          - volumesnapshotcontents/status
        verbs:
          - update
          - patch
      - apiGroups:
          - snapshot.storage.k8s.io
        resources:
          - volumesnapshotcontents
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - csi.storage.k8s.io
        resources:
          - csidrivers
          - csinodeinfos
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - storage.k8s.io
        resources:
          - csidrivers
          - csinodes
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - apiextensions.k8s.io
        resources:
          - customresourcedefinitions
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - trident.netapp.io
        resources:
          - tridentversions
          - tridentbackends
          - tridentstorageclasses
          - tridentvolumes
          - tridentvolumepublications
          - tridentvolumereferences
          - tridentnodes
          - tridenttransactions
          - tridentsnapshots
          - tridentbackendconfigs
          - tridentbackendconfigs/status
          - tridentmirrorrelationships
          - tridentmirrorrelationships/status
          - tridentsnapshotinfos
          - tridentsnapshotinfos/status
          - tridentprovisioners # Required for Tprov
          - tridentprovisioners/status # Required to update Tprov's status section
          - tridentorchestrators # Required for torc
          - tridentorchestrators/status # Required to update torc's status section
        verbs:
          - get
          - list
          - watch
          - create
          - delete
          - update
          - patch
      - apiGroups:
          - policy
        resources:
          - podsecuritypolicies
        verbs:
          - use
        resourceNames:
          - tridentpods
      # Now Operator specific permissions
      - apiGroups:
          - ""
        resources:
          - namespaces
        verbs:
          - create
          - patch
      - apiGroups:
          - apps
        resources:
          - deployments
          - daemonsets
          - statefulsets
        verbs:
          - get
          - list
          - watch
          - create
      - apiGroups:
          - apps
        resources:
          - deployments
          - daemonsets
          - statefulsets
        verbs:
          - delete
          - update
          - patch
        resourceNames:
          - trident-csi
          - trident-csi-windows
          - trident
      - apiGroups:
          - ""
        resources:
          - pods/exec
          - services
          - serviceaccounts
        verbs:
          - get
          - list
          - create
      - apiGroups:
          - ""
        resources:
          - pods/exec
          - services
        verbs:
          - delete
          - update
          - patch
        resourceNames:
          - trident-csi
          - trident
      - apiGroups:
          - ""
        resources:
          - serviceaccounts
        verbs:
          - delete
          - update
          - patch
        resourceNames:
          - trident-controller
          - trident-node-linux
          - trident-node-windows
          - trident-csi
          - trident
      - apiGroups:
          - authorization.openshift.io
          - rbac.authorization.k8s.io
        resources:
          - clusterroles
          - clusterrolebindings
        verbs:
          - list
          - create
      - apiGroups:
          - authorization.openshift.io
          - rbac.authorization.k8s.io
        resources:
          - clusterroles
          - clusterrolebindings
        verbs:
          - delete
          - update
          - patch
        resourceNames:
          - trident-controller
          - trident-node-linux
          - trident-node-windows
          - trident-csi
          - trident
      - apiGroups:
          - policy
        resources:
          - podsecuritypolicies
        verbs:
          - list
          - create
      - apiGroups:
          - policy
        resources:
          - podsecuritypolicies
        resourceNames:
          - tridentpods
        verbs:
          - delete
          - update
          - patch
      - apiGroups:
          - security.openshift.io
        resources:
          - securitycontextconstraints
        verbs:
          - get
          - list
          - create
      - apiGroups:
          - security.openshift.io
        resources:
          - securitycontextconstraints
        resourceNames:
          - trident-controller
          - trident-node-linux
          - trident-node-windows
          - trident
        verbs:
          - delete
          - update
          - patch
      - apiGroups:
          - policy
        resources:
          - podsecuritypolicies
        verbs:
          - use
        resourceNames:
          - tridentoperatorpods
    ---
    # Source: trident-operator/templates/clusterrolebinding.yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: trident-operator
      labels:
        app: operator.trident.netapp.io
    subjects:
      - kind: ServiceAccount
        name: trident-operator
        namespace: trident
    roleRef:
      kind: ClusterRole
      name: trident-operator
      apiGroup: rbac.authorization.k8s.io
    ---
    # Source: trident-operator/templates/deployment.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: operator.trident.netapp.io
      name: trident-operator
      namespace: trident
    spec:
      replicas: 1
      strategy:
        type: Recreate
      selector:
        matchLabels:
          app: operator.trident.netapp.io
          name: trident-operator
      template:
        metadata:
          labels:
            app: operator.trident.netapp.io
            name: trident-operator
        spec:
          nodeSelector:
            kubernetes.io/arch: amd64
            kubernetes.io/os: linux
          serviceAccountName: trident-operator
          containers:
          - command:
            - /trident-operator
            - --debug=false
            env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: OPERATOR_NAME
              value: trident-operator
            image: dappregistry/1.2/trident-operator:22.10.0
            imagePullPolicy: IfNotPresent
            name: trident-operator
    
  2. Настройте серверную часть временного хранилища, которую установщик Trident будет использовать один раз для подготовки тома для хранения собственных метаданных.

    Поместите файл backend.json в каталог установки setup:

    cp sample-input/<backend template>.json setup/backend.json
    vi setup/backend.json
    

    Примеры файлов конфигурации для различных типов backend можно найти в sample-input каталоге.

  3. Выполните проверку возможности установки Trident:

    # ./tridentctl install --dry-run -n trident
    INFO Starting storage driver.                backend=setup/backend.json
    INFO Storage driver loaded.                  driver=ontap-nas
    INFO Dry run completed, no problems found.
    

    Флаг --dry-run позволяет выполнить проверку текущей среды и убедиться что Trident установится успешно без внесения изменений в среду.

    Флаг -n указывает namespace, в которое будет установлен Trident.

  4. Запустите установщик Trident:

    #./tridentctl install -n trident
    INFO Starting storage driver.                backend=setup/backend.json
    INFO Storage driver loaded.                  driver=ontap-nas
    INFO Starting Trident installation.          namespace=trident
    INFO Created service account.
    INFO Created cluster role.
    INFO Created cluster role binding.
    INFO Created PVC.
    INFO Created PV.                             pv=trident
    INFO Waiting for PVC to be bound.            pvc=trident
    INFO Created Trident deployment.
    INFO Waiting for Trident pod to start.
    INFO Trident pod started.                    namespace=trident pod=trident-7d5d659bd7-tzth6
    INFO Trident installation succeeded.
    
  5. Проверьте результат установки:

    kubectl get pod -n trident
    

    Вывод будет следующим:

    NAME                       READY     STATUS    RESTARTS   AGE
    trident-7d5d659bd7-tzth6   2/2       Running   1          14s
    
    # ./tridentctl -n trident version
    +----------------+----------------+
    | SERVER VERSION | CLIENT VERSION |
    +----------------+----------------+
    | v22.10.0       | v22.10.0         |
    +----------------+----------------+
    
  6. Создайте внутреннюю конфигурацию хранилища, из которой Trident будет выделять тома:

    ./tridentctl -n trident create backend -f setup/backend.json
    +-----------------------+----------------+--------+---------+
    |         NAME          | STORAGE DRIVER | ONLINE | VOLUMES |
    +-----------------------+----------------+--------+---------+
    | ontapnas_10.0.0.1     | ontap-nas      | true   |       0 |
    +-----------------------+----------------+--------+---------+
    
  7. Создайте класс хранения

    ./tridentctl -n trident get backend
    +-----------------------+----------------+--------+---------+
    |         NAME          | STORAGE DRIVER | ONLINE | VOLUMES |
    +-----------------------+----------------+--------+---------+
    | ontapnas_10.0.0.1     | ontap-nas      | true   |       0 |
    +-----------------------+----------------+--------+---------+
    
    cp sample-input/storage-class-basic.yaml.templ sample-input/storage-class-basic.yaml
    vi sample-input/storage-class-basic.yaml
    

    Класс хранилища в данном сценарии основан на sample-input/storage-class-basic.yaml.templ, который поставляется с установщиком, заменив __BACKEND_TYPE__ именем драйвера хранилища.

  8. Используйте kubectl для создания хранилища как объекта DropApp:

    kubectl create -f sample-input/storage-class-basic.yaml
    
  9. Проверьте базовый класс хранилища:

    kubectl get sc basic
    NAME      PROVISIONER
    basic     netapp.io/trident
    
    ./tridentctl -n trident get storageclass basic -o json
    {
      "items": [
        {
          "Config": {
            "version": "1",
            "name": "basic",
            "attributes": {
              "backendType": "ontap-nas"
            }
          },
          "storage": {
            "ontapnas_10.0.0.1": [
              "aggr1",
              "aggr2",
              "aggr3",
              "aggr4"
            ]
          }
        }
      ]
    }
    
  10. Создайте манифест постоянного тома для использования созданного класса хранилища sample-input/pvc-basic.yaml

  11. Убедитесь, что имя класса соответствует созданному в шаге 6:

    kubectl create -f sample-input/pvc-basic.yaml
    # Аргумент '-aw' позволяет наблюдать за процессом подготовки постоянного хранилища
    kubectl get pvc -aw
    NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    basic     Pending                                       basic          1s
    basic     Pending   default-basic-6cb59   0                   basic     5s
    basic     Bound     default-basic-6cb59   1Gi       RWO       basic     5s
    
  12. Смонтируйте том в pod:

    cat << EOF > task-pv-pod.yaml
    kind: Pod
    apiVersion: v1
    metadata:
      name: task-pv-pod
    spec:
      volumes:
        - name: task-pv-storage
          persistentVolumeClaim:
          claimName: basic
      containers:
        - name: task-pv-container
          image: nginx
          ports:
            - containerPort: 80
              name: "HTTP-server"
          volumeMounts:
            - mountPath: "/usr/share/nginx/html"
              name: task-pv-storage
    EOF
    kubectl create -f task-pv-pod.yaml
    
  13. Убедитесь, что pod запустился:

    kubectl get pod -aw
    
  14. Убедитесь, что pod смонтирован в папке /usr/share/nginx/html:

    kubectl exec -it task-pv-pod -- df -h /usr/share/nginx/html
    Filesystem                                      Size  Used Avail Use% Mounted on
    <IP-address>:/trident_demo_default_basic_6cb59  973M  192K  973M   1% /usr/share/nginx/html
    
  15. Удалите pod:

    kubectl delete pod task-pv-pod
    

    На данном шаге удален только pod, том продолжает существовать и может быть использован другими pods.

  16. Удалите том выполнив команду:

    kubectl delete pvc basic
    

Trident-operator#

Trident-operator - оператор DropApp, который используется для управления динамическим предоставлением и управления хранилищем данных. Оператор обеспечивает автоматическое создание и удаление хранилища данных в DropApp, управление и распределение данных между узлами кластера.

Данный раздел содержит шаги необходимые для начала работы с Trident Operator для установки и управления Trident.

Предварительные условия для установки Trident-operator#

Предварительные условия для установки Trident Operator:

  • получены права администратора кластера DropAPP;

  • разрешено монтирование тома со всех рабочих узлов DropApp;

  • установлен kubectl.

Установка Trident-operator#

Установите установочный пакет Trident из репозитория:

wget https://<repo>/v22.10.0 /trident-installer-22.10.0.tar.gz 
# Путь указан в качестве примера
tar -xf trident-installer-20.04.0.tar.gz
cd trident-installer