Кластеры Kubernetes
Кластеры Kubernetes используются в высоконагруженных информационных системах для управления распределением трафика и автоматического масштабирования узлов. Ключевые особенности:
- Отказоустойчивость.
- Автоматическое масштабирование.
- Эффективное распределение трафика с помощью выделенных балансировщиков нагрузки.
В контейнерах Kubernetes можно быстро запускать и управлять тестовыми средами и, таким образом, автоматизировать и упростить процессы разработки и тестирования. Преимущества:
- Быстрое создание большого количества тестовых сред Kubernetes.
- Развёртывание экземпляров кластеров Kubernetes версии 1.26.5.
- Снижение затрат на хостинг тестовых сред до 3 раз.
- Автоматизация процессов
CI/CD. - Стандартизация разработки в распределенных командах и при работе с аутсорсерами.
Создание и запуск кластера осуществляется при помощи Портала самообслуживания (подробнее — в Руководстве пользователя VK Private Cloud).
Для обеспечения постоянного хранения данных, в 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.yaml$ kubectl get pvc$ kubectl 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 приведена в Руководстве пользователя VK Private Cloud в разделе Подключение к кластеру через Kubectl.
Инструкция по настройке доступа к Kubernetes Dashboard приведена в Руководстве пользователя VK Private Cloud в разделе Подключение к Kubernetes Dashboard.
Доступно вертикальное и горизонтальное масштабирование кластера Kubernetes (с настройками автомасштабирования), подробнее — в Руководстве пользователя VK Private Cloud.
Конфигурация позволяет понять, с каким Kubernetes-кластером взаимодействует kubectl. Подробная информация о структуре конфигурационного файла приведена в статье Configure Access to Multiple Clusters.
Чтобы получить объединённые настройки kubeconfig, выполните команду:
$ kubectl --insecure-skip-tls-verify=true --kubeconfig rk12_kubeconfig.yaml config
Чтобы использовать несколько файлов kubeconfig одновременно и посмотреть объединённую конфигурацию из этих файлов, выполните команды:
$ KUBECONFIG=~/.kube/kubconfig1:~/.kube/kubconfig2$ kubectl --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). Подробности приведены в данной инструкции.