Главная
АИ #25 (155)
Статьи журнала АИ #25 (155)
Анализ функциональности и ограничений объекта ReplicaSet в Kubernetes: исследова...

Анализ функциональности и ограничений объекта ReplicaSet в Kubernetes: исследование механизмов репликации и автоматического масштабирования

Автор(-ы):

Феоктистов Илья Александрович

21 июня 2023

Секция

Информационные технологии

Ключевые слова

pod
Kubernetes
ReplicaSet
репликация
автоматическое масштабирование
контейнеры

Аннотация статьи

В данной статье рассматривается объект ReplicaSet в среде Kubernetes и его роль в обеспечении надежной и автоматической репликации подов. Автор описывает основные принципы работы ReplicaSet, его функциональные возможности, а также взаимосвязь с другими объектами Kubernetes, такими как поды и селекторы. Основное внимание уделяется механизму поддержания требуемого числа подов и горизонтальному масштабированию. В статье представлены примеры использования и изменения ReplicaSet, а также рассмотрены возможные проблемы и ограничения. Данная работа представляет практическую ценность для разработчиков и администраторов, работающих с Kubernetes, и может быть использована в качестве руководства для эффективного управления подами в кластере.

Текст статьи

1. Введение

В современной информационной технологии все больше внимания уделяется контейнеризации и оркестрации приложений. Одной из наиболее популярных платформ для управления контейнерами является Kubernetes. Он предоставляет мощный набор инструментов для развертывания, масштабирования и управления приложениями в контейнерах.

В рамках Kubernetes, объект ReplicaSet занимает важное место в обеспечении надежной и автоматической репликации подов. ReplicaSet гарантирует, что требуемое количество подов всегда поддерживается в рабочем состоянии. В случае сбоев или отказов, ReplicaSet автоматически создает новые реплики подов, чтобы сохранить стабильность и доступность приложения.

Целью данной статьи является изучение и подробный анализ объекта ReplicaSet в Kubernetes. Мы рассмотрим его основные принципы работы, функциональные возможности, а также его взаимодействие с другими объектами Kubernetes. Особое внимание будет уделено механизму поддержания требуемого числа подов и горизонтальному масштабированию.

Мы также рассмотрим создание и изменение ReplicaSet с использованием манифестов, а также рассмотрим возможные проблемы и ограничения. Представленные в статье примеры использования ReplicaSet позволят разработчикам и администраторам эффективно управлять подами в кластере Kubernetes.

В итоге, данная работа представляет практическую ценность и может служить как руководство для разработчиков и администраторов, которые работают с Kubernetes и стремятся обеспечить надежность, масштабируемость и автоматизацию работы с подами в своих приложениях.

2. Основные принципы работы и функциональные возможности ReplicaSet

Pod – это объект Kubernetes, представляющий собой группу из одного или нескольких контейнеров. В реальной работе в кластере могут быть сотни и тысячи подов. Но в реальной работе требуется, чтобы они запускались, поддерживались в рабочем состоянии и оставались здоровыми без какого-либо ручного вмешательства. Поэтому поды почти никогда не создаются напрямую. Вместо этого их создают другие объекты, такие как ReplicaSet.

ReplicaSet – это Объект в Kubernetes представляет собой мощный механизм, обеспечивающий надежную репликацию и автоматическое масштабирование подов. Если под исчезает по любой причине, например в случае падения ноды, реплика сет замечает это и создает сменный под.

  • ReplicaSet гарантирует, что под или несколько реплик пода всегда работает путем запуска нового пода, если существующий пропадает;
  • когда одна из рабочих нод аварийно завершает работу, он создает сменные реплики для всех подов, которые работали на отказавшем узле
  • обеспечивает горизонтальное масштабирование подов

ReplicaSet постоянно отслеживает список запущенных подов и удостоверяется, что фактическое количество подов определенного типа всегда совпадает с требуемым числом. Если запущено слишком мало реплик, то из шаблона создаются новые. Если запущено слишком много таких подов, то он удаляет лишние реплики.

Управление ReplicaSet в Kubernetes осуществляется с помощью манифеста. Манифест ReplicaSet содержит конфигурационные параметры и настройки, которые определяют желаемое состояние и поведение ReplicaSet. В манифесте указывается количество реплик, селекторы лейблов и шаблон пода, используемый для создания новых реплик. Фактическое управление ReplicaSet и его репликами осуществляется Kubernetes-контроллерами, которые интерпретируют манифесты и обеспечивают соответствующие действия для достижения указанного состояния.

Пример манифеста ReplicaSet:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: frontend
  labels:
    app: guestbook
    tier: frontend
spec:
  # modify replicas according to your case
  replicas: 3
  selector:
    matchLabels:
      tier: frontend
  template:
    metadata:
      labels:
        tier: frontend
    spec:
      containers:
      - name: php-redis
        image: gcr.io/google_samples/gb-frontend:v3

3. Взаимодействие ReplicaSet с другими компонентами Kubernetes

В рамках данного раздела обратим внимание на структуру описания объекта ReplicaSet. Наибольший интерес представляет блок "spec", содержащий в себе три центральные составляющие:

  1. Количество реплик, указывающее на желаемое число подов, которые следует запустить. В данном экземпляре это составляет три пода.
  2. Селектор лейблов, обеспечивающий определение подов, которые подлежат контролю со стороны указанного ReplicaSet. В данном контексте отслеживаются все поды с лейблом "app: nginx".
  3. Шаблон пода, используемый при генерации новых реплик пода. В данном случае для создания подов применяется лейбл "nginx", основанный на Docker-образе "nginx".

Необходимо отметить потенциальное противоречие: что произойдет в случае несовпадения лейблов в шаблоне подов с лейблами, указанными в селекторе? Опираясь на логику работы ReplicaSet, возможно бесконечное создание подов, что в итоге приведет к переполнению кластера. Однако, на практике Kubernetes не допускает подобного сценария, генерируя ошибку, свидетельствующую о несоответствии между селектором и лейблами шаблона.

После теоретического обзора перейдем к практической части и создадим наш первый ReplicaSet. В этом нам поможет манифест следующего содержания:

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: nginx
  labels:
    app: nginx
    cluster: prod
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx

Далее, применим его в кластер:

# kubectl apply -f rs.yaml
replicaset.apps/nginx created
# kubectl get rs

NAME

nginx

DESIRED

3

CURRENT

3

READY

0

AGE

17s

4. Механизм поддержания требуемого числа подов

Мы можем получить список объектов ReplicaSet, используя команду kubectl get rs. Здесь нам следует обратить внимание на три ключевых поля: 'Desired', 'Current' и 'Ready', которые соответственно обозначают желаемое количество подов, которые должен запустить наш ReplicaSet, текущее количество подов и количество подов в рабочем состоянии. Напомню, что желаемое количество подов мы указываем в параметре 'replicas'.

Давайте проверим, были ли наши поды действительно запущены.

# kubectl get po

NAME

nginx-2g58f

nginx-bg8vb

nginx-kn92n

READY

1/1

1/1

1/1

STATUS

Running

Running

Running

RESTARTS

0

0

0

AGE

2m2s

2m2s

2m2s

Поды, генерируемые объектом ReplicaSet, не являются к нему неотъемлемо привязанными. В любой момент времени ReplicaSet управляет теми подами, которые соответствуют его селектору. Изменение меток пода может привести к его включению в область действия ReplicaSet или исключению из неё. Вплоть до того, что можно переносить поды из одного ReplicaSet в другой.

Исследуем это поведение, изменив метки одного из подов. Наиболее простым способом изменить работающий под является команда kubectl edit pod.

Выполнение команды kubectl edit po nginx-2g58f откроет описание работающего пода в вашем текстовом редакторе. Изменение этого можно осуществить с помощью переменной окружения KUBE_EDITOR.

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Pod
metadata:
  annotations:
    kubernetes.io/limit-ranger: 'LimitRanger plugin set: cpu, memory request for container
      nginx; cpu, memory limit for container nginx'
  creationTimestamp: "2023-06-10T07:43:16Z"
  generateName: nginx-
  labels:
    app: nginx
  name: nginx-2g58f
  namespace: default
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: ReplicaSet
    name: nginx
    uid: 521e76d8-f9fd-427f-97d3-923537b2aec0
  resourceVersion: "25843"
  uid: bd1c38c1-970e-4d9f-960f-bbff24abe494
spec:
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: nginx
    resources:
      limits:
        cpu: 300m
        memory: 200Mi
      requests:
        cpu: 100m
        memory: 100Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: kube-api-access-df8dq
      readOnly: true
  dnsPolicy: ClusterFirst
  enableServiceLinks: true
  nodeName: minikube
  preemptionPolicy: PreemptLowerPriority
  priority: 0
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: default
  serviceAccountName: default
  terminationGracePeriodSeconds: 30
  tolerations:
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
    tolerationSeconds: 300
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
    tolerationSeconds: 300
  volumes:
  - name: kube-api-access-df8dq
    projected:
      defaultMode: 420
      sources:
      - serviceAccountToken:
          expirationSeconds: 3607
          path: token
      - configMap:
          items:
          - key: ca.crt
            path: ca.crt
          name: kube-root-ca.crt
      - downwardAPI:
          items:
          - fieldRef:
              apiVersion: v1
              fieldPath: metadata.namespace
            path: namespace

Допустим, мы решаем изменить метку данного пода с "nginx" на "nginx2".

После этого мы наблюдаем, что ReplicaSet инициирует создание нового пода, в то время как наш изменённый под продолжает функционировать:

# kubectl get po

NAME

nginx-2g58f

nginx-8rzvd

nginx-bg8vb

nginx-kn92n

READY

1/1

1/1

1/1

1/1

STATUS

Running

Running

Running

Running

RESTARTS

0

0

0

0

AGE

4m59s

12s

4m59s

4m59s

Исправим метку на первоначальное значение.

# kubectl get po            

NAME

nginx-2g58f

nginx-bg8vb

nginx-kn92n

nginx-sttlm

READY

1/1

1/1

1/1

1/1

STATUS

Running

Running

Running

Terminating

RESTARTS

0

0

0

0

AGE

6m11s

6m11s

6m11s

8s

Мы можем заметить, что ReplicaSet начинает процесс устранения одного из подов. Важно отметить, что не существует каких-либо гарантий относительно того, какой именно под будет выбран ReplicaSet для удаления.

6. Горизонтальное масштабирование подов

Одной из ключевых возможностей ReplicaSet в Kubernetes является горизонтальное масштабирование подов. ReplicaSet позволяет автоматически масштабировать количество реплик подов в зависимости от текущей нагрузки и требований приложения. Это позволяет гибко и эффективно использовать ресурсы кластера и обеспечивать оптимальную производительность.

При горизонтальном масштабировании ReplicaSet мониторит метрики и нагрузку на поды. Если требуется увеличить масштаб, то автоматически создаются новые реплики подов на основе заданного шаблона. Если же нагрузка снижается или требуется уменьшить масштаб, лишние реплики подов автоматически удаляются.

Как мы видели в примерах кода выше масштабирование подов осуществляется путем изменения значения параметра replicas в манифесте ReplicaSet. При увеличении значения replicas Kubernetes автоматически создает новые реплики подов в соответствии с заданными настройками шаблона. При уменьшении значения replicas Kubernetes автоматически удаляет лишние реплики подов.

Количество реплик, селектор и даже шаблон пода могут быть изменены в любое время. Но изменения шаблона никак не повлияют на уже работающие поды, а влияет только на новые поды, создаваемые этим ReplicaSet. Изменение селектора приводит к выпадению существующих подов из области действия ReplicaSet, и он перестает о них заботиться.

Гибкое и автоматическое горизонтальное масштабирование подов, предоставляемое ReplicaSet, является одной из ключевых функциональностей Kubernetes, которая позволяет эффективно масштабировать и управлять приложениями в распределенных средах с изменчивой нагрузкой.

7. Проблематика и ограничения объекта ReplicaSet в Kubernetes

Несмотря на значительные функциональные возможности, которые предоставляет объект ReplicaSet в Kubernetes, есть ряд проблем и ограничений, с которыми стоит ознакомиться при работе с этим объектом.

Однократность операций: ReplicaSet реализует операции создания, масштабирования и удаления подов в единственный цикл. Это означает, что в случае нарушения процесса репликации или удаления подов в результате ошибки, ReplicaSet не будет автоматически инициировать повторные попытки восстановления. Решение проблем, связанных с этим требует ручного вмешательства или применения дополнительных инструментов, таких как контроллеры состояния (StatefulSet).

Зависимость от селекторов лейблов: для определения подов, которыми необходимо управлять, ReplicaSet использует селекторы лейблов. В случае, если лейблы подов не соответствуют лейблам, указанным в селекторе ReplicaSet, происходит несоответствие, и ReplicaSet прекращает управление такими подами. Это может привести к сбоям в процессе репликации и несоответствию фактического и требуемого количества подов.

Ограничения при обновлении шаблонов подов: в случае необходимости модификации шаблона пода, например, обновления версии контейнера или изменения других параметров, эти модификации не повлияют на уже функционирующие поды. ReplicaSet применяет обновленный шаблон только при создании новых реплик подов. Это может вызвать нежелательные различия между работающими и новыми подами.

8. Заключение

В данной работе были исследованы фундаментальные принципы функционирования и функциональные способности объекта ReplicaSet в рамках Kubernetes. ReplicaSet представляет собой эффективный инструмент для обеспечения надежной и автоматизированной репликации подов, гарантирующий стабильность и доступность приложений.

Мы проанализировали механизмы, поддерживающие требуемое количество подов, осуществляющие горизонтальное масштабирование и взаимодействующие с другими объектами в Kubernetes. Также был изучен процесс создания и модификации объекта ReplicaSet при помощи манифестов.

Однако важно учесть ограничения и проблематику, связанную с ReplicaSet, такие как однократность операций и зависимость от селекторов лейблов. Разработчикам и администраторам рекомендуется проявлять осмотрительность при работе с ReplicaSet и использовать соответствующие решения и инструменты для устранения возникающих проблем.

В целом, ReplicaSet представляет собой ценный инструмент в экосистеме Kubernetes, способствующий созданию и управлению масштабируемыми приложениями. Понимание его функционирования и возможностей способствует эффективному использованию и управлению процессом репликации подов в распределенных средах.

Список литературы

  1. Hierarchical Scaling of Microservices in Kubernetes
  2. https://ieeexplore.ieee.org/document/9196461
  3. Kubernetes in Action, 2nd Edition автор Marko Luksa.
  4. Kubernetes Architecture, Best Practices, and Patterns https://ieeexplore.ieee.org/document/9930690
  5. Auto-scaling Policies to Adapt the Application Deployment in Kubernetes https://ceur-ws.org/Vol-2575/paper6.pdf
  6. Containerization of a polyglot microservice application using Docker and Kubernetes https://arxiv.org/pdf/2305.00600.pdf
  7. Balanced Leader Distribution Algorithm in Kubernetes Clusters https://www.ncbi.nlm.nih.gov/pmc/articles/PMC7865615/
  8. Kubernetes.io: https://kubernetes.io/docs/concepts/workloads/controllers/replicaset/

Поделиться

341

Феоктистов И. А. Анализ функциональности и ограничений объекта ReplicaSet в Kubernetes: исследование механизмов репликации и автоматического масштабирования // Актуальные исследования. 2023. №25 (155). Ч.I.С. 33-38. URL: https://apni.ru/article/6586-analiz-funktsionalnosti-i-ogranichenij-obekta

Похожие статьи

Другие статьи из раздела «Информационные технологии»

Все статьи выпуска
Актуальные исследования

#22 (204)

Прием материалов

25 мая - 31 мая

осталось 6 дней

Размещение PDF-версии журнала

5 июня

Размещение электронной версии статьи

сразу после оплаты

Рассылка печатных экземпляров

14 июня