💻

kubernetes_k8s_ru

Kubernetes — оркестрация контейнеров: архитектура, поды, сервисы, деплой, Helm, мониторинг, troubleshooting

Системный промпт

<skill_instructions creator="a4f8cc09-f7ff-41e8-8b94-0d3e6173b7af">

Kubernetes (K8s) — Полное руководство по оркестрации контейнеров

1. АРХИТЕКТУРА KUBERNETES

Основные компоненты

Control Plane (Master Node):

  • kube-apiserver — API-сервер, точка входа для всех операций
  • etcd — распределённое хранилище ключ-значение для состояния кластера
  • kube-scheduler — планировщик, распределяет поды по нодам
  • kube-controller-manager — управляет репликацией, endpoints, namespace
  • cloud-controller-manager — взаимодействие с облачным провайдером

Worker Nodes:

  • kubelet — агент на каждой ноде, следит за состоянием подов
  • kube-proxy — сетевой прокси, управляет сетевыми правилами
  • container runtime — Docker, containerd, CRI-O

Объекты Kubernetes

# Pod — минимальная единица развёртывания
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.21
    ports:
    - containerPort: 80
    resources:
      requests:
        memory: "64Mi"
        cpu: "250m"
      limits:
        memory: "128Mi"
        cpu: "500m"

2. REPLICASET И DEPLOYMENT

Deployment — управление подами

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80
---
# Service — стабильная точка входа
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: ClusterIP  # ClusterIP, NodePort, LoadBalancer

Стратегии деплоя

СтратегияОписаниеКогда использовать
RollingUpdateПостепенная замена подовБезопасные обновления
RecreateВсе поды удаляются, затем создаютсяStateful-приложения
Blue/GreenДва окружения, переключениеТребования zero-downtime
CanaryЧасть трафика на новую версиюТестирование в проде
spec:
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0

3. СЕРВИСЫ И NETWORKING

Типы Service

# ClusterIP — внутренний сервис (по умолчанию)
type: ClusterIP

# NodePort — открывает порт на каждой ноде
type: NodePort
nodePort: 30080

# LoadBalancer — внешний балансировщик
type: LoadBalancer

# ExternalName — CNAME запись
type: ExternalName
externalName: api.example.com

Ingress — маршрутизация HTTP/HTTPS

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: app-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: app.example.com
    http:
      paths:
      - path: /api
        pathType: Prefix
        backend:
          service:
            name: api-service
            port:
              number: 8080
      - path: /
        pathType: Prefix
        backend:
          service:
            name: frontend-service
            port:
              number: 80
  tls:
  - hosts:
    - app.example.com
    secretName: tls-secret

NetworkPolicy

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: api-network-policy
spec:
  podSelector:
    matchLabels:
      app: api
  policyTypes:
  - Ingress
  - Egress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: frontend
    ports:
    - protocol: TCP
      port: 8080

4. CONFIGMAP И SECRETS

ConfigMap — конфигурация

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config
data:
  DATABASE_HOST: "postgres.database.svc"
  LOG_LEVEL: "info"
  config.json: |
    {
      "feature_flags": {
        "new_ui": true
      }
    }

Secrets — чувствительные данные

apiVersion: v1
kind: Secret
metadata:
  name: app-secrets
type: Opaque
data:
  # echo -n "password" | base64
  DB_PASSWORD: cGFzc3dvcmQ=
stringData:
  API_KEY: "real-api-key"

Использование в подах

env:
- name: DB_HOST
  valueFrom:
    configMapKeyRef:
      name: app-config
      key: DATABASE_HOST
- name: DB_PASSWORD
  valueFrom:
    secretKeyRef:
      name: app-secrets
      key: DB_PASSWORD

# Или через volume
volumes:
- name: config
  configMap:
    name: app-config

5. PERSISTENT VOLUMES

PersistentVolume (PV) и PersistentVolumeClaim (PVC)

# PersistentVolume
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-storage
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain  # Retain, Recycle, Delete
  storageClassName: standard
  hostPath:
    path: /data/pv-storage

---
# PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-storage
spec:
  resources:
    requests:
      storage: 5Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: standard

---
# Использование в Pod
spec:
  containers:
  - name: app
    volumeMounts:
    - name: data
      mountPath: /var/lib/data
  volumes:
  - name: data
    persistentVolumeClaim:
      claimName: pvc-storage

6. HELM — МЕНЕДЖЕР ПАКЕТОВ

Установка и базовые команды

# Установка Helm
curl -fsSL https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

# Добавление репозитория
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# Поиск чартов
helm search repo nginx

# Установка чарта
helm install my-nginx bitnami/nginx
helm install my-app ./my-chart

# Значения
helm show values bitnami/nginx
helm install my-nginx bitnami/nginx --set replicaCount=3

# Обновление
helm upgrade my-nginx bitnami/nginx --set replicaCount=5
helm rollback my-nginx 1  # Откат к версии 1

values.yaml

replicaCount: 2

image:
  repository: nginx
  tag: "1.21"
  pullPolicy: IfNotPresent

service:
  type: ClusterIP
  port: 80

resources:
  limits:
    cpu: 100m
    memory: 128Mi
  requests:
    cpu: 50m
    memory: 64Mi

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 10
  targetCPUUtilizationPercentage: 70

7. TROUBLESHOOTING

Полезные команды

# Статус подов
kubectl get pods -n namespace -o wide
kubectl describe pod <pod-name> -n namespace

# Логи
kubectl logs <pod-name> -n namespace --previous  # предыдущий контейнер
kubectl logs <pod-name> -n namespace -f --tail=100

# Debug
kubectl exec -it <pod-name> -n namespace -- /bin/sh
kubectl port-forward <pod-name> 8080:80

# События
kubectl get events -n namespace --sort-by='.lastTimestamp'

# Проверка ресурсов
kubectl top nodes
kubectl top pods -n namespace

Частые проблемы

ПроблемаПричинаРешение
CrashLoopBackOffПриложение падаетkubectl logs, describe pod
ImagePullBackOffНеверный образПроверить image name, registry
Pending PodsНехватка ресурсовkubectl describe node
OOMKilledПревышен memory limitУвеличить limits
TerminatingЗависшее удалениеforce delete
# Force delete зависшего пода
kubectl delete pod <pod-name> -n namespace --grace-period=0 --force

8. BEST PRACTICES

Безопасность

  1. Не запускать от root (securityContext.runAsNonRoot: true)
  2. Использовать Readiness/Liveness probes
  3. Ограничивать привилегии (securityContext, PodSecurityPolicy)
  4. Хранить секреты в Vault или external secrets
  5. Сканировать образы на уязвимости (Trivy, Grype)

Обязательные ресурсы

# Всегда указывайте resources!
resources:
  requests:
    memory: "64Mi"
    cpu: "50m"
  limits:
    memory: "256Mi"
    cpu: "500m"

# Readiness и Liveness probes
readinessProbe:
  httpGet:
    path: /healthz/ready
    port: 8080
  initialDelaySeconds: 5
  periodSeconds: 10
livenessProbe:
  httpGet:
    path: /healthz/live
    port: 8080
  initialDelaySeconds: 15
  periodSeconds: 20

</skill_instructions>

Категория
💻 Разработка
Автор
ya
Платформа
Сам Решу

Попробуйте этот навык

Зарегистрируйтесь и используйте навык «kubernetes_k8s_ru» бесплатно.