kubectl - Утилиты и инструменты
Быстрая навигация: используйте
Ctrl/Cmd + Fдля перехода к разделам. Ключевые слова:exec,cp,label,jsonpath,scheduling,tips,helm,krew,aliases.
Выполнение команд в контейнере (exec)
Официальная документация kubectl exec ↗
# Выполнить команду в поде
kubectl exec <pod-name> -- <command>
# Пример: посмотреть список файлов
kubectl exec <pod-name> -- ls -la
# Интерактивный shell в поде
kubectl exec -it <pod-name> -- /bin/bash
kubectl exec -it <pod-name> -- /bin/sh
# Exec в конкретный контейнер (если несколько)
kubectl exec -it <pod-name> -c <container-name> -- /bin/bash
# Exec в определённом namespace
kubectl exec -it <pod-name> -n <namespace> -- /bin/bash
# Посмотреть переменные окружения
kubectl exec <pod-name> -- env
# Проверить сетевую доступность изнутри пода
kubectl exec <pod-name> -- curl -s http://service-name:port
# Посмотреть содержимое файла
kubectl exec <pod-name> -- cat /path/to/file
Копирование файлов (cp)
Официальная документация kubectl cp ↗
# Скопировать файл из пода на локальную машину
kubectl cp <pod-name>:/path/to/file ./local-file
# Скопировать файл в под
kubectl cp ./local-file <pod-name>:/path/to/file
# Копирование с указанием namespace
kubectl cp <namespace>/<pod-name>:/path/to/file ./local-file
# Скопировать директорию из пода
kubectl cp <pod-name>:/path/to/dir ./local-dir
# Копирование из конкретного контейнера
kubectl cp <pod-name>:/path/to/file ./local-file -c <container-name>
Работа с метками (label/annotate)
Официальная документация Labels и selectors ↗ Annotations ↗
# Добавить label к поду
kubectl label pod <pod-name> environment=production
# Добавить label к ноде
kubectl label node <node-name> disktype=ssd
# Удалить label (минус в конце)
kubectl label pod <pod-name> environment-
# Перезаписать существующий label
kubectl label pod <pod-name> environment=staging --overwrite
# Добавить аннотацию
kubectl annotate pod <pod-name> description="My pod"
# Удалить аннотацию
kubectl annotate pod <pod-name> description-
# Показать labels всех подов
kubectl get pods --show-labels
# Фильтрация по label
kubectl get pods -l environment=production
kubectl get pods -l 'environment in (production,staging)'
Продвинутый вывод данных (jsonpath/custom-columns)
Официальная документация JSONPath в kubectl ↗
# Получить IP адреса всех подов
kubectl get pods -o jsonpath='{.items[*].status.podIP}'
# Получить имена всех подов
kubectl get pods -o jsonpath='{.items[*].metadata.name}'
# Получить image каждого пода (с переносом строки)
kubectl get pods -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.containers[0].image}{"\n"}{end}'
# Получить имена нод и их IP
kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.addresses[0].address}{"\n"}{end}'
# Получить External IP нод
kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
# Кастомные колонки
kubectl get pods -o custom-columns=NAME:.metadata.name,STATUS:.status.phase,NODE:.spec.nodeName
# Кастомные колонки с IP
kubectl get pods -o custom-columns=POD:.metadata.name,IP:.status.podIP,NODE:.spec.nodeName
# Получить все image в кластере
kubectl get pods -A -o jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' | sort -u
# Получить секрет в декодированном виде
kubectl get secret <secret-name> -o jsonpath='{.data.password}' | base64 -d
# Получить endpoint адреса сервиса
kubectl get endpoints <service-name> -o jsonpath='{.subsets[*].addresses[*].ip}'
Планирование подов (affinity / tolerations / nodeSelector)
Официальная документация Назначение подов на ноды ↗ Taints и tolerations ↗
# Список нод с метками (для выбора целевых нод)
kubectl get nodes --show-labels
kubectl get nodes -l disktype=ssd
# Добавить метку на ноду для управления планированием
kubectl label node <node-name> disktype=ssd
# Показать taint'ы всех нод
kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints
# Проверить почему под в статусе Pending / не планируется
kubectl describe pod <pod-name> | grep -A 20 Events
# nodeSelector - запускать под только на нодах с меткой:
# spec:
# nodeSelector:
# disktype: ssd
# Node affinity - требовать ноду с меткой (жёсткое правило):
# spec:
# affinity:
# nodeAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# nodeSelectorTerms:
# - matchExpressions:
# - key: disktype
# operator: In
# values:
# - ssd
# Node affinity - предпочитать ноду с меткой (мягкое правило):
# spec:
# affinity:
# nodeAffinity:
# preferredDuringSchedulingIgnoredDuringExecution:
# - weight: 1
# preference:
# matchExpressions:
# - key: disktype
# operator: In
# values:
# - ssd
# Pod anti-affinity - запретить 2 пода на одной ноде (жёстко):
# spec:
# affinity:
# podAntiAffinity:
# requiredDuringSchedulingIgnoredDuringExecution:
# - labelSelector:
# matchLabels:
# app: my-app
# topologyKey: kubernetes.io/hostname
# Pod anti-affinity - предпочитать разные ноды (мягко):
# spec:
# affinity:
# podAntiAffinity:
# preferredDuringSchedulingIgnoredDuringExecution:
# - weight: 100
# podAffinityTerm:
# labelSelector:
# matchLabels:
# app: my-app
# topologyKey: kubernetes.io/hostname
# Toleration - разрешить поду запускаться на ноде с taint:
# spec:
# tolerations:
# - key: "key"
# operator: "Equal"
# value: "value"
# effect: "NoSchedule"
# Допустить все taint'ы (запускаться на любой ноде, включая master):
# spec:
# tolerations:
# - operator: "Exists"
# topologySpreadConstraints - равномерно распределить поды по зонам:
# spec:
# topologySpreadConstraints:
# - maxSkew: 1
# topologyKey: topology.kubernetes.io/zone
# whenUnsatisfiable: DoNotSchedule
# labelSelector:
# matchLabels:
# app: my-app
Советы и полезные паттерны
# Сгенерировать YAML-шаблон без создания ресурса (dry-run)
kubectl create deployment my-deploy --image=nginx --dry-run=client -o yaml
kubectl run my-pod --image=nginx --dry-run=client -o yaml
# Apply с удалением ресурсов, которых нет в файлах (prune)
kubectl apply -f ./configs/ --prune -l app=myapp
# Принудительно перетянуть образ - перезапустить деплой
kubectl rollout restart deployment/<deployment-name>
# Быстрое переключение неймспейса (паттерн с алиасом)
# alias kns='kubectl config set-context --current --namespace'
# kns production
# Следить за прогрессом rollout
kubectl rollout status deployment/<deployment-name> --watch
# Получить resourceVersion (нужен для оптимистичной блокировки)
kubectl get pod <pod-name> -o jsonpath='{.metadata.resourceVersion}'
# Получить все образы контейнеров, запущенных в кластере
kubectl get pods -A -o jsonpath='{range .items[*]}{range .spec.containers[*]}{.image}{"\n"}{end}{end}' | sort -u
# Найти поды, которые не готовы (NOT ready)
kubectl get pods -A --no-headers | awk '$3 != $4 || $5 != "Running"'
# Удалить все упавшие поды во всех неймспейсах
kubectl delete pods --field-selector=status.phase=Failed -A
# Получить поды с кол-вом рестартов больше N
kubectl get pods -A --no-headers | awk '$5 > 5'
# Объединить несколько kubeconfig в один файл
KUBECONFIG=~/.kube/config:~/.kube/other-config kubectl config view --flatten > ~/.kube/merged-config
# Войти в первый под, найденный по метке
kubectl exec -it $(kubectl get pod -l app=myapp -o jsonpath='{.items[0].metadata.name}') -- /bin/sh
# Логи со всех подов деплоя
kubectl logs -l app=<label-value> --all-containers=true --prefix=true
# Сортировка подов по кол-ву рестартов
kubectl get pods -A --sort-by='.status.containerStatuses[0].restartCount'
# Сортировка подов по времени создания (новые первые)
kubectl get pods --sort-by=.metadata.creationTimestamp
# Проверить, на каких нодах больше всего подов
kubectl get pods -A -o wide --no-headers | awk '{print $8}' | sort | uniq -c | sort -rn
# Применить несколько файлов через stdin
cat deployment.yaml service.yaml | kubectl apply -f -
Helm
Официальная документация Helm Documentation ↗
# Добавить репозиторий чартов
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo add stable https://charts.helm.sh/stable
# Обновить все репозитории
helm repo update
# Список добавленных репозиториев
helm repo list
# Поиск чарта в репозиториях
helm search repo nginx
helm search repo nginx --versions
# Поиск в Artifact Hub
helm search hub nginx
# Показать дефолтные values чарта
helm show values bitnami/nginx
# Установить релиз
helm install <release-name> bitnami/nginx
# Установить с файлом values
helm install <release-name> bitnami/nginx -f values.yaml
# Установить с переопределением значений
helm install <release-name> bitnami/nginx --set replicaCount=2 --set service.type=NodePort
# Установить в конкретный неймспейс (создать если не существует)
helm install <release-name> bitnami/nginx -n <namespace> --create-namespace
# Предварительный просмотр манифестов без установки (dry-run)
helm install <release-name> bitnami/nginx --dry-run --debug
# Список всех релизов
helm list
helm list -A
helm list -n <namespace>
# Статус релиза
helm status <release-name>
# Получить текущие values развёрнутого релиза
helm get values <release-name>
# Получить все манифесты релиза
helm get manifest <release-name>
# Обновить релиз
helm upgrade <release-name> bitnami/nginx
helm upgrade <release-name> bitnami/nginx -f values.yaml
# Установить если нет, обновить если есть
helm upgrade --install <release-name> bitnami/nginx -f values.yaml
# История ревизий релиза
helm history <release-name>
# Откатить к предыдущей ревизии
helm rollback <release-name>
# Откатить к конкретной ревизии
helm rollback <release-name> 2
# Удалить релиз
helm uninstall <release-name>
helm uninstall <release-name> -n <namespace>
# Удалить релиз, сохранив историю
helm uninstall <release-name> --keep-history
# Отрендерить шаблоны локально без кластера
helm template <release-name> bitnami/nginx -f values.yaml
# Отрендерить и сохранить в файл
helm template <release-name> bitnami/nginx -f values.yaml > rendered.yaml
# Проверить чарт на ошибки (lint)
helm lint ./my-chart
# Создать scaffold нового чарта
helm create my-chart
# Упаковать чарт в .tgz
helm package ./my-chart
# Скачать исходник чарта локально
helm pull bitnami/nginx --untar
# Запустить тесты чарта (test hooks)
helm test <release-name>
Плагины kubectl (krew)
Официальная документация Krew Documentation ↗
# Установить krew (менеджер плагинов kubectl)
# https://krew.sigs.k8s.io/docs/user-guide/setup/install/
# Список установленных плагинов
kubectl krew list
# Поиск плагинов
kubectl krew search <keyword>
# Установить плагин
kubectl krew install <plugin-name>
# Обновить все установленные плагины
kubectl krew upgrade
# Удалить плагин
kubectl krew uninstall <plugin-name>
# Полезные плагины сообщества:
# kubectl ctx - быстрое переключение контекстов (kubectx)
kubectl ctx
kubectl ctx <context-name>
# kubectl ns - быстрое переключение неймспейсов (kubens)
kubectl ns
kubectl ns <namespace>
# kubectl neat - очищает вывод YAML от служебных полей
kubectl neat get pod <pod-name> -o yaml
# kubectl tree - показывает иерархию владельцев ресурса
kubectl tree deployment <deployment-name>
# kubectl stern - просмотр логов нескольких подов одновременно
kubectl stern <pod-pattern>
kubectl stern -l app=myapp
# kubectl df-pv - показывает использование диска для PersistentVolumes
kubectl df-pv
# kubectl whoami - текущий пользователь / сервис-аккаунт
kubectl whoami
Алиасы и автодополнение в shell
Официальная документация kubectl autocomplete ↗
# Включить автодополнение kubectl — bash
source <(kubectl completion bash)
echo 'source <(kubectl completion bash)' >> ~/.bashrc
# Включить автодополнение kubectl — zsh
source <(kubectl completion zsh)
echo '[[ $commands[kubectl] ]] && source <(kubectl completion zsh)' >> ~/.zshrc
# Алиас k=kubectl с сохранением автодополнения
alias k=kubectl
complete -o default -F __start_kubectl k # bash
compdef k=kubectl # zsh
# Часто используемые алиасы
alias kgp='kubectl get pods'
alias kgpa='kubectl get pods -A'
alias kgpw='kubectl get pods -w'
alias kgs='kubectl get svc'
alias kgn='kubectl get nodes'
alias kgd='kubectl get deploy'
alias kge='kubectl get events --sort-by=.lastTimestamp'
alias kdp='kubectl describe pod'
alias kdd='kubectl describe deployment'
alias kl='kubectl logs'
alias klf='kubectl logs -f'
alias kex='kubectl exec -it'
alias kaf='kubectl apply -f'
alias kdf='kubectl delete -f'
# Быстрая смена namespace без kubens
alias kns='kubectl config set-context --current --namespace'
# Быстрая смена контекста без kubectx
alias kctx='kubectl config use-context'
# Показать текущий контекст и namespace
alias kwhere='echo "context: $(kubectl config current-context)" && echo "namespace: $(kubectl config view --minify -o jsonpath={.contexts[0].context.namespace})"'
# Интеграция с prompt — показывать контекст/namespace в строке приглашения
# kube-ps1: https://github.com/jonmosco/kube-ps1
# starship имеет встроенный модуль kubernetes: https://starship.rs/config/#kubernetes