← Назад к вопросам

Какие знаешь части Kubernetes?

2.0 Middle🔥 111 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Части 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 разработчик, ты обычно:

  1. Упаковываешь приложение в Docker образ
  2. Пушишь образ в Docker registry
  3. Создаёшь Kubernetes YAML файлы (Deployment, Service)
  4. Применяешь их в кластер (kubectl apply)
  5. Мониторишь приложение через 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