Ручная установка компонентов, не установленных с помощью Dactl#
Установка Apiserver-network-proxy#
Для установки Apiserver-network-proxy выполните следующие шаги:
Создайте 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.Примените Deployment с помощью команды:
kubectl apply -f deployment.yaml
Установка CSI-external-attacher#
Для развертывания CSI-external-attacher выполните следующие шаги:
Создайте новую учетную запись службы и предоставьте ей права для запуска CSI-external-attacher.
Разверните 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 выполните следующие шаги:
Создайте новую учетную запись службы и предоставьте ей права для запуска CSI-external-resizer.
Разверните 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 выполните следующие шаги:
Создайте новую учетную запись службы и предоставьте ей права для запуска CSI-external-snapshotter.
Разверните 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 выполните следующие шаги:
Получите доступ к сокету драйвера CSI (путь:
/var/lib/kubelet/plugins/<drivername.example.com>/).Получите доступ к регистрационному сокету (путь:
/var/lib/kubelet/plugins_registry/). Убедитесь, что плагин для регистрации доступен на хосте, на котором запущен DropApp. Обычно это можно проверить, выполнив командуkubectl get pods -n kube-system. Если виден pod с именемetcd-<host_name>, то плагин доступен.Проверьте работоспособность 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, указывая, существует ли сокет регистрации.Примените спецификацию:
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#
Следуйте последовательности действий, чтобы настроить поддержку емкости хранилища:
Установите переменные среды
POD_NAMEиNAMESPACE:env: - name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.nameПримените манифест:
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:Добавьте в командную строку флаг
--enable-capacity.Добавьте
StorageCapacity: trueв информационный объект CSI Driver.Если в CSI-external-provisioner не развернут
StatefulSet, настройте при помощи флага--capacity-ownerref-levelкакими объектами будет происходить управлениеCSIStorageCapacity.Настройте частоту опроса драйвера для обнаружения измененной емкости хранилища с помощью флага
--capacity-poll-interval.Настройте количество рабочих потоков, используемых параллельно, с помощью флага
--capacity-threads.Включите создание информации также для классов хранения, которые используют немедленную привязку тома с файлом, с помощью флага
--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 выполните следующие шаги:
Создайте файл настройки
dapp-opentelemetry-operator.yaml.
Для установки OpenTelemetry Operator выполните:
kubectl apply -f https://repoexample.ru/OpenTelemetry-operator.yamlСоздайте экземпляр
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 выполните шаги:
Загрузите и распакуйте 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 будет использовать один раз для подготовки тома для хранения собственных метаданных.
Поместите файл backend.json в каталог установки
setup:cp sample-input/<backend template>.json setup/backend.jsonПримеры файлов конфигурации для различных типов бэкенд можно найти в
sample-inputкаталоге.Выполните проверку возможности установки 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.Запустите установщик 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.Проверьте результат установки:
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 | +----------------+----------------+Создайте внутреннюю конфигурацию хранилища, из которой Trident будет выделять тома:
./tridentctl -n trident create backend -f setup/backend.json +-----------------------+----------------+--------+---------+ | NAME | STORAGE DRIVER | ONLINE | VOLUMES | +-----------------------+----------------+--------+---------+ | ontapnas_0.0.0.0 | ontap-nas | true | 0 | +-----------------------+----------------+--------+---------+Создайте класс хранилища:
./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__указывается название драйвера хранилища.Используйте
kubectlдля создания хранилища как объекта DropApp:kubectl create -f sample-input/storage-class-basic.yamlПроверьте базовый класс хранилища:
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" ] } } ] }Создайте манифест постоянного тома для использования созданного класса хранилища
sample-input/pvc-basic.yamlУбедитесь, что имя класса соответствует созданному в шаге 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Смонтируйте том в 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Убедитесь, что pod запустился:
kubectl get pod -awУбедитесь, что 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Удалите pod:
kubectl delete pod task-pv-podНа данном шаге удален только pod, том продолжает существовать и может быть использован другими pods.
Удалите том выполнив команду:
kubectl delete pvc basic
Установка Vector#
Для установки Vector выполните шаги:
Примечание
В приведенном сценарии при запуске Vector указан namespace vector - название может быть изменено на усмотрение администратора.
Создайте namespace
vector:kubectl create namespace --dry-run=client -o yaml vector > namespace.yamlВыполните команду для развертывания Vector в кластере DropApp:
vector agent deploy --config <Path_to_the_configuration_file>Дождитесь завершения процесса развертывания.
Проверьте статус агента с помощью команды:
vector agent status