Установка#
Установка DropApp#
Все шаги, приведенные в этой инструкции, описывают последовательность действий для установки DropApp на операционные системы Platform V SberLinux OS Server, ОС «Альт 8 СП» и ОС Astra Linux Special Edition.
Отличия процесса установки DropApp на Platform V SberLinux OS Server в Исполнении OS Core от процесса установки в Исполнении OS Server приведены в разделе «Установка DropApp на Platform V SberLinux OS Core».
Примечание
Необходимо соблюдать последовательность действий в виде первоочередной установки и безопасной настройки при помощи Ansible и последующей ручной установки инструментов, необходимых для работы в частных случаях.
Развертывание кластера DropApp с помощью Ansible#
Подготовка файла inventory#
Роли и плейбуки для установки находятся в составе дистрибутива в архиве с именем dapp-kube-mgmt. Внутри архива содержатся каталоги для ролей, плейбуков, файлов с параметрами и inventory.
Пример содержимого каталога dapp-kube-mgmt:
ls -lh dapp-kube-mgmt
total 36K
-rw-r--r--. 1 SVasGerasimov users 47 Sep 8 06:42 ansible.cfg
-rwxr-xr-x. 1 SVasGerasimov users 3.2K Sep 8 12:43 certs.sh
drwxr-xr-x. 2 SVasGerasimov users 4.0K Sep 8 12:43 dependencies
drwxr-xr-x. 3 SVasGerasimov users 4.0K Sep 9 08:47 inventory
drwxr-xr-x. 2 SVasGerasimov users 4.0K Sep 9 08:29 playbooks
-rw-r--r--. 1 SVasGerasimov users 4.4K Sep 8 12:43 README.md
drwxr-xr-x. 6 SVasGerasimov users 4.0K Sep 8 12:43 roles
drwxr-xr-x. 2 SVasGerasimov users 4.0K Sep 8 12:43 vars
В каталоге ./inventory находится шаблон файла inventory – template.ini. Переименуйте template.ini согласно выбранному имени кластера (например, dapp.ini) и отредактируйте содержимое в соответствии с используемыми в кластере именами и адресами.
Пример template.ini:
[c01_fstec:children]
; IP pools for c01
; NN.MM.OO.11-20 control planes
; NN.MM.OO.21-30 workers
; NN.MM.OO.41-50 services\shared
c01_fstec_control_plane
c01_fstec_workers
[c01_fstec_control_plane]
cp01.c01.example.ru ansible_host=NN.MM.OO.11
[c01_fstec_workers]
w01.c01.example.ru ansible_host=NN.MM.OO.21
w02.c01.example.ru ansible_host=NN.MM.OO.22
Генерация сертификатов#
Перед выполнением установки необходимо сгенерировать сертификаты, используемые в кластере. Ниже приведен сценарий для их создания:
Используйте файл
./certs.sh, чтобы сгенерировать первоначальные сертификаты для Harbor и Dex.
Скрипт сгенерирует сертификаты в папке /tmp.
Перенесите файлы в каталог
files/ssl/<file_inventory_group_name>.Где
<file_inventory_group_name>- имя группы из файлаinventory.
Подготовка файла с параметрами шаблонов#
Перед запуском плейбуков необходимо подготовить файл с параметрами, на основе которых будут заполняться шаблоны конфигураций. Ниже приведен пример настройки:
В каталоге
./inventory/group_varsнаходится файл-шаблонexample_ru.yml. Переименуйте файл согласно названию кластера (например,c01_fstec.yml) и отредактируйте:укажите диапазон адресов для Metallb;
укажите ссылки на образы в стартовом реестре;
укажите DNS-имена для Dex, Grafana, Harbor;
пути к сгенерированным ранее сертификатам для Dex, Harbor;
адрес IPA-сервера и УЗ для подключения;
укажите ссылки на RPM-пакеты из состава дистрибутива, размещенные в стартовом репозитории.
example_ru.yml
# код и версия компонента для развертывания # на основе версии импортируется соотв. файл переменных из vars/var_<<component_code>>_<<component_version>>.yml component_code: k8sf component_version: 3.2.2 ############################ Переменные для роли host_configuration # Параметр, определяющий применять ли hardening для Sberlinux OS Server (SLO) (должно быть применено для выполнения требований сертификации ОС) host_configuration_fstec_hardening: false # host_configuration_selinux_state: enforcing/permissive/disabled host_configuration_selinux_state: enforcing ############################ ############################ Переменные для роли create_cluster # определено в vars_k8sf_2.2.3 # bootstrap_registry # auth_bootstrap_registry # формируется автоматически по имени группы cluster_name: "{{ group_names[0] }}" # Автоматически выбирается первый узел из группы _control_plane control_plane_init_host: "{{ groups[group_names[0]][0] }}" # ссылки на registry, в котором находятся образы # например: если образ coredns: my.registry.ru/dev/coredns:1.8.0, то registry будет my.registry.ru/dev create_cluster_coredns_registry: "registry-server.local/k8sf/3.2.2" create_cluster_etcd_registry: "registry-server.local/k8sf/3.2.2" create_cluster_kubernetes_registry: "registry-server.local/k8sf/3.2.2" # Пакеты специфичные для AltLinux create_cluster_alt_crio: http://pkg-server.local/alt/cri-o-alt-1.27.8.rpm create_cluster_alt_crio_tools: http://pkg-server.local/alt/cri-tools-alt-1.27.1.rpm create_cluster_alt_kubernetes_client: http://pkg-server.local/alt/kubernetes-client-alt-1.27.16.rpm create_cluster_alt_kubernetes_common: http://pkg-server.local/alt/kubernetes-common-alt-1.27.16.rpm create_cluster_alt_kubernetes_crio: http://pkg-server.local/alt/kubernetes-crio-alt-1.27.16.rpm create_cluster_alt_kubernetes_kubeadm: http://pkg-server.local/alt/kubernetes-kubeadm-alt-1.27.16.rpm create_cluster_alt_kubernetes_kubelet: http://pkg-server.local/alt/kubernetes-kubelet-alt-1.27.16.rpm create_cluster_alt_kubernetes_node: http://pkg-server.local/alt/kubernetes-node-alt-1.27.16.rpm # параметры для интеграции с Dex # переиспользуются переменные для Dex, заполненные в разделе для Dex create_cluster_dex_oidc_ca_file_source: "{{ dex_oidc_ca_file_source }}" create_cluster_dex_oidc_ca_file: "{{ dex_oidc_ca_file }}" create_cluster_dex_oidc_issuer_url: "{{ dex_oidc_issuer_url }}" create_cluster_dex_oidc_client_id: "{{ dex_oidc_client_id }}" create_cluster_dex_oidc_username_claim: "{{ dex_oidc_username_claim }}" create_cluster_dex_oidc_groups_claim: "{{ dex_oidc_groups_claim }}" ## Cilium # Namespace, где развернут Cilium в обновляемом кластере create_cluster_cilium_namespace: kube-system # Репозиторий образов, в котором находятся образа Cilium create_cluster_cilium_image_registry: "registry-server.local/k8sf/3.2.2" # Репозиторий образов, в котором находятся образа Hubble-ui create_cluster_hubble_ui_image_registry: "registry-server.local/k8sf/3.2.2" create_cluster_hubble_ui_tag: v0.13.2 create_cluster_hubble_backend_tag: v0.13.2 # URL пути к пакетам для установки DropApp RPMs # данные пакеты берутся из дистрибутива DropApp. # Пути к пакетам для SberLinux 8 (их нет для k8sf 3.2.2, Sberlinux 8 не поддерживается) create_cluster_dapp_rpms_slo8: [] # Пути к пакетам для SberLinux 9 create_cluster_dapp_rpms_slo9: kubeadm: "http://pkg-server.local/slo/kubeadm-1.27.16-dapp3.2.2+1.sl9^1.x86_64.rpm" kubectl: "http://pkg-server.local/slo/kubectl-1.27.16-dapp3.2.2+1.sl9^1.x86_64.rpm" kubelet: "http://pkg-server.local/slo/kubelet-1.27.16-dapp3.2.2+1.sl9^1.x86_64.rpm" cri_o: "http://pkg-server.local/slo/cri-o-1.27.8-dapp3.2.2+1.sl9^1.x86_64.rpm" cri_o_tools: "http://pkg-server.local/slo/cri-tools-1.27.1-dapp3.2.2+1.sl9^1.x86_64.rpm" ############################ # Additional components to install on bootstrap stage additional_components: metallb: true ingress_nginx: true dex: true dex_demo: false fstec_roles: true okd_console: true trivy_operator: true gatekeeper: true harbor: true connaisseur: true cert_manager: true loki: true loki_admin_dashboards: true kube_audit: true ############################ Переменные для роли bootstrap_cluster применительно к компоненту k8sf ## Metallb metallb_address_pool: 10.26.16.91-10.26.16.100 # путь до образов Metallb metallb_registry: "registry-server.local/k8sf/3.2.2" ## настройка oidc Dex dex_image: registry-server.local/k8sf/3.2.2/dex dex_tag: v2.42.1 # dex_dns: DNS-имя Dex, должно быть зарегистрировано и доступно перед развертыванием dex_dns: dex.example.ru # dex_oidc_issuer_url: Dex issuer url, если Dex развернут с nodePort или Ingress на непривелегированных портах (3хххх), то в issuer url нужно указать порт dex_oidc_issuer_url: https://{{ dex_dns }} # файлы сертификата и ключа для DNS Dex. Здесь файлы в папке ../files (вне роли, в текущем репозитории) - можно заменить на локальные пути dex_ssl_cert_file: ../files/ssl/fstec/cert_dex.pem dex_ssl_key_file: ../files/ssl/fstec/key_dex.pem # dex_oidc_ca_file_source локальный (но для c01 сохранены в папке ../files (вне роли, в текущем репозитории)) - можно заменить на локальные пути dex_oidc_ca_file_source: ../files/ssl/fstec/ca.pem dex_value_template_file: dex-values-fstec-bootstrap.yaml.j2 ## oidc Dex - настройки для kube-apiserver oidc plugin dex_oidc_client_id: kubelogin-app dex_oidc_client_secret: ZXhh1212dff2VjcmV0 dex_oidc_redirect_url: http://localhost:8000 # dex_oidc_ca_file - путь файла ca.pem на ноде dex_oidc_ca_file: /etc/ssl/certs/openid-ca.pem dex_oidc_username_claim: name dex_oidc_groups_claim: groups ## Параметры для настройки связи Dex c IPA-сервером # имя IPA-сервера dex_ipa_server_name: freeipa.example.ru # DN аккаунта с правами на чтение dex_ipa_bind_dn: uid=sync-user,cn=users,cn=accounts,dc=example,dc=ru dex_ipa_bind_pass: "{{ vault_dex_ipa_bind_pass }}" dex_ipa_users_base_dn: cn=users,cn=accounts,dc=example,dc=ru dex_ipa_groups_base_dn: cn=groups,cn=accounts,dc=example,dc=ru ## OIDC параметры для Harbor dex_harbor_client_id: harbor-client dex_harbor_client_secret: ZXh4564523fcmV0 dex_harbor_redirect_url: https://harbor.example.ru/c/oidc/callback ## OIDC параметры для Grafana dex_grafana_client_id: grafana-client dex_grafana_client_secret: ZXhs4564sdf2mV2 dex_grafana_redirect_url: https://grafana.example.ru/login/generic_oauth ## OIDC параметры для OKD-console ## client_id и client_secret используются те же что для kube-apiserver dex_okd_redirect_url: https://{{ okd_console_dns }}/auth/callback # OKD-console okd_console_dns: console.example.ru okd_console_registry: registry-server.local/k8sf/3.2.2 okd_console_tag: 4.12.0 # Указывается шаблон для развертывания OKD-console. Для k8sc мы указываем шаблон для развертывания без аутентификации. # Значение по умолчанию, прописано в роли #okd_template: dapp-okd-console-FSTEC.yaml.j2 # Переменные для trivy-operator trivy_operator_registry: registry-server.local trivy_operator_repository: k8sf/3.2.2/trivy-operator trivy_operator_tag: 0.26.1 trivy_repository: k8sf/3.2.2/trivy trivy_tag: 0.62.1 trivy_db_registry: registry-server.local trivy_db_repository: k8sf/3.2.2/trivy-db # переменные для Gatekeeper gatekeeper_crds_image: registry-server.local/k8sf/3.2.2/gatekeeper-crds gatekeeper_crds_tag: v3.18.2 gatekeeper_curl_image: registry-server.local/k8sf/3.2.2/curl gatekeeper_curl_tag: 7.76.1 gatekeeper_image: registry-server.local/k8sf/3.2.2/gatekeeper gatekeeper_tag: v3.18.2 # Переменные для Harbor harbor_core_repository: registry-server.local/k8sf/3.2.2/harbor-core harbor_core_tag: v2.13.1 harbor_database_image: registry-server.local/k8sf/3.2.2/harbor-db harbor_database_tag: v2.13.1 harbor_jobservice_repository: registry-server.local/k8sf/3.2.2/harbor-jobservice harbor_jobservice_tag: v2.13.1 harbor_nginx_repository: registry-server.local/k8sf/3.2.2/nginx-fstec harbor_nginx_tag: v2.13.1 harbor_portal_repository: registry-server.local/k8sf/3.2.2/harbor-portal harbor_portal_tag: v2.13.1 harbor_redis_image: registry-server.local/k8sf/3.2.2/redis-fstec harbor_redis_tag: v2.13.1 harbor_registry_controller_repository: registry-server.local/k8sf/3.2.2/harbor-registryctl harbor_registry_controller_tag: v2.13.1 harbor_registry_repository: registry-server.local/k8sf/3.2.2/registry-fstec harbor_registry_tag: v2.13.1 harbor_trivy_repository: registry-server.local/k8sf/3.2.2/harbor-scanner-trivy harbor_trivy_tag: 0.33.1 harbor_dns: harbor.example.ru harbor_ssl_cert_file: ../files/ssl/fstec/cert_harbor.pem harbor_ssl_key_file: ../files/ssl/fstec/key_harbor.pem # переменные для Connaisseur connaisseur_tag: v3.8.4 connaisseur_repository: registry-server.local/k8sf/3.2.2/connaisseur connaisseur_sha: cbac829355c1176200b2ccf7803f2656e95be450459a9498242c1c1194207333 # Cert-manager cert_manager_version: v1.16.4 cert_manager_registry: registry-server.local/k8sf/3.2.2 # Переменные для Loki loki_repository: registry-server.local/k8sf/3.2.2/loki loki_tag: 2.9.15 promtail_registry: registry-server.local promtail_repository: k8sf/3.2.2/promtail promtail_tag: 2.9.15 grafana_admin_user: admin grafana_admin_password: admin123 grafana_registry: registry-server.local grafana_repository: k8sf/3.2.2/grafana grafana_tag: 10.4.17 grafana_curl_registry: registry-server.local grafana_curl_repository: k8sf/3.2.2/curl grafana_curl_tag: 7.76.1 grafana_dns: grafana.example.ru alertmanager_repository: registry-server.local/k8sf/3.2.2/alertmanager alertmanager_tag: v0.28.1 ingress_nginx_registry: registry-server.local ingress_nginx_image_path: k8sf/3.2.2 ingress_nginx_tag: v1.11.5 ############################Расшифруйте файл
playbooks/vault.ymlс помощью команды:ansible-vault decrypt playbooks/vault.yamlПароль для расшифровки смотрите в файле
playbooks/vault.pass.txt.Укажите параметры:
vault_auth_dzo_registry- логин и пароль в кодировке base64 для доступа к стартовому реестру образов. Пример команды для формирования:echo -n "username:password" | base64vault_dex_ipa_bind_pass- пароль учетной записи, указанной в параметреdex_ipa_bind_dn, используемой для доступа Dex к каталогуFreeIPA.
Зашифруйте файл
vault.yamlобратно:ansible-vault encrypt playbooks/vault.yaml
Автоматическая безопасная установка кластера и компонентов с помощью ansible-ролей#
Для установки компонентов DropApp кластера используйте ansible-роль create-cluster.yml.
Пример запуска:
ansible-playbook -i inventory/dapp.ini -K -l c01_fstec --user <username_with_sudo_rights> create-cluster.yml --check
ansible-playbook -i inventory/dapp.ini -K -l c01_fstec --user <username_with_sudo_rights> create-cluster.yml
Где: <username_with_sudo_rights> - имя пользователя с правами sudo.
Роль устанавливает кластер DropApp и копирует kubelet config в текущую папку.
Используйте следующие команды, чтобы загрузить конфигурацию и проверить состояние pods:
export KUBECONFIG=$(pwd)/config
kubectl get pod -A
Пример вывода на этом этапе:
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-66898788b6-jl9pq 0/1 ContainerCreating 0 49s
kube-system coredns-66898788b6-xdnr5 0/1 ContainerCreating 0 49s
kube-system etcd-cp01.c01.example.ru 1/1 Running 3 65s
kube-system kube-apiserver-cp01.c01.example.ru 1/1 Running 3 64s
kube-system kube-controller-manager-cp01.c01.example.ru 1/1 Running 3 66s
kube-system kube-scheduler-cp01.c01.example.ru 1/1 Running 3 65s
Pods coredns на этом этапе не запущены.
Установка bootstrap-роли#
Установите bootstrap-роль bootstrap-cluster.yml:
ansible-playbook -i inventory/dapp.ini -K -l c01_fstec --user <username_with_sudo_rights> bootstrap-cluster.yml --check
ansible-playbook -i inventory/dapp.ini -K -l c01_fstec --user <username_with_sudo_rights> bootstrap-cluster.yml
Пример вывода команды kubectl get pods -A после установки:
NAMESPACE NAME READY STATUS RESTARTS AGE
cert-manager cert-manager-784b58f48-vmgpg 1/1 Running 0 3m42s
cert-manager cert-manager-cainjector-6c9c57dc65-6ccjc 1/1 Running 0 3m42s
cert-manager cert-manager-webhook-666dc48d64-b9mz9 1/1 Running 0 3m42s
connaisseur connaisseur-deployment-67c9f57fdd-b8dqr 1/1 Running 0 4m13s
connaisseur connaisseur-deployment-67c9f57fdd-hsktj 1/1 Running 0 4m13s
connaisseur connaisseur-deployment-67c9f57fdd-zwsdc 1/1 Running 0 4m13s
dex dex-865bfb57fb-d2gvx 1/1 Running 0 8m8s
gatekeeper-system gatekeeper-audit-7f6fb9b648-wvp4s 1/1 Running 2 (6m54s ago) 7m2s
gatekeeper-system gatekeeper-controller-manager-7b85c67f8d-b86st 1/1 Running 0 7m2s
gatekeeper-system gatekeeper-controller-manager-7b85c67f8d-c62zq 1/1 Running 0 7m2s
gatekeeper-system gatekeeper-controller-manager-7b85c67f8d-xbplq 1/1 Running 0 7m2s
harbor harbor-core-5f7799df46-kgzcv 1/1 Running 0 4m31s
harbor harbor-database-0 1/1 Running 0 4m31s
harbor harbor-jobservice-656d4547cb-hb8qg 1/1 Running 1 (4m ago) 4m31s
harbor harbor-portal-66f8bcf87b-g8wlw 1/1 Running 0 4m31s
harbor harbor-redis-0 1/1 Running 0 4m31s
harbor harbor-registry-6d74d69d47-9k9s8 2/2 Running 0 4m31s
harbor harbor-trivy-0 1/1 Running 0 4m31s
ingress-nginx ingress-nginx-admission-create-twwkp 0/1 Completed 0 8m52s
ingress-nginx ingress-nginx-admission-patch-hqsg4 0/1 Completed 1 8m52s
ingress-nginx ingress-nginx-controller-7995cbbc8c-mvctn 1/1 Running 0 8m52s
kube-system cilium-46l66 1/1 Running 0 9m38s
kube-system cilium-58lph 1/1 Running 0 9m38s
kube-system cilium-operator-b8dc9d6cc-98qx6 1/1 Running 0 9m38s
kube-system cilium-operator-b8dc9d6cc-zldcr 1/1 Running 0 9m38s
kube-system cilium-rqzrq 1/1 Running 0 9m38s
kube-system coredns-66898788b6-jl9pq 1/1 Running 0 11m
kube-system coredns-66898788b6-xdnr5 1/1 Running 0 11m
kube-system etcd-cp01.c01.example.ru 1/1 Running 3 11m
kube-system hubble-relay-76c58d5fcc-2hh28 1/1 Running 0 9m38s
kube-system hubble-ui-55c8f9bbcc-5xvxd 2/2 Running 0 9m38s
kube-system kube-apiserver-cp01.c01.example.ru 1/1 Running 3 11m
kube-system kube-controller-manager-cp01.c01.example.ru 1/1 Running 3 11m
kube-system kube-scheduler-cp01.c01.example.ru 1/1 Running 3 11m
kube-system okd-console-deployment-5c4db497c8-bcqk9 1/1 Running 0 8m28s
logging loki-0 1/1 Running 0 2m30s
logging loki-alertmanager-0 1/1 Running 0 2m30s
logging loki-grafana-748bff6fb7-h7b9h 1/1 Running 0 2m30s
logging loki-promtail-4tf9z 1/1 Running 0 2m30s
logging loki-promtail-dxbzl 1/1 Running 0 2m30s
logging loki-promtail-zx7lf 1/1 Running 0 2m30s
metallb-system controller-798f989b7b-x2zxf 1/1 Running 0 9m10s
metallb-system speaker-7827j 1/1 Running 0 9m10s
metallb-system speaker-bw9dr 1/1 Running 0 9m10s
metallb-system speaker-rkfdm 1/1 Running 0 9m10s
trivy-system scan-vulnerabilityreport-5bcdc96c49-xl7tq 0/1 Init:0/1 0 2m26s
trivy-system trivy-operator-b99c465cd-sh7xw 1/1 Running 0 7m34s
Перенастройка приложений на использование образов из Harbor#
После установки, при выполнении ansible-роли boostrap_cluster, приложения Harbor, Loki, Grafana AlertManager разворачиваются с использованием томов EmptyDir. Для промышленной эксплуатации необходимо переконфигурировать их на использование постоянных томов - Persistent Volumes.
Для этого необходимо:
Установить и настроить
StorageProvider. В составе DropApp используется Trident, при необходимости можно использовать иной адаптер.Зарегистрировать
StorageClass.Настроить
Persistent Volume Claimsдля использованияStorageClassPersistent Volumes.
Установка DropApp на Platform V SberLinux OS Core#
Установка DropApp на Platform V SberLinux OS Core выполняется аналогичным образом, как на Platform V SberLinux OS Server, за исключением установки RPM-пакетов DropApp.
Подробнее про безопасную настройку SberLinux OS Core смотрите в документе «ОС Platform V SberLinux OS Server. Руководство по установке».
Установка дополнительных node в кластер DropApp#
Установка дополнительных node на ОС «Альт 8 СП»#
Подготовка пакетов для развертывания кластера DropApp на ОС «Альт 8 СП»#
Примечание
В приведенном сценарии все команды должны выполняться с правами пользователя с административными полномочиями root.
ОС «Альт 8 СП» поддерживает работу с RPM-пакетами.
Для добавления ОС «Альт 8 СП» в качестве Worker node в существующий кластер DropApp используйте пакеты:
cri-o_alt-<component_version>.rpm;cri-tools-alt-<component_version>.rpm;kubernetes-client-alt-<component_version>.rpm;kubernetes-common-alt-<component_version>.rpm;kubernetes-crio-alt-<component_version>.rpm;kubernetes-kubeadm-alt-<component_version>.rpm;kubernetes-kubelet-alt-<component_version>.rpm;kubernetes-node-alt-<component_version>.rpm.
Где: <component_version> - версия компонента.
Подготовка кластера к установке#
Для подготовки кластера к установке выполните следующие шаги:
Переименуйте host-сервер:
hostnamectl set-hostname <newhostname>Где:
<newhostname>- новое имя хоста.Если новое имя не начнет использоваться, введите команду:
systemctl restart systemd-hostnamedДля просмотра статуса воспользуйтесь командой:
hostnamectl statusОтключите использование
swap:отключите использование
swapна каждой виртуальной машине, для этого введите команду:swapoff -aудалите из конфигурационного файла
/etc/fstabвсе строки, которые содержатswap:sed -i '/swap/d' /etc/fstabотключите службу
dev-sda3.swap, которая создаетunit, воспроизводящийswapв конфигурационном файле/etc/fstabпри перезагрузке:systemctl umask dev-sda3.swapГде
sda3- актуальный разделswapжесткого диска, по умолчанию номер раздела -3.
При использовании системы управления конфигурациями Ansible, отключение использования
swapнастроено в ansible-роли и происходит автоматически при развертывании кластера DropApp.Примечание
В сценарии используется система управления конфигурациями Ansible. Данный инструмент не входит в состав продукта и требует дополнительной установки, при необходимости запросите у системного администратора.
Подключите официальные репозитории ОС «Альт 8 СП»:
очистите подключенные репозитории, удалив файлы из каталога
sources.list.d:rm -rf /etc/apt/sources.list.d/*подключите официальные репозитории:
cat > /etc/apt/sources.list.d/altofficial.list <<EOF rpm http://ftp.altlinux.org/pub/distributions/ALTLinux p10/branch/x86_64 classic rpm http://ftp.altlinux.org/pub/distributions/ALTLinux p10/branch/x86_64-i586 classic rpm http://ftp.altlinux.org/pub/distributions/ALTLinux p10/branch/noarch classic EOFобновите базы данных пакетов:
apt-get update
Установка компонентов#
Установите зависимости:
apt-get install -y containers-common runc cni-plugins conntrack-tools socat conmon ebtablesУстановите компоненты:
rpm -ivh cri-o_alt-<component_version>.rpm rpm -ivh cri-tools-alt-<component_version>.rpm rpm -ivh kubernetes-client-alt-<component_version>.rpm rpm -ivh kubernetes-common-alt-<component_version>.rpm rpm -ivh kubernetes-crio-alt-<component_version>.rpm rpm -ivh kubernetes-kubeadm-alt-<component_version>.rpm rpm -ivh kubernetes-kubelet-alt-<component_version>.rpm rpm -ivh kubernetes-node-alt-<component_version>.rpmГде:
<component_version>- версия компонента.Разрешите автозапуск CRI-O:
systemctl enable --now crio kubeletНастройте доступ к приватному репозиторию:
cat > /var/lib/kubelet/config.json <<EOF { "auths": { "<registry_adress>": { "auth": "***********" } } } EOFГде:
<registry_adress>- адрес реестра.Настройте CRI-O в файле
crio.conf:cat > /etc/crio/crio.conf <<EOF [crio] [crio.api] [crio.runtime] selinux = true [crio.image] registries = [ "<registry_adress>" ] insecure_registries = [ ] global_auth_file = "/var/lib/kubelet/config.json" pause_image = "<registry_adress>/fstec/3.2.2/dapp-kubernetes-2/pause:3.9" pause_image_auth_file = "/var/lib/kubelet/config.json" [crio.network] plugin_dirs = [ "/opt/cni/bin", "/usr/libexec/cni", ] [crio.metrics] enable_metrics = true metrics_port = 9537 [crio.tracing] [crio.stats] selinux = true plugin_dirs = [ "/opt/cni/bin", "/usr/libexec/cni", ] EOFПерезапустите CRI-O:
systemctl restart crioПерезапустите Kubelet:
systemctl restart kubelet
Установка DropApp на ОС «Альт 8 СП»#
Для установки DropApp на ОС «Альт 8 СП» необходимо подключить Worker node в кластер DropApp, для этого выполните следующие действия:
На Master node сгенерируйте временный токен и команду присоединения Worker node к кластеру:
kubeadm token create --print-join-commandПолученная команда присоединения имеет вид:
kubeadm join <kubeAPI_URL> --token <token> --discovery-token-ca-cert-hash sha256:<hash>Где:
<kubeAPI URL>— URL API-сервера видаIP-адрес:порт;<token>— токен присоединения;<hash>— хеш открытого ключа корневого центра сертификации (CA).
На Worker node ОС «Альт 8 СП» выполните команду присоединения к кластеру DropApp:
kubeadm join <the_join_command_from_the_previous_step>На Master node проверьте подключение:
kubectl get nodes
Установка дополнительных node на ОС Astra Linux Special Edition#
Подготовка ОС#
Отключение swap#
Отключите использование swap:
удалите из конфигурационного файла
/etc/fstabвсе строки, которые содержатswap:sed -i '/swap/d' /etc/fstabотключите использование
swapна каждой виртуальной машине, для этого введите команду:swapoff -a
Переадресация IPv4#
Настройте переадресацию IPv4 и разрешение на просмотр трафика:
Добавьте в конфигурационный файл
br_netfilter.confимена модулей:cat <<EOF | sudo tee /etc/modules-load.d/br_netfilter.conf overlay br_netfilter EOFЗагрузите добавленные модули:
sudo modprobe overlay sudo modprobe br_netfilterДобавьте в конфигурационный файл
kubernetes.confследующие строки:cat <<EOF | sudo tee /etc/sysctl.d/kubernetes.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOFПримечание
Параметры
sysctl, требуемые при установке, сохраняются при перезагрузке.Примените изменения:
sudo sysctl --system
Подключение репозиториев#
Подключение репозитория необходимо, чтобы при установке deb-пакетов CRI-O установились зависимости:
runc;libgpgme11;libseccomp2;conmon;golang-github-containers-common;tzdata.
Подключите диск или iso-образ установочного диска ОС Astra Linux Special Edition с репозиториями.
Смонтируйте содержимое диска в каталог
/media/cdrom0и проверьте содержимое каталога:sudo mount /media/cdrom0 ls /media/cdrom0/Пример вывода:
<OC-version> astra.ico boot EFI gostsums.txt install-doc md5sum.txt pool astra Autorun.inf dists firmware install.amd isolinux netinstПроверьте, что в файле
sources.listесть запись про подключенный локальный репозиторий:sudo cat /etc/apt/sources.listПример вывода:
deb cdrom:[OS Astra Linux <OC-version> 1.8_x86-64 DVD ]/ 1.8_x86-64 contrib main non-free non-free-firmware
Установка deb-пакетов DropApp#
Для добавления ОС Astra Linux Special Edition в качестве Worker node в существующий кластер DropApp используйте следующие пакеты из состава дистрибутива DropApp:
cri-o-astra-<component_version>.debcri-tools-astra-<component_version>.debconntrack-astra-<component_version>.debkubernetes-cni-astra-<component_version>.debkubernetes-kubeadm-astra-<component_version>.debkubernetes-kubectl-astra-<component_version>.debkubernetes-kubelet-astra-<component_version>.deb
Где: <component_version> - версия компонента.
Перенесите на Worker node deb-пакеты из списка выше.
Установите пакет Cri-tools:
sudo apt-get install cri-tools-astra-<component_version>.debУстановите пакеты CRI-O:
sudo apt-get install runc sudo apt-get install cri-o-astra-<component_version>.deb
Настройка CRI-O#
Отредактируйте файл
/etc/crio/crio.conf.d/01-crio-runc.conf:cat /etc/crio/crio.conf.d/01-crio-runc.confЗамените
runtime_path:[crio.runtime.runtimes.runc] runtime_path = "/usr/bin/runc" runtime_type = "oci" runtime_root = "/run/runc"Установите зависимости для Kubelet:
sudo apt-get install kubernetes-cni-astra-<component_version>.deb sudo apt-get install conntrack-astra-<component_version>.debУстановите пакеты Kubernetes:
sudo apt-get install kubernetes-kubeadm-astra-<component_version>.deb sudo apt-get install kubernetes-kubectl-astra-<component_version>.deb sudo apt-get install kubernetes-kubelet-astra-<component_version>.deb
Настройка конфигурационных файлов#
Настройка конфигурационного файла /var/lib/kubelet/config.json#
Настройте доступ к приватному репозиторию:
cat > /var/lib/kubelet/config.json <<EOF
{
"auths": {
"<registry_adress>": {
"auth": "***********"
}
}
}
EOF
Где: <registry_adress> - адрес реестра.
Настройка конфигурационного файла /etc/crio/crio.conf#
Настройте CRI-O в файле crio.conf:
cat > /etc/crio/crio.conf <<EOF
[crio]
[crio.api]
[crio.runtime]
selinux = true
[crio.image]
registries = [
"<registry_adress>"
]
insecure_registries = [
]
global_auth_file = "/var/lib/kubelet/config.json"
pause_image = "<registry_adress>/fstec/3.2.2/dapp-kubernetes-2/pause:3.9"
pause_image_auth_file = "/var/lib/kubelet/config.json"
[crio.network]
plugin_dirs = [
"/opt/cni/bin",
"/usr/libexec/cni",
]
[crio.metrics]
enable_metrics = true
metrics_port = 9537
[crio.tracing]
[crio.stats]
selinux = true
plugin_dirs = [
"/opt/cni/bin",
"/usr/libexec/cni",
]
EOF
Запуск служб#
Запустите службы:
Настройте автозапуск с помощью команд:
sudo systemctl enable kubelet.service sudo systemctl enable crio.serviceПерезапустите службы для применения настроек:
sudo systemctl restart crio sudo systemctl restart kubelet
Подключение к кластеру#
Для установки DropApp на ОС Astra Linux Special Edition необходимо подключить Worker node в кластер DropApp, для этого выполните следующие действия:
На Master node сгенерируйте временный токен и команду присоединения Worker node к кластеру:
kubeadm token create --print-join-commandПолученная команда присоединения имеет вид:
kubeadm join <kubeAPI_URL> --token <token> --discovery-token-ca-cert-hash sha256:<hash>Где:
<kubeAPI URL>— URL API-сервера видаIP-адрес:порт;<token>— токен присоединения;<hash>— хеш открытого ключа корневого центра сертификации (CA).
На Worker node ОС Astra Linux Special Edition выполните команду присоединения к кластеру DropApp:
kubeadm join <the_join_command_from_the_previous_step>На Master node проверьте подключение:
kubectl get nodes
Ручная установка компонентов, не установленных с помощью ansible-ролей#
Установка 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
Установка ConfigMap-reload#
Для установки ConfigMap-reload выполните следующие шаги:
Создайте новый ConfigMap, который будет содержать конфигурационные файлы. Это можно сделать с помощью следующей команды:
kubectl create configmap my-config-map --from-file=./my-config.yml=/etc/my-app/config.ymlГде:
my-config-map- это имя ConfigMap;my-config.yml- это файл конфигурации, который хотите загрузить;/etc/my-app/config.yml- это путь внутри контейнера, куда будет загружен файл.
Создайте Deployment для ConfigMap-reload, который будет следить за изменениями в ConfigMap и перезагружать конфигурационный файл. Например:
apiVersion: apps/v1 kind: Deployment metadata: name: configmap-reload spec: selector: matchLabels: app: configmap-reload replicas: 1 template: metadata: labels: app: configmap-reload spec: containers: - name: configmap-reload image: quay.io/crunchydata/configmap-reload:v0.12.0 command: ["/bin/sh", "-c", "while :; do configmap-reload /etc/my-app/config.yml; sleep 1; done"] volumeMounts: - mountPath: /etc/my-app name: config-volume volumes: - name: config-volume configMap: name: my-config-mapПримените 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.
Установка Curl#
Для установки Curl, выполните команду:
kubectl run -it --image=exemple regisry/curl:8.5.0 --restart=Never
Убедитесь, что pod curl создан:
kubectl get pods
В выводе отобразится запись curl --for condition=Ready.
Установка Envoy proxy#
Сценарий развертывания Envoy proxy в качестве балансировщика нагрузки перед службой headless service:
Создайте сервис
headless serviceсо следующим YAML-файлом:apiVersion: v1 kind: Service metadata: name: myapp spec: clusterIP: None ports: - name: HTTP port: 80 targetPort: HTTP protocol: TCP selector: app: myappPods имеют метку
appcoс именемmyapp.Сервис
headless serviceне предоставляет один IP-адрес и балансировку нагрузки для pods, имеет конфигурацию DNS с IP-адресом для всех pods, соответствующих селектору меток. Этот тип службы предназначен для использования в сценариях реализации балансировки нагрузки и самостоятельной поддержки соединения с pods.Проверьте записи DNS для сервиса внутри кластера DropApp:
nslookup myappВ выводе отобразится:
Server: 0.0.0.0 Address: 0.0.0.0.10#53 Non-authoritative answer: Name: myapp.namespace.svc.cluster.local Address: 0.0.0.0 Name: myapp.namespace.svc.cluster.local Address: 0.0.0.0 Name: myapp.namespace.svc.cluster.local Address: 0.0.0.0В приведенном сценарии выведены отдельные записи с IP-адресами для трех pods в сводке DNS.
Примените файл манифеста, выполните команду:
kubectl apply -f ./dapp-envoy-proxy-deployment.yamlСодержание манифеста будет следующим:
dapp-envoy-proxy-deployment.yaml
apiVersion: v1 kind: ConfigMap metadata: name: app-test-configmap labels: app: app-test-envoy data: envoy.yaml: | # Простая завершающая конфигурация Sidecar Envoy TLS 1.2. static_resources: listeners: - address: socket_address: address: 0.0.0.0 port_value: 8080 filter_chains: - filters: - name: envoy.filters.network.HTTP_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.HTTP_connection_manager.v3.HTTPConnectionManager codec_type: AUTO stat_prefix: ingress_HTTP route_config: name: local_route virtual_hosts: - name: service domains: ["*"] routes: - match: { prefix: "/" } route: { cluster: local_service_app } HTTP_filters: - name: envoy.filters.HTTP.router typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: - name: local_service_app connect_timeout: 0.25s type: STRICT_DNS lb_policy: ROUND_ROBIN load_assignment: cluster_name: local_service_app endpoints: - lb_endpoints: - endpoint: address: socket_address: address: app-test-service.default.svc.cluster.local port_value: 80 admin: access_log_path: /dev/null address: socket_address: address: 0.0.0.0 port_value: 8082Флаг
type: STRICT_DNSуказывает тип обнаружения службы.Флаг
lb_policy: LEAST_REQUESTпозволяет выбрать различные алгоритмы балансировки из типовROUND_ROBINиLEAST_REQUEST.Флаг
hosts: [{ socket_address: { address: myapp, port_value: 80 }}]указывает в полеaddressна доменное имя, с которого Envoy proxy должен получить записи для маршрутизации.Убедитесь в том, что deployment успешно получен:
kubectl rollout status deployment.apps/sidecar-test-deploy -n defaultВнесите содержание манифестов в
dapp-envoy-proxy-deployment.yaml:Ниже приведен фрагмент кода YAML-файла для развертывания приложения с названием app-test с тремя репликами. В этом приложении используется образ Ingress-nginx, и контейнер имеет порт HTTP на порту 80.
apiVersion: apps/v1 kind: Deployment metadata: name: app-test-deploy labels: app: app-test spec: replicas: 3 selector: matchLabels: app: app-test template: metadata: name: app-test-pod labels: app: app-test spec: containers: # Приложение было спроксировано. - name: app-test image: "nginx" ports: - name: http containerPort: 80 protocol: TCPНиже представлен фрагмент кода из YAML-файла, который описывает кластерную службу для приложения app-test. Служба предоставляет доступ к приложению через порт 80 и имеет тип ClusterIP, что означает, что она доступна только внутри кластера. В файле также указаны метки и селектор для службы, которые позволяют ей быть найденной и управляемой в DropApp.
apiVersion: v1 kind: Service metadata: name: app-test-envoy-service labels: app: app-test-envoy spec: type: NodePort selector: app: app-test-envoy ports: - port: 8080 targetPort: 8080 nodePort: 3000Ниже приведен фрагмент кода YAML-файла для развертывания приложения Envoy proxy. Приложение использует образ Docker с именем
exampleи контейнеромapp-test-envoy. Контейнер имеет один порт HTTP, который настроен на прослушивание на порту 8080. Контейнер также использует файл конфигурации/etc/envoy, который хранится в конфигурации DropApp.example-app-test-envoy.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: sidecar-test-deploy labels: app: sidecar-test spec: selector: matchLabels: app: sidecar-test template: metadata: name: sidecar-test-pod labels: app: sidecar-test spec: containers: # The application being proxied. - name: app image: "nginx" ports: - name: http containerPort: 80 protocol: TCP # The sidecar. - name: sidecar image: dappregistry/envoy:distroless ports: - name: http containerPort: 8080 protocol: TCP volumeMounts: - name: sidecar-config mountPath: "/etc/envoy" readOnly: true volumes: - name: app-config configMap: name: sidecar-test-configmapНиже представлена конфигурация для Envoy proxy, которая используется для обработки запросов к серверу.
Где:
apiVersionуказывает на версию API, которой должна соответствовать конфигурация. В данном случае этоv1;kindуказывает на тип объекта конфигурации. В данном случае этоConfigMap;metadataсодержит информацию о конфигурации, такую как имя и метки;dataсодержит содержимое конфигурации, в данном случае файлenvoy.yaml;static_resources- это раздел конфигурации, который определяет статические ресурсы, такие как фильтры и слушатели;listeners- это список слушателей, которые обрабатывают запросы. Каждый слушатель определяет адрес, на который будет отправлен запрос, и настройки фильтрации;filter_chains- это раздел, который определяет, какие фильтры должны быть применены к запросу. В данном примере используется фильтр Envoy proxy для обработки HTTP-запросов;nameиtyped_configопределяют параметры фильтра;route_config- это раздел, определяющий маршрутизацию запросов;domains- это список доменов, к которым будет применяться маршрутизация;routes- это список маршрутов, которые будут применены к запросам. Каждый маршрут определяет префикс запроса, который должен соответствовать, и действия, которые должны быть выполнены.
В целом, данная конфигурация определяет настройки Envoy proxy для обработки запросов к серверу, который расположен на адресе 0.0.0.0 и прослушивает порт 8080.
Настройки Envoy proxy для обработки запросов к серверу
apiVersion: v1 kind: ConfigMap metadata: name: sidecar-test-configmap labels: app: sidecar-test data: envoy.yaml: | static_resources: listeners: - address: socket_address: address: 0.0.0.0 port_value: 8080 filter_chains: - filters: - name: envoy.filters.network.http_connection_manager typed_config: "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager codec_type: AUTO stat_prefix: ingress_http route_config: name: local_route virtual_hosts: - name: service domains: ["*"] routes: - match: { prefix: "/" } route: { cluster: local_service } http_filters: - name: envoy.filters.http.router typed_config: "@type": type.googleapis.com/envoy.extensions.filters.http.router.v3.Router clusters: - name: local_service connect_timeout: 0.25s type: STATIC lb_policy: ROUND_ROBIN load_assignment: cluster_name: local_service endpoints: - lb_endpoints: - endpoint: address: socket_address: address: 127.0.0.1 port_value: 80 admin: access_log_path: /dev/null address: socket_address: address: 0.0.0.0 port_value: 8082Перенаправьте существующий порт на локальный:
kubectl port-forward service/sidecar-test-service -n default --address localhost 8099:8080Введите команду для просмотра локального порта:
Curl localhost:8099Проверьте, что выходные данные возвращают страницу
nginx, а прокси-сервер является Envoy proxy.
Установка Helm#
Для установки Helm:
Зайдите на control-plane по ssh, используя команду:
ssh $CONTROL_PLANE_IPУстановите Helm на control-plane при помощи команды:
sudo yum install -y helm --enablerepo=dapp-3.1.0
Установка Hubble export stdout#
Hubble Exporter включается с помощью свойств ConfigMap. Он отключен, пока не будет задано значение пути к файлу для параметра hubble-export-file-path.
Используйте Helm для установки Cilium с включенным Hubble Exporter:
helm install Cilium ./Cilium \ --set hubble.enabled=true \ --set hubble.export.static.enabled=true \ --set hubble.export.static.filePath=/var/run/Cilium/hubble/events.logДождитесь готовности
Ciliumpod:kubectl -n kube-system rollout status ds/CiliumУбедитесь, что журналы потоков хранятся в целевых файлах:
kubectl -n kube-system exec ds/Cilium -- tail -f /var/run/Cilium/hubble/events.log
После настройки Hubble Exporter можно настроить решение для ведения журнала таким образом, чтобы оно использовало журналы из пути к файлу экспорта Hubble.
Чтобы отключить статическую настройку, удалите ключ hubble-export-file-path в ConfigMap Cilium-config и вручную очистите файлы журнала, созданные в указанном месте контейнера.
Приведенная ниже команда перезапустит Cilium pods. Если редактировался ConfigMap, потребуется перезапуск Cilium pods.
Для перезапуска Cilium pods выполните:
Cilium config delete hubble-export-file-path
Установка Kube-state-metrics#
Для установки Kube-state-metrics примените манифест:
kubectl apply -f examples/standard
Установка Metrics-server#
Для установки Metrics-server, выполните команду:
kubectl apply -f <path_to_manifests>/metrics-server.yaml
Где: <path_to_manifests> - путь к каталогу, где находится Metrics Server.
Проверьте состояние службы Metrics Server, используя команду:
kubectl get pods --namespace kube-system | grep metrics-server
Если установка прошла успешно, в выводе отобразится pod Metrics Server в состоянии Running.
Установка 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
Установка Node-exporter#
Для установки Node-exporter с помощью Helm необходимо выполнить шаги:
Создайте файл
values.yamlс настройками для Node-exporter:image: repository: dropapp/coreos/node-exporter tag: v1.7.0Примечание
Репозиторий приведен для примера и является несуществующим.
Установите Node-exporter с помощью Helm:
helm upgrade --install node-exporter ./node-exporter --values values.yamlВ этом примере указывается путь к файлу
values.yamlи устанавливается Node-exporter.После установки Node-exporter будет запущен в DropApp и доступен по адресу
http://<Node Exporter IP>:9100.Node-exporter работает и предоставляет метрики на порте 9100.
Убедитесь, что метрики экспортируются, указав URL-адрес
/metricsконечной точки:curl http://localhost:9100/metricsВывод отобразит следующее:
go_gc_duration_seconds{quantile="0"} 3.8996e-05 go_gc_duration_seconds{quantile="0.25"} 4.5926e-05 go_gc_duration_seconds{quantile="0.5"} 5.846e-05 # etc.Node-exporter предоставляет метрики, которые Prometheus может автоматически собирать и систематизировать, в том числе системных метрик с префиксом
node_.Просмотрите показатели с выводом справочной информации о типе метрики:
curl http://localhost:9100/metrics | grep "node_"
Установка 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.
Установка Prometheus#
Предварительные условия развертывания: созданы правила RBAC для учетной записи службы Prometheus.
Развертывание Prometeus:
Примените следующие манифесты для создания учетной записи службы и связки
ClusterRole/ClusterRoleBinding:apiVersion: v1 kind: ServiceAccount metadata: name: prometheusВыше приведен фрагмент кода, который описывает создание ServiceAccount в DropApp, где:
apiVersionуказывает версию API DropApp, которой принадлежит этот объект. В данном случае это версияv1;kindопределяет тип объекта. В данном случае ServiceAccount;metadataсодержит информацию о ServiceAccount, такую как имя, которое может быть использовано для идентификации ServiceAccount.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: prometheus rules: - apiGroups: [""] resources: - nodes - nodes/metrics - services - endpoints - pods verbs: ["get", "list", "watch"] - apiGroups: [""] resources: - configmaps verbs: ["get"] - apiGroups: - networking.k8s.io resources: - ingresses verbs: ["get", "list", "watch"] - nonResourceURLs: ["/metrics"] verbs: ["get"]Выше приведено описание объекта ClusterRole в DropApp, который предоставляет разрешения для работы с ресурсами в кластере, где:
apiVersionопределяет версию API, к которой относится объект. В данном случае, это версияv1для API группыrbac.authorization.k8s.io;kindопределяет тип объекта, в данном случаеClusterRole;metadataсодержит информацию об объекте, такую как его имя (name), которое может использоваться для его идентификации. Также здесь указаны правила, которые определяют, какие ресурсы и операции могут быть выполнены с ними;rulesопределяет правила доступа к ресурсам. В данном примере, правила доступа включают получение списка, чтение и наблюдение за следующими ресурсами:nodes,nodes/metrics,services,endpoints,podsиconfigmaps. Также здесь указаны правила доступа к ресурсам из группыnetworking.k8s.io, включаяingresses;nonResourceURLsопределяет список URL-адресов, к которым можно получить доступ без указания ресурсов. В данном случае указан только один URL-адрес -/metrics;verbsопределяет список операций, которые могут быть выполнены над ресурсами. В данном случае указаны операцииget,listиwatch.
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: prometheus roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: prometheus subjects: - kind: ServiceAccount name: prometheus namespace: defaultПользовательский ресурс Prometheus определяет характеристики StatefulSet (количество копий, запросы/ограничения ресурсов и т.д.), а также то, какие ServiceMonitors должны быть включены в поле
spec.serviceMonitorSelector.Добавьте возможность ввода новых ServiceMonitors без необходимости перенастройки Prometheus, примените манифест:
apiVersion: monitoring.operationsistem.com/v1 kind: Prometheus metadata: name: prometheus spec: serviceAccountName: prometheus serviceMonitorSelector: matchLabels: team: frontend resources: requests: memory: 400Mi enableAdminAPI: falseВ сценарии развертывания Prometheus-operator (представлен выше) создается объект
ServiceMonitorс меткойteam: frontend. Манифест определяет, что объект Prometheus должен выбирать всеServiceMonitorsс меткойteam: frontend.Убедитесь, что экземпляр был запущен, введите команду:
kubectl get -n default prometheus prometheus -wПо умолчанию Prometheus запустит
ServiceMonitorsиз текущего namespace. Чтоб выбратьServiceMonitorsиз другого namespace, обновите полеspec.serviceMonitorNamespaceSelectorв Prometheus.
Установка 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
Установка VictoriaMetrics, VictoriaMetrics-operator, VictoriaMetrics-cluster#
Для установки VictoriaMetrics, VictoriaMetrics-operator, VictoriaMetrics-cluster выполните следующие действия:
Добавьте репозиторий VictoriaMetrics для установки компонентов, выполнив команду:
Copyhelm repo add vm https://<repoexample.ru>/helm-charts/ # Укажите актуальный путь до локального репозиторияОбновите репозиторий Helm:
Copyhelm repo updateПроверьте корректность настроек, введите команду:
Copyhelm search repo vm/Вывод будет следующим:
NAME CHART VERSION APP VERSION DESCRIPTION vm/victoria-metrics-agent 0.7.20 v1.87.6 Victoria Metrics Agent - collects metrics from ... vm/victoria-metrics-alert 0.3.34 v1.87.6 Victoria Metrics Alert - executes a list of giv... vm/victoria-metrics-auth 0.2.23 v1.87.6 Victoria Metrics Auth - is a simple auth proxy ... vm/victoria-metrics-cluster 0.8.32 v1.87.6 Victoria Metrics Cluster version - high-perform... vm/victoria-metrics-k8s-stack 0.2.9 v1.87.6 Kubernetes monitoring on VictoriaMetrics stack.... vm/victoria-metrics-operator 0.1.17 0.32.0 Victoria Metrics Operator vm/victoria-metrics-single 0.7.5 v1.87.6 Victoria Metrics Single version - high-performa...Установите кластер VictoriaMetricss с помощью Helm. Для переопределения образов для Helm можно использовать флаг
--setв командеhelm install:cat <<EOF | helm install vmcluster vm/victoria-metrics-cluster -f - vmselect: podAnnotations: prometheus.io/scrape: "true" prometheus.io/port: "8481" vminsert: podAnnotations: prometheus.io/scrape: "true" prometheus.io/port: "8480" vmstorage: podAnnotations: prometheus.io/scrape: "true" prometheus.io/port: "8482" EOFЗапуск команды
helm install vmcluster vm/victoria-metrics-clusterустанавливает кластер VictoriaMetrics в namespace по умолчанию внутри созданного кластера.Команда
podAnnotations: prometheus.io/scrape: "true"иpodAnnotations:prometheus.io/port: "some_port"запускает сбор метрик из podvmselect,vminsertиvmstorageи из их портов.Вывод будет следующим:
NAME: vmcluster LAST DEPLOYED: Thu Jun 1 09:41:57 2023 NAMESPACE: default STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Write API:Примечание
Все образы в манифестах пользователей будут содержать информацию из реестра DropApp.
Получите URL-адрес службы вставки
vminsertVictoriaMetrics, выполнив команды:export POD_NAME=$(kubectl get pods --namespace default -l "app=vminsert" -o jsonpath="{.items[0].metadata.name}") kubectl --namespace default port-forward $POD_NAME 8480Обновите файл конфигурации Prometheus и добавьте в него следующие строки:
prometheus.yml remote_write: - URL: "http://<insert-service>/insert/0/prometheus/"Где
<insert-service>- insert-сервис.Получите доступ к API VictoriaMetrics через порт 8481 со следующим DNS-именем из кластера:
vmcluster-victoria-metrics-cluster-vmselect.default.svc.cluster.localПолучите URL-адрес службы VictoriaMetrics, выполнив команду:
export POD_NAME=$(kubectl get pods --namespace default -l "app=vmselect" -o jsonpath="{.items[0].metadata.name}") kubectl --namespace $POD_NAME 8481Укажите URL-адрес службы в Grafana:
Примечание
В качестве источника данных необходимо выбрать Prometheus.
Введите это поле URL в Grafana:
http://<select-service>/select/0/prometheus/Где
<select-service>- select-сервис.Убедитесь, что pods кластера VictoriaMetrics запущены и работают, выполнив следующую команду:
kubectl get podsВывод будет следующим:
NAME READY STATUS RESTARTS AGE vmcluster-victoria-metrics-cluster-vminsert-689cbc8f55-95szg 1/1 Running 0 16m vmcluster-victoria-metrics-cluster-vminsert-689cbc8f55-f852l 1/1 Running 0 16m vmcluster-victoria-metrics-cluster-vmselect-977d74cdf-bbgp5 1/1 Running 0 16m vmcluster-victoria-metrics-cluster-vmselect-977d74cdf-vzp6z 1/1 Running 0 16m vmcluster-victoria-metrics-cluster-vmstorage-0 1/1 Running 0 16m vmcluster-victoria-metrics-cluster-vmstorage-1 1/1 Running 0 16mУстановите
vmagentиз Helm, выполните следующую команду:helm install vmagent vm/victoria-metrics-agent -f https://<repoexample.ru>.ru/guides/victoriametrics.yaml # Укажите актуальный путь до локального репозиторияПолное содержание файла victoriametrics.yaml:
victoriametrics.yaml
# remoteWriteUrls: - http://vmcluster-victoria-metrics-cluster-vminsert.default.svc.cluster.local:8480/insert/0/prometheus/ config: global: scrape_interval: 10s scrape_configs: - job_name: vmagent static_configs: - targets: ["localhost:8429"] - job_name: "kubernetes-api-servers" kubernetes_sd_configs: - role: endpoints scheme: HTTPs tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token relabel_configs: - source_labels: [ __meta_kubernetes_namespace, __meta_kubernetes_service_name, __meta_kubernetes_endpoint_port_name, ] action: keep regex: default;kubernetes;HTTPs - job_name: "kubernetes-nodes" scheme: HTTPs tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/$1/proxy/metrics - job_name: "kubernetes-nodes-cadvisor" scheme: HTTPs tls_config: ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt insecure_skip_verify: true bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token kubernetes_sd_configs: - role: node relabel_configs: - action: labelmap regex: __meta_kubernetes_node_label_(.+) - target_label: __address__ replacement: kubernetes.default.svc:443 - source_labels: [__meta_kubernetes_node_name] regex: (.+) target_label: __metrics_path__ replacement: /api/v1/nodes/$1/proxy/metrics/cadvisor metric_relabel_configs: - action: replace source_labels: [pod] regex: '(.+)' target_label: pod_name replacement: '${1}' - action: replace source_labels: [container] regex: '(.+)' target_label: container_name replacement: '${1}' - action: replace target_label: name replacement: k8s_stub - action: replace source_labels: [id] regex: '^/system\.slice/(.+)\.service$' target_label: systemd_service_name replacement: '${1}' - job_name: "kubernetes-service-endpoints" kubernetes_sd_configs: - role: endpoints relabel_configs: - action: drop source_labels: [__meta_kubernetes_pod_container_init] regex: true - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape] action: keep regex: true - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] action: replace target_label: __scheme__ regex: (HTTPs?) - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [ __address__, __meta_kubernetes_service_annotation_prometheus_io_port, ] action: replace target_label: __address__ regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2 - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_service_name] action: replace target_label: kubernetes_name - source_labels: [__meta_kubernetes_pod_node_name] action: replace target_label: kubernetes_node - job_name: "kubernetes-service-endpoints-slow" scrape_interval: 5m scrape_timeout: 30s kubernetes_sd_configs: - role: endpoints relabel_configs: - action: drop source_labels: [__meta_kubernetes_pod_container_init] regex: true - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scrape_slow] action: keep regex: true - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_scheme] action: replace target_label: __scheme__ regex: (HTTPs?) - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [ __address__, __meta_kubernetes_service_annotation_prometheus_io_port, ] action: replace target_label: __address__ regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2 - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_service_name] action: replace target_label: kubernetes_name - source_labels: [__meta_kubernetes_pod_node_name] action: replace target_label: kubernetes_node - job_name: "kubernetes-services" metrics_path: /probe params: module: [HTTP_2xx] kubernetes_sd_configs: - role: service relabel_configs: - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_probe] action: keep regex: true - source_labels: [__address__] target_label: __param_target - target_label: __address__ replacement: blackbox - source_labels: [__param_target] target_label: instance - action: labelmap regex: __meta_kubernetes_service_label_(.+) - source_labels: [__meta_kubernetes_namespace] target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_service_name] target_label: kubernetes_name - job_name: "kubernetes-pods" kubernetes_sd_configs: - role: pod relabel_configs: - action: drop source_labels: [__meta_kubernetes_pod_container_init] regex: true - action: keep_if_equal source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_port, __meta_kubernetes_pod_container_port_number] - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_scrape] action: keep regex: true - source_labels: [__meta_kubernetes_pod_annotation_prometheus_io_path] action: replace target_label: __metrics_path__ regex: (.+) - source_labels: [__address__, __meta_kubernetes_pod_annotation_prometheus_io_port] action: replace regex: ([^:]+)(?::\d+)?;(\d+) replacement: $1:$2 target_label: __address__ - action: labelmap regex: __meta_kubernetes_pod_label_(.+) - source_labels: [__meta_kubernetes_namespace] action: replace target_label: kubernetes_namespace - source_labels: [__meta_kubernetes_pod_name] action: replace target_label: kubernetes_pod_nameГде
remoteWriteUrls: - http://vmcluster-victoria-metrics-cluster-vminsert.default.svc.cluster.local:8480/insert/0/prometheus/настраиваетvmagentдля записи очищенных метрик в файлvmselect service.Вторая часть этого yaml-файла добавляет раздел
metric_relabel_configs, выводит метрики на панели управления Grafana.Выполните команду и убедитесь, что
vmagentзапущен:kubectl get pods | grep vmagentВывод отобразит следующее:
vmagent-victoria-metrics-agent-69974b95b4-mhjph 1/1 Running 0 11mДобавьте репозиторий Grafana:
Copyhelm repo add grafana https://<repoexample.ru>/helm-charts helm repo update # Укажите актуальный путь до локального репозиторияДобавьте источник данных VictoriaMetrics с названием релиза
my-grafana:my-grafana.yaml
helm install my-grafana grafana/grafana -f - datasources: datasources.yaml: apiVersion: 1 datasources: - name: victoriametrics type: prometheus orgId: 1 url: http://vmcluster-victoria-metrics-cluster-vmselect.default.svc.cluster.local:8481/select/0/prometheus/ access: proxy isDefault: true updateIntervalSeconds: 10 editable: true dashboardProviders: dashboardproviders.yaml: apiVersion: 1 providers: - name: 'default' orgId: 1 folder: '' type: file disableDeletion: true editable: true options: path: /var/lib/grafana/dashboards/default dashboards: default: victoriametrics: gnetId: 11176 revision: 18 datasource: victoriametrics vmagent: gnetId: 12683 revision: 7 datasource: victoriametrics kubernetes: gnetId: 14205 revision: 1 datasource: victoriametricsВ результате применения манифеста выполнена следующая последовательность:
установлена Grafana из репозитория Helm;
подготовлен источник данных VictoriaMetrics с URL-адресом из шага 4;
добавлена информационная панель VictoriaMetrics:
https://<repoexample.ru>m/grafana/dashboards/11176-victoriametrics-cluster/;добавлена информационная панель для агента VictoriaMetrics:
https://<repoexample.ru>/grafana/dashboards/12683-victoriametrics-vmagent/;добавлена панель мониторинга для наблюдения метрик кластера DropApp:
https://<repoexample.ru>/grafana/dashboards/14205-kubernetes-cluster-monitoring-via-prometheus/.
Просмотрите журнал вывода, скопируйте, вставьте и запустите адреса из шага 14.
Чтобы получить пароль администратора Grafana, выполните команду:
kubectl get secret --namespace default my-grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echoСохраните пароль в файл на компьютере.
Чтобы получить доступ к сервису Grafana в веб-браузере, выполните следующую команду:
export POD_NAME=$(kubectl get pods --namespace default -l "app.kubernetes.io/name=grafana,app.kubernetes.io/instance=my-grafana" -o jsonpath="{.items[0].metadata.name}")Используйте команду для прослушивания порта
3000на pod с именем, указанным в переменной окруженияPOD_NAME:kubectl --namespace default port-forward $POD_NAME 3000Откройте в браузере
http://127.0.0.1:3000/dashboardsи выберите панель мониторингаCluster Monitoring (via Prometheus). Используйте логинadminдля входа и пароль который был получен в шаге 15.В выводе будет отображаться страница с метриками использования памяти, процессора и файловой системы кластера.