Установка#
Установка DropApp#
Все шаги, приведенные в этой инструкции, описывают последовательность действий для установки DropApp на операционные системы Platform V SberLinux OS Server и/или Platform V SberLinux OS Core, а так же «РЕД ОС» с помощью утилиты Dactl.
Подготовка машин для кластера#
Высокодоступная конфигурация#
Для высокодоступной конфигурации потребуется:
3 control plane машины:
Минимальная конфигурация Control plane node# Значение
Размер
ЦПУ [CPU] (в ядрах)
4 (с поддержкой VT*)
ОЗУ [RAM]
8192 Мб
Размер диска [HDD/SSD]
15 Гб
Рекомендуемая конфигурация Control plane node# Значение
Размер
ЦПУ [CPU] (в ядрах)
8 (с поддержкой VT*)
ОЗУ [RAM]
16000 Мб
Размер диска [HDD/SSD]
50 Гб
2 worker машины:
Минимальная конфигурация worker node# Значение
Размер
ЦПУ [CPU] (в ядрах)
4 (с поддержкой VT*)
ОЗУ [RAM]
8192 Мб
Размер диска [HDD/SSD]
30 Гб
Рекомендуемая конфигурация worker node# Значение
Размер
ЦПУ [CPU] (в ядрах)
8 (с поддержкой VT*)
ОЗУ [RAM]
16000 Мб
Размер диска [HDD/SSD]
100 Гб
Минимальная конфигурация#
Для минимальной конфигурации потребуется 1 control plane машина и 2 worker машины.
Дополнительные настройки для каждой машины#
На каждой машине:
создайте пользователя
dapp;поместите публичный ключ
~/.ssh/id_dapp.pubв домашний каталог;предоставьте пользователю права на использование команды
sudoбез пароля;обеспечьте доступ к необходимой сети и IP-адрес каждой машине, доступный с машины администратора.
Остальные настройки обеспечит Dactl.
Создание SSH-ключа#
Сгенерируйте пару SSH-ключей, используя команду ssh-keygen.
Пример с использованием типа RSA#
Для генерации SSH-ключей с использованием типа RSA и длиной не менее 4096 бит используйте команду:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f ~/.ssh/id_dapp
Пример с использованием типа Ed25519#
Для генерации SSH-ключей с использованием типа Ed25519 используйте команду:
ssh-keygen -t ed25519 -C "your_email@example.com" -f ~/.ssh/id_dapp
Используемые в примерах опции#
Используемые в примерах опции:
-t - тип ключа, например rsa или ed25519;
-b - длина ключа (для RSA рекомендуется 4096 бит);
-C - комментарий, обычно email;
-f - путь и имя файла для сохранения ключей.
Формирование конфигурационного файла DropAppConfiguration#
Перед формированием конфигурационного файла DropAppConfiguration для Dactl, убедитесь в наличии:
реестра с образами контейнеров
K8S-2.2.3-fstec-58-distrib.zip, созданного в разделе «Подготовка окружения»;сертификат для реестра, созданного в разделе «Подготовка окружения»;
репозиторий с RPM-пакетами
K8S-2.2.3-fstec-58-distrib.zip, напримерhttp://my-rpm-repo.com/dapp/2.2.3-fstec;репозиторий с RPM-пакетами Platform V SberLinux OS Server, например
http://my-rpm-repo.com/SLO/9.1-fstec, в этом репозитории есть зависимости дляK8S-2.2.3-fstec-58-distrib.zip;машины с пользователем
dapp.
Создайте конфигурационный файл da.yaml:
da.yaml
apiVersion: config.dropapp.ru/v1alpha1
kind: DropAppConfiguration
metadata:
name: "fstec-cluster"
spec:
network:
publicDomain: domain.ru
metallb:
pools:
- addresses: "00.00.00.32/32"
name: "dapp"
l2Advertisement: true
artifacts:
imageRegistry:
host: harbor.registry.domain.ru
path: dapp # 2.2.3-fstec используется автоматически
credentials: ZEh...Q== # токен аутентификации в base64, в нашем примере это echo -n 'robot$dapp-guest:<robot-dapp-guest-name>' | base64 -w0 | base64 -w0
certificate: <cert-part>... # это значение можно получить из regisrtry кластера командой: kubectl get secret ingress-tls -n dapp-security -o jsonpath="{.data['tls\.crt']}"
rpmRepository:
- name: "dapp-2.2.3-fstec"
baseUrl: http://my-rpm-repo.com/dapp/2.2.3-fstec
gpgCheck: 1
enabled: 1
gpgKey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberLinux"
- name: "slo-baseos-9.1-fstec"
baseUrl: http://my-rpm-repo.com/SLO/9.1-fstec
gpgCheck: 1
enabled: 1
gpgKey: "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-SberLinux"
compute:
sshAccess:
user: dapp
privateKeyPath: "~/.ssh/id_dapp"
userProvisioned:
nodes:
# Для высокодоступной конфигурации впишите еще 2 control-plane'а в список controlPlane
controlPlane:
- ip: "00.00.00.41"
nodePool: "control-plane"
worker:
- ip: "00.00.00.51"
nodePool: "worker"
- ip: "00.00.00.52"
nodePool: "worker"
k8s:
podSubnetCIDR: 00.000.0.0/16 # можно настроить сеть для подов
serviceSubnetCIDR: 00.00.0.1/16 # можно настроить сеть для сервисов
# если необходимо, настраиваем ingressTLS, если не указан, то будет сгенерирован автоматически
ingressTLS:
cert: <ingressTLS-cert>...
key: <ingressTLS-key>...
# настраиваем аудит для kube-apiserver
apiServer:
extraArgs:
audit-policy-file: "/etc/kubernetes/policies/audit-policy.yaml"
audit-log-path: "/var/log/kubernetes/audit.log"
audit-log-format: "json"
audit-log-maxbackup: "5"
audit-log-maxsize: "128"
audit-log-maxage: "7"
audit-log-mode: "batch"
extraVolumes:
- name: policies
hostPath: /etc/kubernetes/policies
mountPath: /etc/kubernetes/policies
- name: kube-audit
hostPath: /var/log/kubernetes
mountPath: /var/log/kubernetes
# подключение LDAP каталога
components:
- name: auth
tools:
- name: dex
values:
config:
connectors:
- type: ldap
name: Ipa Server
id: ldap
config:
bindDN: uid=dapp-sync-svc,cn=users,cn=accounts,dc=dapp,dc=un,dc=sbt
bindPW: qwerty12345
groupSearch:
baseDN: cn=groups,cn=accounts,dc=dapp,dc=un,dc=sbt
filter: (objectClass=groupOfNames)
nameAttr: cn
userMatchers:
- groupAttr: member
userAttr: DN
host: freeipa.fstec.domain.ru:636
insecureNoSSL: false
insecureSkipVerify: true
userSearch:
baseDN: cn=users,cn=accounts,dc=dapp,dc=un,dc=sbt
emailAttr: mail
filter: (objectClass=person)
idAttr: DN
nameAttr: uid
preferredUsernameAttr: uid
username: uid
usernamePrompt: 'Username:'
Запуск установки кластера#
Для установки кластера выполните команду:
./dactl create cluster --config ./da.yaml
В конце установки появится сообщение:
======================================
Done! DropApp cluster with name 'fstec-cluster' and version '2.2.3-fstec' is successfully installed!
Next steps are:
- Cluster config is stored to this machine as /home/dapp/.dropapp/fstec-cluster/kubeconfig
you may need to export this path to the KUBECONFIG environment variable
or copy it as '~/.kube/config'
otherwise use it as --kubeconfig parameter value for kubectl or dactl commands
- Check pods and nodes by executing `kubectl get pods -A; kubectl get nodes`
- Check installed Platform V DropApp components by executing `kubectl get components -o wide`
- Check installed Platform V DropApp tools by executing `kubectl get tools -o wide`
- Visit Platform V DropApp UI: https://console.fstec-cluster.domain.ru
login: kubeadmin
password is stored in: /home/dapp/.dropapp/fstec-cluster/kubeadmin-password
Описание установленного кластера#
Артефакты установки#
По выполнению установки артефактами являются:
конфигурационный файл кластера:
/home/dapp/.dropapp/fstec-cluster/kubeconfigсуперадмин
kubeadmin, пароль для учетной записи в файле/home/dapp/.dropapp/fstec-cluster/kubeadmin-password, этот пароль можно использовать для доступа в пользовательскую консоль по адресу из примераhttps://console.fstec-cluster.domain.ru
Установленные компоненты#
Для проверки перечня установленных компонентов, с помощью утилиты Kubectl из релизного дистрибутива, выполните команду:
kubectl get components -o wide
Вывод команды покажет список установленных по умолчанию компонентов:
NAME STATUS AGE DAPP VERSION TOOLS
auth success 2m21s 2.2.3-fstec role-model, dex
cert-management success 3m57s 2.2.3-fstec cert-manager
cni success 5m 2.2.3-fstec cilium
ingress-controller success 3m2s 2.2.3-fstec ingress-nginx
load-balancer success 4m45s 2.2.3-fstec metallb
ui
Установленные инструменты#
Для проверки перечня установленных инструментов, с помощью утилиты Kubectl из релизного дистрибутива, выполните команду:
kubectl get tools -o wide
Вывод команды покажет список установленных по умолчанию инструментов и их версии:
NAME STATUS RETRY AGE VERSION DAPP VERSION COMPONENT
cert-manager success 1 4m18s v1.14.7 2.2.3-fstec cert-management
cilium success 0 5m22s 1.14.12 2.2.3-fstec cni
console success 2 2m11s 4.12.0 2.2.3-fstec ui
dex success 0 2m33s 2.41.1 2.2.3-fstec auth
ingress-nginx success 0 3m23s 1.9.6 2.2.3-fstec ingress-controller
metallb success 0 5m7s v0.14.5 2.2.3-fstec load-balancer
role-model success 0 2m43s 2.2.3-fstec 2.2.3-fstec auth
Установка компонентов реализующих функции безопасности#
Установка Alerting#
Компонент Alerting устанавливает инструмент Alertmanager, который отвечает за отправку уведомлений настроенных событий кластера по адресатам настроенным для Alertmanager.
Создайте файл
component-alerting.yaml:component-alerting.yaml
component-alerting.yaml apiVersion: config.dropapp.ru/v1alpha1 kind: Component metadata: name: alertingПримените файл:
kubectl apply -f component-alerting.yamlДождитесь статуса
successдля инструмента Alertmanager:kubectl get tool alertmanager NAME STATUS AGE COMPONENT alertmanager success 9s alertingРесурсы Alertmanager созданы автоматически в namespace
dapp-alerting, проверьте pods:kubectl get all -n dapp-alerting NAME READY STATUS RESTARTS AGE pod/alertmanager-0 2/2 Running 0 66s NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/alertmanager ClusterIP 00.00.00.000 <none> 9093/TCP 66s service/alertmanager-headless ClusterIP None <none> 9093/TCP 66s NAME READY AGE statefulset.apps/alertmanager 1/1 66s
Установка Logging#
Компонент Logging устанавливает инструменты Loki, Promtail и Grafana, которые реализуют функции безопасности и аудита в кластере. Grafana получает преднастроенные панели (dashboards) для анализа log-файлов и аудита кластера.
Создайте файл
component-logging.yaml:component-logging.yaml
component-logging.yaml apiVersion: config.dropapp.ru/v1alpha1 kind: Component metadata: name: loggingПримените файл:
kubectl apply -f component-logging.yamlДождитесь статуса
successдля инструментов Loki, Promtail и Grafana:kubectl get tools -o wide | grep logging grafana success 0 14s 10.4.5 2.2.3-fstec logging loki success 0 34s 2.8.10 2.2.3-fstec logging promtail success 0 24s 2.8.10 2.2.3-fstec loggingРесурсы Logging созданы автоматически в namespace
dapp-logging, проверьте pods:kubectl get pods -n dapp-logging NAME READY STATUS RESTARTS AGE grafana-76c9948779-dj6br 1/1 Running 0 54s loki-0 1/1 Running 0 75s promtail-cww9x 1/1 Running 0 66s promtail-k7gb4 1/1 Running 0 66s promtail-w9524 1/1 Running 0 66s
Доступ в Grafana#
Grafana доступна по адресу https://grafana.fstec-cluster.domain.ru. Он формируется из файла конфигурации DroppAppConfiguration: https://grafana.<cluster-name>.<domain-name>, где:
<cluster-name>- имя кластера, формируется из поляnameразделаmetadata;<domain-name>- имя домена, формируется из поляpublicDomainразделаspec.
Доступ в Grafana происходит через LDAP-каталог, который настраивается при установке кластера. По ролевой модели администратором Grafana должен быть LDAP-пользователь с ролью grafana-admin.
Панели аудита будут доступны по адресу https://grafana.fstec-cluster.domain.ru/dashboards.
Установка Security#
Компонент Security устанавливает инструменты Gatekeeper, Connaisseur и Trivy-operator, которые реализуют функции безопасности настроек в кластере.
Создайте secret с именем
dapp-registryдля Trivy-operator для доступа к базе данных Trivy, укажите логин и пароль robot-аккаунта дляharbor.registry.domain.ru, реестр из примера, настроенный в конфигурации DropApp:kubectl create secret docker-registry dapp-registry -n dapp-security --docker-server=harbor.registry.domain.ru --docker-username=robot\$dapp+dapp-guest --docker-password=<docker-password>Создайте файл
component-security.yaml, укажите в нем логин и пароль для реестра, в котором лежит база данных Trivy:component-security.yaml
apiVersion: config.dropapp.ru/v1alpha1 kind: Component metadata: name: security spec: tools: - name: trivy-operator values: operator: privateRegistryScanSecretsNames: dapp-security: dapp-registry trivy: dbRepositoryPassword: <robot-dapp-guest-password> dbRepositoryUsername: <robot-dapp-guest-name> # dbRepositoryUsername это robot account которого создали в основном реестре HarborПримените файл:
kubectl apply -f component-security.yamlДождитесь статуса
successдля инструментов Trivy-operator, Connaisseur, Gatekeeper:kubectl get tools -o wide | grep security connaisseur success 0 39m 3.4.0 2.2.3-fstec security gatekeeper success 0 40m v3.16.3 2.2.3-fstec security trivy-operator success 0 39m 0.18.5 2.2.3-fstec securityРесурсы Security созданы автоматически в namespace
dapp-security, проверьте pods:kubectl get pods -n dapp-security NAME READY STATUS RESTARTS AGE connaisseur-6fbd79789-9zfdv 1/1 Running 0 42m connaisseur-6fbd79789-nxkhj 1/1 Running 0 42m connaisseur-redis-74796c57c4-gkgxz 1/1 Running 0 42m gatekeeper-audit-7565f7dc86-f55nj 1/1 Running 0 43m gatekeeper-controller-manager-6566c97597-l99kn 1/1 Running 0 43m gatekeeper-controller-manager-6566c97597-xt6sh 1/1 Running 0 43m trivy-operator-5fb6f66df4-d7pv2 1/1 Running 0 42m
Использование постоянного хранилища#
После установки кластера и компонентов Logging, Alerting, Security, инструменты Loki, Grafana, AlertManager разворачивается с использованием томов EmptyDir. Для промышленной эксплуатации необходимо переконфигурировать их на использование постоянных томов - Persistent Volumes. В результате создания кластера с утилитой Dactl по умолчанию создается StorageClass local-storage.
Для этого необходимо:
Установить и настроить
StorageProvider. В составе DropApp используется Trident, при необходимости можно использовать иной адаптер.Зарегистрировать
StorageClass- в результате создания кластера с утилитой Dactl по умолчанию создаетсяStorageClasslocal-storage.Настроить
Persistent Volume Claimsдля использованияStorageClassPersistent Volumes.
Настройка постоянного хранилища для Logging#
Создайте файл
logging-persistence.yamlи настройтеpersistenceдля Loki и Grafana:logging-persistence.yaml
apiVersion: config.dropapp.ru/v1alpha1 kind: Component metadata: name: logging spec: tools: - name: loki values: singleBinary: persistence: enabled: true size: 10Gi storageClass: openebs-hostpath # openebs тут как пример extraVolumes: - name: loki-alerting-rules configMap: name: loki-alerting-rules - name: loki-rules-generated emptyDir: {} extraVolumeMounts: - name: loki-alerting-rules mountPath: /var/loki/rules/fake # Установка периода хранения log-файлов loki: limits_config: max_query_lookback: 168h # 7 days - name: grafana values: persistence: enabled: true type: pvc storageClassName: openebs-hostpath # openebs тут как пример size: 1GiПримечание
Просто обновить конфигурацию не получится, так как Kubernetes не позволяет обновлять разделы
volumeдляStatefulSet, поэтому нужно удалить компонент Logging.Удалите компонент Logging:
kubectl delete component loggingПересоздайте ресурсы конфигурационного файла с персистентным хранилищем, применив манифест:
kubectl apply -f ./logging-persistence.yaml
Ресурсы компонента Logging будут пересозданы.
При необходимости изменения конфигурации инструментов Logging, можно сделать манифест конкретного инструмента. Например, изменение периода хранения log-файлов для Loki.
Изменение периода хранения log-файлов#
Для изменения периода хранения log-файлов, создайте файл
loki-tool.yaml:kind: Tool metadata: name: loki spec: values: loki: limits_config: max_query_lookback: 48h # 2 daysПримените его:
kubectl apply -f loki-tool.yaml
Настройка постоянного хранилища для Alerting#
Создайте файл
alerting-persistence.yamlи настройтеpersistenceдля Alertmanager:logging-persistence.yaml
apiVersion: config.dropapp.ru/v1alpha1 kind: Component metadata: name: alerting spec: tools: - name: alertmanager values: persistence: enabled: true storageClass: openebs-hostpath # openebs тут как пример accessModes: - ReadWriteOnce size: 100MiПримечание
Просто обновить конфигурацию не получится, так как Kubernetes не позволяет обновлять разделы
volumeдляStatefulSet, поэтому нужно удалить компонент Alerting.Удалите компонент Alerting:
kubectl delete component alertingПересоздайте ресурсы конфигурационного файла с персистентным хранилищем, применив манифест:
kubectl apply -f ./alerting-persistence.yaml
Ресурсы компонента Alerting будут пересозданы.
Добавление nodes в кластер#
Добавление node в кластер происходит через создание Custom Resource с типом DropAppNode.
Подготовка машины#
Подготовьте машину, как описано в разделе «Подготовка машин для кластера».
Подготовка DropAppNode манифеста#
Создайте манифест с именем, например, new-node.yaml:
new-node.yaml
apiVersion: nodes.dropapp.ru/v1alpha1
kind: DropAppNode
metadata:
name: dapp-worker-03.fstec-cluster.domain.ru
spec:
compute:
hostname: dapp-worker-03.fstec-cluster.domain.ru
ip: 00.00.00.00
nodePool: worker # может быть произвольная строка. Это значение подставится как роль для node (kubectl get nodes)
nodeType: worker # может быть только worker сейчас. В будущем можно будет добавлять nodes с типом control-plane
sshAccessRef:
kind: SSHAccess
name: primary-nodes-access # ресурс SSHAccess с именем primary-nodes-access создан автоматически при создании кластера
Примечание
metadata.name должен совпадать с spec.compute.hostname, а также чтобы не было конфликтов с существующими dropappnodes, посмотреть существующие, которые создаются Dactl автоматически, можно через kubectl get dropappnodes -o wide.
Примечание
С помощью Dactl можно добавлять только nodes ОС Platform V SberLinux OS Server и «РЕД ОС».
Применение DropAppNode манифеста#
Примените манифест
kubectl apply -f ./new-node.yaml
Валидация добавления нового node в кластер#
Проверьте, что node добавлен:
kubectl get nodes
NAME STATUS ROLES AGE VERSION
dapp-cp-01.fstec-cluster.domain.ru Ready control-plane 83m v1.26.15
dapp-worker-01.fstec-cluster.domain.ru Ready worker 83m v1.26.15
dapp-worker-02.fstec-cluster.domain.ru Ready worker 83m v1.26.15
dapp-worker-03.fstec-cluster.domain.ru Ready worker 83m v1.26.15
Проверьте, что ресурс dropappnode создан, дождитесь пока он будет в статусе ready:
kubectl get dropappnodes
NAME STATUS AGE TYPE IP ADDRESS
dapp-cp-01.fstec-cluster.domain.ru ready 5m28s control-plane 000.000.000.136
dapp-worker-01.fstec-cluster.domain.ru ready 5m28s worker 000.000.000.158
dapp-worker-02.fstec-cluster.domain.ru ready 5m28s worker 000.000.000.241
dapp-worker-03.fstec-cluster.domain.ru ready 74s worker 000.000.000.137
Ручная установка компонентов, не установленных в предыдущих шагах#
Установка компонента Monitoring#
Компонент Monitoring устанавливает инструменты Victoria-metrics-operator, Kube-state-metrics, Prometheus-node-exporter, Metrics-server, Victoria-metrics-k8s-stack, которые реализуют функции мониторинга и наблюдаемости в кластере.
Создайте файл
component-monitoring.yaml:component-monitoring.yaml
apiVersion: config.dropapp.ru/v1alpha1 kind: Component metadata: name: monitoringПримените файл:
kubectl apply -f component-monitoring.yamlДождитесь статуса
successдля инструментов Victoria-metrics-operator, Kube-state-metrics, Prometheus-node-exporter, Metrics-server, Victoria-metrics-k8s-stack:kubectl get tools -o wide | grep monitoring NAME STATUS RETRY AGE VERSION DAPP VERSION COMPONENT console-dashboards success 0 56s 2.2.3-fstec 2.2.3-fstec monitoring kube-state-metrics success 0 46s 2.8.2 2.2.3-fstec monitoring metrics-server success 0 36s 0.7.1 2.2.3-fstec monitoring prometheus-node-exporter success 0 46s 1.7.0 2.2.3-fstec monitoring victoria-metrics-k8s-stack success 0 26s v1.101.0 2.2.3-fstec monitoring victoria-metrics-operator success 0 66s 0.43.5 2.2.3-fstec monitoringРесурсы Logging созданы автоматически в namespace
dapp-security, проверьте pods:kubectl get pods -n dapp-monitoring NAME READY STATUS RESTARTS AGE kube-state-metrics-779cc7f75d-bmswf 1/1 Running 0 109s metrics-server-d46d68bd-6vgjm 1/1 Running 0 97s prometheus-node-exporter-9f84q 1/1 Running 0 109s prometheus-node-exporter-bmv9q 1/1 Running 0 109s prometheus-node-exporter-hvgz7 1/1 Running 0 109s prometheus-node-exporter-jld9q 1/1 Running 0 110s prometheus-node-exporter-nrp8t 1/1 Running 0 110s prometheus-node-exporter-tj472 1/1 Running 0 110s victoria-metrics-operator-5dc4c77bc7-28dzn 1/1 Running 0 2m6s vmagent-victoria-metrics-k8s-stack-567d9f8497-mz54b 2/2 Running 0 77s vmalert-victoria-metrics-k8s-stack-848d7655d8-r292r 2/2 Running 0 76s vminsert-victoria-metrics-k8s-stack-857469cd74-5f2f8 1/1 Running 0 22s vminsert-victoria-metrics-k8s-stack-857469cd74-nwfvr 1/1 Running 0 22s vmselect-victoria-metrics-k8s-stack-0 1/1 Running 0 52s vmselect-victoria-metrics-k8s-stack-1 1/1 Running 0 52s vmstorage-victoria-metrics-k8s-stack-0 1/1 Running 0 78s vmstorage-victoria-metrics-k8s-stack-1 1/1 Running 0 78s