Ручная установка компонентов, не установленных с помощью Dactl#

Установка Apiserver-network-proxy#

Для установки Apiserver-network-proxy выполните следующие шаги:

  1. Создайте Deployment для Apiserver-network-proxy. Пример YAML-файла для Deployment:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: apiserver-network-proxy
    spec:
      selector:
        matchLabels:
          app: apiserver-network-proxy
      replicas: 1
      template:
        metadata:
          labels:
            app: apiserver-network-proxy
        spec:
          containers:
          - name: apiserver-network-proxy
            image: quay.io/coreos/apiserver-network-proxy:v0.0.1
            ports:
            - containerPort: 443
            env:
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: POD_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: SERVICE_CERTIFICATE_FILE
              value: "/etc/certs/tls.crt"
            - name: SERVICE_KEY_FILE
              value: "/etc/certs/tls.key"
            volumeMounts:
            - mountPath: /etc/certs
              name: tls-certs
          volumes:
          - name: tls-certs
            secret:
              secretName: apiserver-network-proxy-tls
    

    В этом примере предполагается, что уже есть секрет с именем apiserver-network-proxy-tls, который содержит сертификаты и ключи для TLS. Если нет, необходимо создать его перед шагом 1.

  2. Примените Deployment с помощью команды:

    kubectl apply -f deployment.yaml
    

Установка CSI-external-attacher#

Для развертывания CSI-external-attacher выполните следующие шаги:

  1. Создайте новую учетную запись службы и предоставьте ей права для запуска CSI-external-attacher.

  2. Разверните CSI-external-attacher:

    kubectl create deploy/CSI-external-attacher.yaml
    

Вышеприведенная команда – для создания развертывания в DropApp. В данном случае, команда создает deployment, который запускает контейнер с драйвером DropApp.

CSI-external-attacher может работать в одном pod с другими внешними контроллерами CSI, такими как CSI-external-provisioner, CSI-external-snapshotter и CSI-external-resizer.

Установка CSI-external-resizer#

Для развертывания CSI-external-resizer выполните следующие шаги:

  1. Создайте новую учетную запись службы и предоставьте ей права для запуска CSI-external-resizer.

  2. Разверните CSI-external-resizer:

    kubectl create deploy/CSI-external-resizert.yaml
    

    Содержание манифеста будет следующим:

    CSI-external-resizer.yaml
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: csi-resizer
    spec:
      replicas: 1
      selector:
        matchLabels:
          external-resizer: mock-driver
      template:
        metadata:
          labels:
            external-resizer: mock-driver
        spec:
          serviceAccount: csi-resizer
          containers:
            - name: csi-resizer
              image: dappregistry/1.2/csi-resizer
              args:
                - "--v=5"
                - "--csi-address=$(ADDRESS)"
                - "--leader-election"
                - "--http-endpoint=:8080"
              env:
                - name: ADDRESS
                  value: /var/lib/csi/sockets/pluginproxy/mock.socket
              imagePullPolicy: "IfNotPresent"
              ports:
                - containerPort: 8080
                  name: http-endpoint
                  protocol: TCP
              livenessProbe:
                failureThreshold: 1
                httpGet:
                  path: /healthz/leader-election
                  port: http-endpoint
                initialDelaySeconds: 10
                timeoutSeconds: 10
                periodSeconds: 20
              volumeMounts:
                - name: socket-dir
                  mountPath: /var/lib/csi/sockets/pluginproxy/
    
            - name: mock-driver
             image: quay.io/k8scsi/mock-driver:canary
              imagePullPolicy: "IfNotPresent"
             env:
                - name: CSI_ENDPOINT
                  value: /var/lib/csi/sockets/pluginproxy/mock.socket
              volumeMounts:
                - name: socket-dir
                  mountPath: /var/lib/csi/sockets/pluginproxy/
    
          volumes:
            - name: socket-dir
              emptyDir:
    

Вышеприведенная команда – для создания deployment в DropApp. Deployment - это объект DropApp, который представляет собой развертывание приложения на нескольких nodes. В этом случае Deployment используется для развертывания драйвера DropApp на нескольких nodes кластера.

CSI-external-resizer может работать в одном pod с другими внешними контроллерами CSI, такими как CSI-external-attacher, CSI-external-snapshotter и/или CSI-external-provisioner.

Установка CSI-external-snapshotter#

Для развертывания CSI-external-snapshotter выполните следующие шаги:

  1. Создайте новую учетную запись службы и предоставьте ей права для запуска CSI-external-snapshotter.

  2. Разверните CSI-external-snapshotter:

    kubectl create deploy/CSI-external-snapshotter.yaml
    

    Содержание манифеста будет следующим:

    CSI-external-snapshotter.yaml
    kind: StatefulSet
    apiVersion: apps/v1
    metadata:
      name: csi-snapshotter
    spec:
      serviceName: "csi-snapshotter"
      replicas: 1
      selector:
        matchLabels:
          app: csi-snapshotter
      template:
        metadata:
          labels:
            app: csi-snapshotter
        spec:
          serviceAccount: csi-snapshotter
          containers:
            - name: csi-provisioner
              image: dappregistry/csi-provisioner
              args:
                - "--v=5"
                - "--csi-address=$(ADDRESS)"
              env:
                - name: ADDRESS
                  value: /csi/csi.sock
              imagePullPolicy: IfNotPresent
              volumeMounts:
                - name: socket-dir
                  mountPath: /csi
            - name: csi-snapshotter
              image: dappregistry/csi-snapshotter
              args:
                - "--v=5"
                - "--csi-address=$(ADDRESS)"
                - "--leader-election=false"
              env:
                - name: ADDRESS
                  value: /csi/csi.sock
              imagePullPolicy: IfNotPresent
              volumeMounts:
                - name: socket-dir
                  mountPath: /csi
            - name: hostpath
              image: k8s.gcr.io/sig-storage/hostpathplugin
              args:
                - "--drivername=hostpath.csi.k8s.io"
                - "--v=5"
                - "--endpoint=$(CSI_ENDPOINT)"
                - "--nodeid=$(KUBE_NODE_NAME)"
              env:
                - name: CSI_ENDPOINT
                  value: unix:///csi/csi.sock
                - name: KUBE_NODE_NAME
                  valueFrom:
                    fieldRef:
                      apiVersion: v1
                      fieldPath: spec.nodeName
              imagePullPolicy: IfNotPresent
              securityContext:
                privileged: true
              volumeMounts:
                - name: socket-dir
                  mountPath: /csi
          volumes:
            - name: socket-dir
              emptyDir:
    

Вышеприведенная команда - для создания StatefulSet в DropApp.

Установка CSI-node-driver-registrar#

Для регистрации CSI Driver выполните следующие шаги:

  1. Получите доступ к сокету драйвера CSI (путь: /var/lib/kubelet/plugins/<drivername.example.com>/).

  2. Получите доступ к регистрационному сокету (путь: /var/lib/kubelet/plugins_registry/). Убедитесь, что плагин для регистрации доступен на хосте, на котором запущен DropApp. Обычно это можно проверить, выполнив команду kubectl get pods -n kube-system. Если виден pod с именем etcd-<host_name>, то плагин доступен.

  3. Проверьте работоспособность CSI-node-driver-registrar:

      containers:
        - name: csi-driver-registrar
          image: dappregistry/sig-storage/csi-node-driver-registrar
          args:
            - "--v=5"
            - "--csi-address=/csi/csi.sock"
            - "--kubelet-registration-path=/var/lib/kubelet/plugins/<drivername.example.com>/csi.sock"
          livenessProbe:
            exec:
              command:
              - /csi-node-driver-registrar
              - --kubelet-registration-path=/var/lib/kubelet/plugins/<drivername.example.com>/csi.sock
              - --mode=kubelet-registration-probe
            initialDelaySeconds: 30
            timeoutSeconds: 15
    

    Выше приведена конфигурация контейнера для DropApp, который используется для регистрации DropApp CSI Driver. В контейнере используется образ Docker, он содержит программу CSI-node-driver-registrar, которая регистрирует DropApp CSI Driver в кластере.

    Контейнер используется для запуска программы для регистрации драйвера DropApp. Драйвер – это компонент, который позволяет nodes DropApp подключаться к блочным устройствам, таким как диски или сетевые хранилища. В данном случае, контейнер используется для регистрации драйвера DropApp в системе.

    Флаг --mode=kubelet-registration-probe модифицирует CSI-node-driver-registrar в зонд, проверяющий, прошла ли регистрация подключаемого модуля kubelet успешно. Значение --kubelet-registration-path должно быть таким же, как задано в аргументах контейнера, --csi-address в этом режиме не требуется.

    Если --http-endpoint установлено, то CSI-node-driver-registrar предоставляет конечную точку проверки работоспособности по указанному адресу и пути /healthz, указывая, существует ли сокет регистрации.

  4. Примените спецификацию:

          containers:
            - name: csi-driver-registrar
              image: /sig-storage/csi-node-driver-registrar
              args:
                - "--csi-address=/csi/csi.sock"
                - "--kubelet-registration-path=/var/lib/kubelet/plugins/<drivername.example.com>/csi.sock"
                # Адрес не является существующим и приведен в качестве примера.
                - "--health-port=9809"
              volumeMounts:
                - name: plugin-dir
                  mountPath: /csi
                - name: registration-dir
                  mountPath: /registration
              ports:
                - containerPort: 9809
                  name: healthz
              livenessProbe:
                httpGet:
                  path: /healthz
                  port: healthz
                initialDelaySeconds: 5
                timeoutSeconds: 5
          volumes:
            - name: registration-dir
              hostPath:
                path: /var/lib/kubelet/plugins_registry/
                type: Directory
            - name: plugin-dir
              hostPath:
                path: /var/lib/kubelet/plugins/<drivername.example.com>/
                # Адрес не является существующим и приведен в качестве примера.
                type: DirectoryOrCreate
    

Выше представлен контейнер для DropApp, используемый для регистрации DropApp Controller Manager в кластере DropApp. В конфигурации контейнера используется образ Docker с программой CSI-node-driver-registrar. Контейнер также содержит два тома - /csi и /registration, которые используются для хранения данных регистрации DropApp Controller. Порт 9809 используется для проверки работоспособности контейнера. Liveness Probe проверяет работоспособность контейнера каждые 5 секунд.

Установка CSI-external-provisioner#

Следуйте последовательности действий, чтобы настроить поддержку емкости хранилища:

  1. Установите переменные среды POD_NAME и NAMESPACE:

    env:
    - name: NAMESPACE
      valueFrom:
      fieldRef:
      fieldPath: metadata.namespace
    - name: POD_NAME
      valueFrom:
      fieldRef:
      fieldPath: metadata.name
    
  2. Примените манифест:

    CSI-external-provisioner.yaml
    kind: Deployment
    apiVersion: apps/v1
    metadata:
      name: csi-provisioner
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: csi-provisioner
      template:
        metadata:
          labels:
            app: csi-provisioner
        spec:
          serviceAccount: csi-provisioner
          containers:
            - name: csi-provisioner
              image: dappregistry/1.2/csi-provisioner
              args:
                - "--csi-address=$(ADDRESS)"
                - "--leader-election"
                - "--http-endpoint=:8080"
              env:
                - name: ADDRESS
                  value: /var/lib/csi/sockets/pluginproxy/mock.socket
              imagePullPolicy: "IfNotPresent"
              volumeMounts:
                - name: socket-dir
                  mountPath: /var/lib/csi/sockets/pluginproxy/
              ports:
                - containerPort: 8080
                  name: http-endpoint
                  protocol: TCP
              livenessProbe:
                failureThreshold: 1
                httpGet:
                  path: /healthz/leader-election
                  port: http-endpoint
                initialDelaySeconds: 10
                timeoutSeconds: 10
                periodSeconds: 20
            - name: mock-driver
              image: quay.io/k8scsi/mock-driver:canary
              env:
                - name: CSI_ENDPOINT
                  value: /var/lib/csi/sockets/pluginproxy/mock.socket
              volumeMounts:
                - name: socket-dir
                  mountPath: /var/lib/csi/sockets/pluginproxy/
          volumes:
            - name: socket-dir
              emptyDir:
    
  3. Добавьте в командную строку флаг --enable-capacity.

  4. Добавьте StorageCapacity: true в информационный объект CSI Driver.

  5. Если в CSI-external-provisioner не развернут StatefulSet, настройте при помощи флага --capacity-ownerref-level какими объектами будет происходить управление CSIStorageCapacity.

  6. Настройте частоту опроса драйвера для обнаружения измененной емкости хранилища с помощью флага --capacity-poll-interval.

  7. Настройте количество рабочих потоков, используемых параллельно, с помощью флага --capacity-threads.

  8. Включите создание информации также для классов хранения, которые используют немедленную привязку тома с файлом, с помощью флага --capacity-for-immediate-binding.

Установка Node-cert-exporter#

Запустите команду для развертывания набора демонов:

kubectl apply -f https://example.com/node-cert-exporter/master/deploy/daemonset.yml
# Адрес приведен в качестве примера, укажите полный путь к файлу конфигурации

Содержание манифеста будет следующим:

Node-cert-exporter.yaml
---
apiVersion: v1
kind: Namespace
metadata:
name: node-cert-exporter
spec:
finalizers:
- kubernetes
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: node-cert-exporter
namespace: node-cert-exporter
---
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
labels:
app: node-cert-exporter
name: node-cert-exporter
namespace: node-cert-exporter
spec:
selector:
matchLabels:
app: node-cert-exporter
template:
metadata:
name: node-cert-exporter
labels:
app: node-cert-exporter
annotations:
prometheus.io/scrape: 'true'
prometheus.io/port: '9117'
spec:
containers:
- image: ghcr.io/amimof/node-cert-exporter:latest
args:
- "--v=2"
- "--logtostderr=true"
- "--path=/host/etc/origin/node/,/host/etc/origin/master/,/host/etc/etcd/,/host/etc/kubernetes/pki/"
env:
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
name: node-cert-exporter
ports:
- containerPort: 9117
name: HTTP
protocol: TCP
resources:
limits:
cpu: 250m
memory: 256Mi
requests:
cpu: 100m
memory: 128Mi
volumeMounts:
- mountPath: /host/etc
name: etc
readOnly: true
serviceAccount: node-cert-exporter
serviceAccountName: node-cert-exporter
volumes:
- hostPath:
path: /etc
type: ""
name: etc
updateStrategy:
type: RollingUpdate

Установка OpenTelemetry Collector contrib#

Запустите команду для развертывания набора демонов:

kubectl apply -f https://example.com//open-telemetry/opentelemetry-collector/v0.91.0/examples/k8s/otel-config.yaml
# Адрес приведен в качестве примера.

Установка OpenTelemetry Operator#

Для установки OpenTelemetry Operator выполните следующие шаги:

  1. Создайте файл настройки dapp-opentelemetry-operator.yaml.

  1. Для установки OpenTelemetry Operator выполните:

    kubectl apply -f https://repoexample.ru/OpenTelemetry-operator.yaml
    
  2. Создайте экземпляр OpenTelemetry Collector:

    kubectl apply -f - <<EOF
    apiVersion: OpenTelemetry.io/v1alpha1
    kind: OpenTelemetryCollector
    metadata:
    name: simplest
    spec:
    config: |
        receivers:
        otlp:
            protocols:
            grpc:
            http:
        processors:
        memory_limiter:
            check_interval: 1s
            limit_percentage: 75
            spike_limit_percentage: 15
        batch:
            send_batch_size: 10000
            timeout: 10s
    
        exporters:
        debug:
    
        service:
        pipelines:
            traces:
            receivers: [otlp]
            processors: [memory_limiter, batch]
            exporters: [debug]
    EOF
    

    Это действие создаст экземпляр OpenTelemetry Collector с именем simplest. Этот экземпляр предоставляет порт jaeger-grpc для использования интервалов времени из инструментальных приложений и экспорта этих интервалов с помощью debug. debug записывает интервал в консоль (stdout) экземпляра OpenTelemetry Collector, который получает интервал.

    Node config содержит YAML, который должен быть передан базовым экземплярам OpenTelemetry Collector.

Установка Reloader#

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

Замените RELEASE-NAME в файле манифеста на корректное значение и выполните команду:

kubectl apply -f https://<repoexample.ru>/stakater/Reloader/master/deployments/kubernetes/reloader.yaml

Где <repoexample.ru> - URL-адрес репозитория.

По умолчанию, Reloader развертывается в namespace default и отслеживает изменения в ConfigMap или Secret во всех namespaces.

Reloader можно настроить на игнорирование ресурсов ConfigMap или Secret, передав следующие аргументы (spec.template.spec.containers.args) в его контейнер:

  • --resources-to-ignore=configMaps - игнорирование ConfigMap;

  • --resources-to-ignore=secrets - игнорирование Secret.

Примечание

Одновременно можно игнорировать только один ресурс, попытка игнорировать оба приведет к ошибке. Обходное решение для игнорирования обоих ресурсов - масштабирование pod Reloader до 0.

Установка Trident#

Для установки 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.

  1. Настройте серверную часть временного хранилища, которую установщик Trident будет использовать один раз для подготовки тома для хранения собственных метаданных.

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

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

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

  2. Выполните проверку возможности установки 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.

  3. Запустите установщик 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.
    
  4. Проверьте результат установки:

    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         |
    +----------------+----------------+
    
  5. Создайте внутреннюю конфигурацию хранилища, из которой Trident будет выделять тома:

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

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

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

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

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

    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_0.0.0.0": [
              "aggr1",
              "aggr2",
              "aggr3",
              "aggr4"
            ]
          }
        }
      ]
    }
    
  9. Создайте манифест постоянного тома для использования созданного класса хранилища sample-input/pvc-basic.yaml

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

    • создайте новый PVC с параметрами в кластере, указанными в файле pvc-basic.yaml:

    kubectl create -f sample-input/pvc-basic.yaml
    
    • получите список PVC и установите опцию слежения за объектами, чтобы обновления отображались в реальном времени:

    # Аргумент '-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
    
  11. Смонтируйте том в 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
    
  12. Убедитесь, что pod запустился:

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

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

    kubectl delete pod task-pv-pod
    

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

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

    kubectl delete pvc basic
    

Установка Vector#

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

Примечание

В приведенном сценарии при запуске Vector указан namespace vector - название может быть изменено на усмотрение администратора.

  1. Создайте namespace vector:

    kubectl create namespace --dry-run=client -o yaml vector > namespace.yaml
    
  2. Выполните команду для развертывания Vector в кластере DropApp:

    vector agent deploy --config <Path_to_the_configuration_file>
    
  3. Дождитесь завершения процесса развертывания.

  4. Проверьте статус агента с помощью команды:

    vector agent status