Kubernetes. ReplicaSet. Отказоустойчивость Pods
Описание
Создадим несколько подов с nginx. Для этого нужно использовать другую абстракцию Kubernetes. ReplicaSet следит за количеством подов по шаблону, который мы указываем. В этом шаблоне мы можем указать метку нашего приложения, в моем примере это my-nginx, и количество запущенных реплик.
Настройка
nano ./replicaset-nginx.yaml
apiVersion: apps/v1 kind: ReplicaSet metadata: name: replicaset-nginx spec: replicas: 2 selector: matchLabels: app: my-nginx template: metadata: labels: app: my-nginx spec: containers: - image: nginx:1.16 name: nginx ports: - containerPort: 80
Запускаем replicaset
kubectl apply -f replicaset-nginx.yaml
Проверяем, что получилось
kubectl get replicaset
NAME DESIRED CURRENT READY AGE replicaset-nginx 2 2 2 18m
Нам нужно было 2 реплики и мы их получили. С помощью edit мы можем на ходу редактировать replicaset, к примеру, добавляя количество реплик
kubectl edit replicaset replicaset-nginx
Репликасет сама следит за количеством запущенных подов. Если один из них по какой-то причине упадет или будет удален, она поднимет его заново. Можете проверить это сами, вручную удалив один из подов. Спустя некоторое время он появится снова.
kubectl get pod
NAME READY STATUS RESTARTS AGE pod-nginx 1/1 Running 0 15m replicaset-nginx-f87qf 1/1 Running 0 22m replicaset-nginx-mr4kw 1/1 Running 0 22m
kubectl delete pod replicaset-nginx-f87qf
... pod "replicaset-nginx-f87qf" deleted ...
kubectl get replicaset
NAME DESIRED CURRENT READY AGE replicaset-nginx 2 2 2 23m
kubectl get pod
NAME READY STATUS RESTARTS AGE pod-nginx 1/1 Running 0 16m replicaset-nginx-g4l58 1/1 Running 0 14s replicaset-nginx-mr4kw 1/1 Running 0 23m
Я удалил replicaset-nginx-f87qf, вместо него тут же был запущен новый replicaset-nginx-g4l58. Наглядный пример одного из механизмов отказоустойчивости в кластере kubernetes на уровне подов. Кубернетис будет следить за количеством реплик на основе их label. Если вы через replicaset указали запустить 2 реплики приложения с меткой my-nginx, ни меньше, ни больше подов с этой меткой вы запустить не сможете. Если вы вручную запустите pod с меткой my-nginx, он будет тут же завершен, если у вас уже есть 2 пода с такими метками от replicaset.
Replicaset запускает поды на разных нодах. Проверить это можно, посмотрев расширенную информацию о подах.
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES replicaset-nginx-cmfnh 1/1 Running 0 2m26s 10.233.67.6 kub-node-1 <none> <none> replicaset-nginx-vgxfl 1/1 Running 0 2m26s 10.233.68.4 kub-node-2 <none> <none>
Таким образом, если у вас одна нода выйдет из строя, кластер автоматически запустит умершие поды на новых нодах. При этом, если нода вернется обратно с запущенными подами на ней, kubernetes автоматически прибьет лишние поды, чтобы их максимальное количество соответствовало информации из шаблона replicaset.
Удаляются replicaset так же как и поды.
kubectl delete rs replicaset-nginx
replicaset.extensions "replicaset-nginx" deleted
Вместо длинного replicaset я использовал сокращение rs. Это бывает удобно для абстракций с длинными названиями. Для всех них кубернетис поддерживает сокращения.