Перейти к содержимому

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

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

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

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

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 по умолчанию.

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

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

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

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

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

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 — гарантированный экземпляр на каждом ноде.

Предупреждение

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

Сервисы, Ingress и ConfigMap

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 для конфигурации:

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

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

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

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

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

kubectl run debug-pod --image=busybox --rm -it --restart=Never -- wget -O- http://<svc-name>.<namespace>.svc.cluster.local:80
Примечание

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

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

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

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'        # отрицательный селектор

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

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 и переключение контекстов

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

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

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

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

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