Kubernetes
Описание
K8s — это открытое программное обеспечение для автоматизации развертывания, масштабирования и управления приложениями в контейнеризированных средах. Оно упрощает работу с контейнерами, обеспечивая надежность, масштабируемость и автоматизацию.
Используем клиент-серверную архитектуру (работает по REST)
Описывается как 5 бинарных файлов
Главные понятия
-
Cluster - вся управляемая Kubernetes система
-
Node - машина внутри кластера
-
Control plane - компоненты, принимающие решения об управлении кластером.
-
Worker node - машина, на которой запускаются приложения.
-
Pod - минимальная запускаемая единица Kubernetes, обычно содержит один основной контейнер
-
Deployment - управляет количеством Pod и обновлением приложения.
-
Service - предоставляет стабильный адрес для группы Pod.
Упращенная цепочка:
graph TD
A[Deployment]
--> B[ReplicaSet]
B --> C[Pods]
C --> D[Containers]
Важное отличие
-
Docker или другой container runtime запускает контейнер.
-
Kubernetes решает, где, когда и в каком количестве эти контейнеры должны работать.
Архитектура
Компоненты Control Plane
kube-apiserver
Описание
- центральная точка входа; принимает запросы от
kubectlи компонентов кластера.
etcd
Описание
- база данных состояния кластера
kube-controller-manager
Описание
- запускает контроллеры, которые сверяют желаемое и фактическое состояния.
kube-scheduller
Описание
- выбирает Node для нового Pod
Компоненты Worker Node
kubelet
Описание
- агент Node; следит, чтобы назначенные Pod работали
Container runtime
Описание
- запускает контейнеры.
kube-proxy
Описание
- помогает направлять сетевой трафик.
Логика работы
После выполнения команды kubectl apply -f deployment.yaml происходит примерно следующее:
1) kubectl направляет манифест API-серверу
2) API-сервер проверяет запрос и сохраняет состояние в etcd
3) Deployment-контроллер создает ReplicaSet
4) ReplicaSet создает необходимые Pod
5) Scheduler назначает каждому Pod подходящую Node
6) kubelet на этой Node запускает контейнер
7) Контроллеры продолжают следить, чтобы фактическое состояние совпадало с желаемым.
Манифест
Рассмотрим следующий пример:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
labels:
app: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:1.27
ports:
- name: http
containerPort: 80
apiVersion - версия Kubernetes API
kind - тип объекта, здесь Deployment
metadata.name - имя объекта
spec.replicas:3 - желаемое число Pod
selector - правило поиска принадлежащих Deployment Pod
template - шаблон создаваемых Pod
containers - контейнеры внутри каждого Pod