Какие знаешь части Kubernetes?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Части Kubernetes
Kubernetes (K8s) — это система оркестрации контейнеров, которая автоматизирует развёртывание, масштабирование и управление приложениями в контейнерах. Это сложная распределённая система, состоящая из нескольких компонентов.
Архитектура Kubernetes
Kubernetes состоит из Master Node (Control Plane) и Worker Nodes:
┌─────────────────────────────────────┐
│ KUBERNETES CLUSTER │
├─────────────────────────────────────┤
│ MASTER NODE (Control Plane) │
│ ├─ API Server │
│ ├─ Scheduler │
│ ├─ Controller Manager │
│ └─ etcd (Database) │
├─────────────────────────────────────┤
│ WORKER NODES │
│ ├─ Kubelet │
│ ├─ Container Runtime (Docker) │
│ └─ kube-proxy │
└─────────────────────────────────────┘
Control Plane компоненты (Master Node)
1. API Server (kube-apiserver)
- Главный компонент Kubernetes
- Предоставляет REST API для управления кластером
- Принимает команды (kubectl) и распространяет их
- Аутентификация, авторизация, валидация запросов
# Все команды идут через API Server
kubectl apply -f deployment.yaml # REST запрос к API Server
2. Scheduler (kube-scheduler)
- Распределяет поды (pods) на worker nodes
- Учитывает требования ресурсов (CPU, память)
- Выбирает оптимальный узел для запуска пода
spec:
containers:
- name: app
resources:
requests:
memory: "256Mi"
cpu: "500m"
limits:
memory: "512Mi"
cpu: "1"
3. Controller Manager (kube-controller-manager)
- Запускает контроллеры, которые следят за состоянием системы
- Например, ReplicationController следит, чтобы нужное количество подов всегда работало
- Если под упал - создаёт новый
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3 # Controller Manager следит, чтобы работало ровно 3 пода
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
4. etcd
- Распределённая база данных ключ-значение
- Хранит состояние всего кластера
- Является источником истины для Kubernetes
- Критически важна для надёжности
# etcd хранит:
- Конфигурацию подов
- Сервисы
- Секреты
- Volumes
- И всё остальное
Worker Node компоненты
1. Kubelet
- Агент на каждом worker node
- Следит за подами, назначенными на этот узел
- Запускает/останавливает контейнеры
- Следит за здоровьем подов (health checks)
2. Container Runtime
- Программа для запуска контейнеров
- Обычно Docker, но может быть containerd, CRI-O
- Управляет жизненным циклом контейнеров
3. kube-proxy
- Сетевой компонент на каждом узле
- Управляет сетевыми правилами (iptables)
- Обеспечивает сетевое взаимодействие между подами
- Балансирует трафик на сервисы
Основные объекты Kubernetes
Pod - самая маленькая единица в K8s
- Обёртка над контейнером (один или несколько)
- Все контейнеры в поде делят сетевое пространство
- Обычно один контейнер на под
apiVersion: v1
kind: Pod
metadata:
name: myapp
spec:
containers:
- name: myapp-container
image: myapp:1.0
ports:
- containerPort: 8080
Deployment - объект для управления подами
- Определяет желаемое состояние
- Указывает образ, кол-во реплик, стратегию обновления
- Controller Manager следит за этим
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deployment
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:1.0
Service - способ обращения к подам
- Предоставляет стабильный IP и DNS имя
- Балансирует трафик между подами
- Три типа: ClusterIP, NodePort, LoadBalancer
apiVersion: v1
kind: Service
metadata:
name: myapp-service
spec:
selector:
app: myapp
ports:
- port: 80
targetPort: 8080
type: ClusterIP # или NodePort, LoadBalancer
ConfigMap и Secret - для конфигурации
- ConfigMap для некритичной информации
- Secret для пароле, токенов, сертификатов
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
DATABASE_URL: "postgres://db:5432/mydb"
---
apiVersion: v1
kind: Secret
metadata:
name: myapp-secret
type: Opaque
data:
DATABASE_PASSWORD: cGFzc3dvcmQx # base64 encoded
Persistent Volume (PV) и Persistent Volume Claim (PVC) - для хранения данных
- PV - физическое хранилище
- PVC - запрос на хранилище от пода
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: myapp-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Основные команды kubectl
# Просмотр объектов
kubectl get pods
kubectl get services
kubectl get deployments
kubectl describe pod myapp
# Создание объектов
kubectl apply -f deployment.yaml
kubectl create -f pod.yaml
# Удаление объектов
kubectl delete pod myapp
kubectl delete deployment myapp-deployment
# Просмотр логов
kubectl logs pod-name
kubectl logs -f deployment/myapp # follow logs
# Выполнение команд
kubectl exec -it pod-name -- /bin/bash
kubectl port-forward pod-name 8080:8080
Жизненный цикл пода
Pending → Running → Succeeded (или Failed)
- Pending - Kubernetes создаёт контейнер
- Running - контейнер запущен
- Succeeded - контейнер завершился успешно
- Failed - контейнер завершился с ошибкой
- Unknown - неизвестное состояние
Важные концепции
Declarative approach - описываешь желаемое состояние в YAML, Kubernetes приводит систему в это состояние
Self-healing - если под упал, будет создан новый
Auto-scaling - Horizontal Pod Autoscaler автоматически масштабирует количество подов
Rolling updates - обновление версии приложения без простоя
Для Java разработчика
Как Java разработчик, ты обычно:
- Упаковываешь приложение в Docker образ
- Пушишь образ в Docker registry
- Создаёшь Kubernetes YAML файлы (Deployment, Service)
- Применяешь их в кластер (
kubectl apply) - Мониторишь приложение через kubectl
Вот типичный пример для Spring Boot приложения:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-app
spec:
replicas: 3
selector:
matchLabels:
app: spring-app
template:
metadata:
labels:
app: spring-app
spec:
containers:
- name: spring-app
image: myregistry.azurecr.io/spring-app:1.0
ports:
- containerPort: 8080
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 10
---
apiVersion: v1
kind: Service
metadata:
name: spring-app-service
spec:
selector:
app: spring-app
ports:
- port: 80
targetPort: 8080
type: LoadBalancer