# kubectl cheatsheet: основные команды для работы с Kubernetes

Индекс LLMS: [llms.txt](/llms.txt)

---

kubectl — основной инструмент взаимодействия с Kubernetes-кластером. Ниже собрана шпаргалка по рутинным операциям: от настройки контекста до отладки подов и переключения между namespace. Все команды проверены на актуальных версиях kubectl (1.28+).

## Установка и настройка контекста

Установка зависит от ОС. На Linux через пакетный менеджер или бинарник:

```bash
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
kubectl version --client
```

Конфигурация хранится в `~/.kube/config`. Контекст определяет кластер, пользователя и namespace по умолчанию.

```bash
kubectl config current-context
kubectl config use-context production-cluster
kubectl config view --minify   # показать текущий контекст
kubectl config get-contexts    # список всех контекстов
```

> [!TIP]
> Если у вас несколько кластеров, храните конфиги в переменной `KUBECONFIG` через двоеточие: `export KUBECONFIG=~/.kube/config:~/.kube/prod-config`.

## Работа с подами

Базовые операции:

```bash
kubectl get pods                          # все поды в текущем namespace
kubectl get pods -A                       # все namespace
kubectl describe pod <pod-name>           # подробности и события
kubectl logs <pod-name>                   # логи контейнера
kubectl logs <pod-name> -c <container>    # логи конкретного контейнера в multi-container pod
kubectl exec -it <pod-name> -- /bin/sh    # войти в под
kubectl delete pod <pod-name>             # удалить под
```

## Деплойменты, StatefulSet и DaemonSet

```bash
kubectl get deployments,statefulsets,daemonsets
kubectl rollout status deployment/<name>       # статус обновления
kubectl rollout history deployment/<name>      # история ревизий
kubectl rollout undo deployment/<name>         # откат на предыдущую ревизию
kubectl rollout undo deployment/<name> --to-revision=2   # откат к конкретной ревизии
kubectl scale deployment/<name> --replicas=5   # масштабирование
```

Для StatefulSet порядок запуска и стабильные идентификаторы критичны. Для DaemonSet — гарантированный экземпляр на каждом ноде.

> [!WARNING]
> Не используйте `kubectl delete` на Deployment без проверки `kubectl get deployment`. Удаление контроллера не удаляет поды автоматически — они будут пересозданы, если не указан `--cascade=orphan` (в старых версиях) или не удалён через `kubectl delete deployment`.

## Сервисы, Ingress и ConfigMap

```bash
kubectl get svc                      # сервисы
kubectl expose deployment/<name> --port=80 --type=NodePort   # создать svc из деплоя
kubectl get ingress                  # ingress-ресурсы
kubectl describe ingress <name>      # правила и события
kubectl apply -f ingress.yaml        # применить ингресс из файла
```

ConfigMap и Secret для конфигурации:

```bash
kubectl create configmap app-config --from-file=config.yaml
kubectl get configmap app-config -o yaml
kubectl create secret generic db-creds --from-literal=password='s3cr3t'
kubectl get secret db-creds -o jsonpath='{.data.password}' | base64 -d
```

## Отладка и диагностика

Когда под не работает, последовательность такая:

```bash
kubectl get pods -o wide             # статус и нода
kubectl describe pod <pod-name>      # события, причина CrashLoopBackOff
kubectl logs <pod-name> --previous   # логи упавшего контейнера
kubectl top pod <pod-name>           # потребление CPU/memory (требует metrics-server)
kubectl attach -it <pod-name> -- /bin/sh   # альтернатива exec
```

Для проверки сетевой доступности изнутри кластера:

```bash
kubectl run debug-pod --image=busybox --rm -it --restart=Never -- wget -O- http://<svc-name>.<namespace>.svc.cluster.local:80
```

> [!NOTE]
> Если `kubectl top` возвращает ошибку — metrics-server не установлен. Установка зависит от провайдера: `kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml`.

## Метки, селекторы и форматирование вывода

Метки позволяют группировать ресурсы и выбирать их пачками:

```bash
kubectl get pods --show-labels
kubectl label pods <pod-name> app=frontend tier=web
kubectl get pods -l app=frontend       # selector по метке
kubectl get pods -l 'app in (frontend,backend)'
kubectl get pods -l '!tier=web'        # отрицательный селектор
```

Форматирование вывода:

```bash
kubectl get pods -o wide
kubectl get pods -o json               # полный JSON
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase
```

| Флаг | Описание |
|------|----------|
| `-n, --namespace` | Указать namespace |
| `-o, --output` | Формат: `json`, `yaml`, `wide`, `custom-columns` |
| `-l, --selector` | Селектор по меткам |
| `-f, --filename` | Файл конфигурации (YAML/JSON) |
| `--show-labels` | Показать колонку с метками |
| `-w, --watch` | Потоковый режим обновления |
| `--all-namespaces, -A` | Все namespace |

## Управление namespace и переключение контекстов

```bash
kubectl get namespace
kubectl create namespace staging
kubectl delete namespace staging        # удаление асинхронное
kubectl config set-context --current --namespace=staging   # namespace по умолчанию в контексте
```

Для удобства можно создать алиас или функцию в shell:

```bash
# ~/.bashrc или ~/.zshrc
kswitch() { kubectl config use-context "$1" && kubectl config set-context --current --namespace="$2"; }
# использование: kswitch production-cluster default
```

> [!TIP]
> `kubectl config rename-context`, `kubectl config unset` и `kubectl config set` позволяют редактировать конфиг без ручного правки YAML. Проверяйте результат через `kubectl config view`.

kubectl — это не просто CLI, а слой абстракции над API Kubernetes. Знание флагов форматирования и селекторов сокращает время диагностики в несколько раз. Сохраните шпаргалку рядом и обновляйте по мере выхода новых версий.
