Кластеры Kubernetes
Кластеры Kubernetes используются в высоконагруженных информационных системах для управления распределением трафика и автоматического масштабирования узлов. Ключевые особенности:
- Отказоустойчивость.
- Автоматическое масштабирование.
- Эффективное распределение трафика с помощью выделенных балансировщиков нагрузки.
Также в контейнерах Kubernetes можно быстро запускать и управлять тестовыми средами и, таким образом, автоматизировать и упростить процессы разработки и тестирования. Преимущества:
- Быстрое создание большого количества тестовых сред Kubernetes.
- Снижение затрат на хостинг тестовых сред до 3 раз.
- Автоматизация процессов
CI/CD. - Стандартизация разработки в распределенных командах и при работе с аутсорсерами.
Создание и запуск кластера осуществляется при помощи Портала самообслуживания. Подробная пошаговая инструкция приведена в Руководстве пользователя Платформы.
Для обеспечения постоянного хранения данных, в Kubernetes существуют следующие виды ресурсов:
- PersistentVolume (PV) — раздел на жёстком диске, доступном из кластера. Взаимодействие кластера с PV осуществляется так же, как с узлами.
- PersistentVolumeClaim (PVC) — пользовательский запрос на использование данного диска. Взаимодействие PV с PVC осуществляется так же, как рабочий узел взаимодействует с подами, то есть PVC запрашивает у PV необходимый размер диска и тип доступа —
ReadWriteOnce,ReadOnlyManyилиReadWriteMany.
Подключение PV и PVC выполняется автоматически из кластера на основании Storage class, интегрированного с Cinder.
apiVersion: v1kind: PersistentVolumeClaimmetadata:name: portal-info-data-pvcspec:volumeMode: FilesystemaccessModes:- ReadWriteManyresources:requests:storage: 100GivolumeName: "portal-info-data-pv"storageClassName: ""
kubectl create -f new-pvc.yamlkubectl get pvckubectl get pv | grep new-pvc
Подробная инструкция по подключению к NFS с помощью Persistent Volume и Persistent Volume Claim приведена в данной инструкции.
Kubernetes Dashboard представляет собой графический интерфейс для управления контейнерами Kubernetes.
Локальный клиент для Kubernetes kubectl позволяет использовать команды для кластеров Kubernetes. Можно использовать kubectl для развертывания приложений, проверки ресурсов кластера и управления ими, а также для просмотра журналов.
Чтобы проверить актуальность установленной версии kubectl:
-
Узнайте номер последней стабильной версии клиента
kubectl: например, по ссылке запроса стабильной версии. -
Проверьте текущую версию
kubectl, чтобы убедиться, что она совместима с версией API сервера кластера:kubectl version
Установка выполняется штатными средствами используемой операционной системы (см. официальную документацию).
Инструкция по подключению kubectl к кластеру Kubernetes приведена в п. «Подключение к кластеру через Kubectl» Руководства пользователя Платформы.
Инструкция по настройке доступа к Kubernetes Dashboard приведена в п. «Подключение к Kubernetes Dashboard» Руководства пользователя Платформы.
Система мониторинга Prometheus — опциональное дополнение, которое можно выбрать при установке кластера. Prometheus предоставляет возможности по сбору метрик производительности кластера, формированию запросов и экспорту показателей мониторинга.
Чтобы установить систему мониторинга в кластер в Портале самообслуживания:
-
В меню слева перейдите в раздел «Контейнеры» на страницу «Кластеры Kubernetes».
-
При создании кластера в разделе «Предустановленные сервисы» выберите пункт «Мониторинг» (см. рисунок 1).
Рисунок 1 — Установка сервиса «Мониторинг» в создаваемый кластер KubernetesДождитесь завершения операции.
-
Скачайте файл конфигурации, чтобы просмотреть созданные ресурсы в пространстве имён
prometheus-monitoring:- Выберите кластер.
- Нажмите на кнопку «•••» справа от названия кластера и выберите пункт «Получить Kubeconfig для доступа к кластеру».
-
Выполните со скачанным файлом следующую операцию в
kubectl:Команда вывода подов мониторингаkubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml get po,svc,ingress -n prometheus-monitoringПример вывода командыNAME READY STATUS RESTARTS AGEpod/alertmanager-prometheus-alertmanager-0 2/2 Running 0 8dpod/prometheus-operator-ff9d98748-bgssd 2/2 Running 0 8dpod/prometheus-operator-grafana-567c7bc9c6-spq4s 2/2 Running 0 8dpod/prometheus-operator-kube-state-metrics-5c7847f9bc-m855b 1/1 Running 0 8dpod/prometheus-operator-prometheus-node-exporter-chlw7 1/1 Running 0 8dpod/prometheus-operator-prometheus-node-exporter-fn9pw 1/1 Running 0 8dpod/prometheus-prometheus-prometheus-0 3/3 Running 1 8dNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 8dservice/prometheus-alertmanager ClusterIP 10.254.109.80 <none> 9093/TCP 8dservice/prometheus-operated ClusterIP None <none> 9090/TCP 8dservice/prometheus-operator ClusterIP 10.254.54.102 <none> 8080/TCP,443/TCP 8dservice/prometheus-operator-grafana ClusterIP 10.254.227.161 <none> 80/TCP 8dservice/prometheus-operator-kube-state-metrics ClusterIP 10.254.44.179 <none> 8080/TCP 8dservice/prometheus-operator-prometheus-node-exporter ClusterIP 10.254.162.159 <none> 9100/TCP 8dservice/prometheus-prometheus ClusterIP 10.254.200.61 <none> 9090/TCP 8dNAME HOSTS ADDRESS PORTS AGEingress.extensions/prometheus-alertmanager alertmanager.rk12.mcs.mail.ru 10.31.129.13 80, 443 8dingress.extensions/prometheus-operator-grafana grafana.rk12.mcs.mail.ru 10.31.129.13 80, 443 8dingress.extensions/prometheus-prometheus prometheus.rk12.mcs.mail.ru 10.31.129.13 80, 443 8d
Чтобы получить доступ к графическому интерфейсу Prometheus/Grafana/Alertmanager UI кластера:
-
Настройте локальное проксирование запросов:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml proxy -
Откройте веб-браузер и перейдите по соответствующему адресу размещения визуального интерфейса:
http://localhost:8001/api/v1/namespaces/prometheus-monitoring/services/prometheus-prometheus:9090/proxyhttp://localhost:8001/api/v1/namespaces/prometheus-monitoring/services/prometheus-operator-grafana:80/proxyhttp://localhost:8001/api/v1/namespaces/prometheus-monitoring/services/prometheus-alertmanager:9093/proxy
Сервис Ingress Controller — опциональное дополнение, которое можно выбрать при установке кластера. Ingress Controller интегрируется с облачным балансировщиком нагрузки на базе OpenStack Octavia и поддерживает Proxy Protocol.
Чтобы получать запросы из внешних сетей, требуется сопоставить балансировщик нагрузки и Ingress Controller в Портале самообслуживания:
-
В меню слева перейдите в раздел «Контейнеры» на страницу «Кластеры Kubernetes».
-
При создании кластера в разделе «Предустановленные сервисы» выберите пункт «Ingress Controller» (см. рисунок 2).
Рисунок 2 — Установка сервиса «Ingress Controller» в создаваемый кластер KubernetesДождитесь завершения операции.
-
В меню слева перейдите в раздел «Виртуальные сети» на страницу «Балансировщики нагрузки». Появится список созданных балансировщиков с именами вида
kube_service_<UUID>. -
Сопоставьте выбранный балансировщик нагрузки с Ingress Controller внутри кластера по внешнему IP адресу:
-
Выберите балансировщик.
-
Нажмите на кнопку «•••» справа от названия кластера и выберите пункт «Назначить внешний IP» (см. рисунок 3).
Рисунок 3 — Меню назначения внешнего IP балансировщика -
В открывшемся окне выберите требуемый IP-адрес и нажмите на кнопку «Подтвердить» (см. рисунок 4).
Рисунок 4 — Выбор внешнего IP для балансировщика -
-
Настройте правила балансировки:
-
Выберите балансировщик, нажав на его имя в списке.
-
Нажмите на кнопку «Добавить правило».
-
В открывшемся окне укажите параметры балансировки и сохраните изменения (см. рисунок 5).
Рисунок 5 — Просмотр информации о балансировщике
-
Доступно вертикальное и горизонтальное масштабирование кластера Kubernetes (с настройками автомасштабирования), см. Руководство пользователя Платформы.
Конфигурация позволяет понять, с каким Kubernetes-кластером взаимодействует kubectl. Подробную информацию о структуре конфигурационного файла см. в статье Configure Access to Multiple Clusters.
Чтобы получить объединённые настройки kubeconfig, используйте следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml config
Чтобы использовать несколько файлов kubeconfig одновременно и посмотреть объединённую конфигурацию из этих файлов, используйте следующие команды:
KUBECONFIG=~/.kube/kubconfig1:~/.kube/kubconfig2kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml config view
Чтобы получить значение параметра из конфигурации, например, пароль для пользователя, используйте ключ -о:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml config view -o jsonpath='{.users[?(@.name == "<ЛОГИН_ИНТЕРЕСУЮЩЕГО_ПОЛЬЗОВАТЕЛЯ>")].user.password}'
Чтобы получить список объектов выполнения утилиты kubectl, используйте следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml config get-contexts
Чтобы получить текущий объект выполнения, используйте следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml config current-context
Чтобы установить другой кластер в качестве контекста выполнения утилиты kubectl по умолчанию, используйте следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml config use-context <НАИМЕНОВАНИЕ_КЛАСТЕРА>;
Deployment — это объект Kubernetes, представляющий набор множества идентичных контейнеров без уникальных номеров. Deployment позволяет запускать несколько реплик приложений и автоматически заменять экземпляры приложений в случае сбоя.
Чтобы создать новый Deployment, выполните следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml create deployment <НАЗВАНИЕ> --image=<НАИМЕНОВАНИЕ_ОБРАЗА_КОНТЕЙНЕРА>
Чтобы посмотреть текущий Deployment, выполните следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml describe deployment <НАИМЕНОВАНИЕ_DEPLOYMENT>
apiVersion: apps/v1kind: Deploymentmetadata:name: nginxspec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.7.9ports:- containerPort: 80
В данном примере создаётся три идентичных контейнера с именем nginx на базе образа Nginx версии 1.7.9. Доступ к контейнерам осуществляется по 80-му порту.
При обновлении Deployment Kubernetes последовательно перезапускает контейнеры с новой конфигурацией, при этом прежние контейнеры не удаляются, пока не будут успешно запущено достаточное количество новых контейнеров.
Чтобы выполнить обновление Deployment, выполните следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml apply -f <НАИМЕНОВАНИЕ_DEPLOYMENT>
Чтобы получить список текущих контейнеров, выполните следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml get po -n <НАИМЕНОВАНИЕ_ПРОСТРАНСТВА_ИМЁН>
Чтобы получить список журналов конкретного контейнера, выполните следующую команду:
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml -n <НАИМЕНОВАНИЕ_ПРОСТРАНСТВА_ИМЁН> logs <ИМЯ_КОНТЕЙНЕРА>
Системные контейнеры расположены в пространстве имён kube-system. Наиболее востребованные контейнеры:
cluster-autoscaler-* — журнал событий масштабирования контейнеров.openstack-cloud-controller-* — журнал взаимодействия всех компонентов платформы виртуализации (например, с Cinder для создания дисков, с Nova для создания ВМ, Octavia для балансировщиков и так далее).
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml -n kube-system logs cluster-autoscaler-7f754489f8-qxsqf...I1230 08:33:58.952822 1 filter_out_schedulable.go:90] No schedulable podsI1230 08:33:58.952850 1 static_autoscaler.go:334] No unschedulable podsI1230 08:33:58.952877 1 static_autoscaler.go:381] Calculating unneeded nodes....84c14039e967,Unschedulable:false,Taints:[]Taint{Taint{Key:CriticalAddonsOnly,Value:True,Effect:NoSchedule,TimeAdded:<nil>,},Taint{Key:dedicated,Value:master,Effect:NoSchedule,TimeAdded:<nil>,},},ConfigSource:nil,PodCIDRs:[],}...
kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml -n kube-system logs openstack-cloud-controller-manager-nnrlx...Ensuring load balancer for service ingress-nginx/nginx-ingress-controllerE1222 08:23:53.451038 1 service_controller.go:255] error processing service ingress-nginx/nginx-ingress-controller (will retry): failed to ensure load balancer: there are no available nodes for LoadBalancer service ingress-nginx/nginx-ingress-controllerI1222 08:23:53.451162 1 event.go:255] Event(v1.ObjectReference{Kind:"Service", Namespace:"ingress-nginx", Name:"nginx-ingress-controller", UID:"68bb8ac5-b7f4-4404-94b2-943e7e55ddc9", APIVersion:"v1", ResourceVersion:"953", FieldPath:""}): type: 'Normal' reason: 'EnsuringLoadBalancer' Ensuring load balancer...
Helm — менеджер пакетов для Kubernetes, который используется для быстрой установки сложных приложений, таких как CRM, e-commerce, БД и прочие.
Helm доступен в созданных кластерах по умолчанию.
StatefulSet — это удобный способ работы со Stateful-приложениями, которым требуется обрабатывать события об остановке работы Pod и осуществления Graceful Shutdown. Обычно, такие приложения — это базы данных и очереди сообщений, которые работают в нескольких экземплярах, синхронизируемых друг с другом посредством репликации или кластеризации.
Существует несколько способов организации таких схем: с использованием общих Persistent Volumes (RWX) и с помощью индивидуальных Persistent Volumes (RWO). Подробности см. в данной инструкции.