💻
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
Безопасность
- Не запускать от root (securityContext.runAsNonRoot: true)
- Использовать Readiness/Liveness probes
- Ограничивать привилегии (securityContext, PodSecurityPolicy)
- Хранить секреты в Vault или external secrets
- Сканировать образы на уязвимости (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» бесплатно.