← Весь справочник

kubectl

Клиент Kubernetes — генерация манифестов через --dry-run=client, apply/get/describe, неймспейсы и метки

kubectl управляет кластером Kubernetes: отправляет манифесты (YAML-описания объектов) в API-сервер и показывает, что в кластере происходит. Часть команд работает без кластера — например, генерация заготовок манифестов.

В песочнице кластера нет. Работают только клиентские операции: kubectl create … --dry-run=client -o yaml (кроме create role/clusterrole), kubectl label/annotate/set с --local, kubectl kustomize, kubectl config, kubectl version --client. Команды apply, get, describe, run, expose, autoscale, explain, diff обращаются к серверу и завершатся ошибкой connection refused.

Синтаксис

kubectl <действие> <тип> [имя] [флаги]

Типы пишут полностью или сокращённо: pods/po, deployments/deploy, services/svc, configmaps/cm, namespaces/ns, nodes/no.

Генераторы kubectl create

С --dry-run=client -o yaml каждый из них печатает готовый манифест.

КомандаЧто создаёт
create deployment имя --image=образDeployment; --replicas=3, --port=80, --image можно повторять (несколько контейнеров)
create service clusterip имя --tcp=80:8080Service внутри кластера: порт сервиса 80 → порт контейнера 8080
create service nodeport имя --tcp=80:8080 --node-port=30080Service с портом на каждом узле
create service loadbalancer имя --tcp=80:8080Service с внешним балансировщиком
create service externalname имя --external-name=hostDNS-псевдоним на внешний хост
create configmap имя --from-literal=K=VConfigMap; --from-file=[ключ=]путь, --from-env-file=файл
create secret generic имя --from-literal=K=VSecret; те же --from-file, --from-env-file
create secret tls имя --cert=crt --key=keySecret с TLS-сертификатом
create secret docker-registry имя --docker-server=… --docker-username=… --docker-password=…доступ к приватному реестру образов
create namespace имяNamespace
create job имя --image=образ -- командаJob (одноразовая задача)
create cronjob имя --image=образ --schedule='0 3 * * *' -- командаCronJob (задача по расписанию)
create serviceaccount имяServiceAccount
create rolebinding имя --role=роль --serviceaccount=ns:имяпривязка роли (также --user, --group)
create clusterrolebinding имя --clusterrole=роль --user=имяпривязка роли на весь кластер
create ingress имя --rule='host/путь*=сервис:порт'Ingress (HTTP-маршрутизация)
create poddisruptionbudget имя --selector=app=web --min-available=1PodDisruptionBudget
create quota имя --hard=pods=10,requests.cpu=2ResourceQuota
create priorityclass имя --value=1000PriorityClass

Правка манифестов без кластера

КомандаЧто делает
label -f файл ключ=значение --local -o yamlдобавить метку
annotate -f файл ключ=значение --local -o yamlдобавить аннотацию
set image -f файл контейнер=образ --local -o yamlсменить образ
set env -f файл KEY=value --local -o yamlдобавить переменную окружения
set resources -f файл --limits=cpu=200m,memory=128Mi --local -o yamlзадать ресурсы
kustomize каталогсобрать манифесты по kustomization.yaml

Работа с кластером

КомандаЧто делает
apply -f файл.yaml / -f каталог/ / -k каталог/создать или обновить объекты по манифестам
delete -f файл.yaml / delete pod имяудалить
get pods / get all / get deploy,svcсписок объектов
get pod имя -o yaml / -o wide / -o jsonpath='{…}'полное описание / с узлом и IP / одно поле
describe pod имяподробности и события — первое, куда смотреть при проблемах
logs pod [-c контейнер] [-f] [--previous]логи контейнера (предыдущего запуска — --previous)
exec -it pod -- shоболочка внутри контейнера
port-forward svc/имя 8080:80проброс порта на свою машину
rollout status/history/undo deploy/имяход выкатки / история / откат
scale deploy/имя --replicas=3изменить число реплик
explain deployment.specдокументация по полям объекта
config get-contexts / use-context имясписок кластеров-контекстов / переключение

Общие флаги

ФлагЧто делает
--dry-run=clientничего не отправлять в кластер
-o yaml / -o json / -o nameформат вывода
-n имя / -Aнеймспейс / все неймспейсы
-l app=web / -l 'tier in (front,back)' / -l '!canary'отбор по меткам (label selector)
-f файлработать с объектами из манифеста
-wследить за изменениями (get -w)

Примеры

# заготовка Deployment в файл
kubectl create deployment web --image=nginx:1.27 --replicas=2 \
  --dry-run=client -o yaml > deployment.yaml

# Service к нему: селектор app=web совпадает с меткой подов
kubectl create service clusterip web --tcp=80:8080 --dry-run=client -o yaml

# объект сразу в нужном неймспейсе — в манифесте появится metadata.namespace
kubectl create deployment web --image=nginx -n staging --dry-run=client -o yaml

# ConfigMap и Secret
kubectl create configmap app-cfg --from-literal=MODE=prod --from-file=app.conf \
  --dry-run=client -o yaml
kubectl create secret generic db --from-literal=password=changeme --dry-run=client -o yaml

# Job и CronJob: команда контейнера — после --
kubectl create cronjob nightly --image=busybox --schedule='0 3 * * *' \
  --dry-run=client -o yaml -- date

# несколько объектов в одном файле: документы YAML разделяются строкой ---
{
  kubectl create deployment web --image=nginx --dry-run=client -o yaml
  echo '---'
  kubectl create service clusterip web --tcp=80:80 --dry-run=client -o yaml
} > app.yaml

# добавить метку и переменную окружения в готовый манифест без кластера
kubectl label -f deployment.yaml tier=frontend --local -o yaml
kubectl set env -f deployment.yaml MODE=prod --local -o yaml

# одно поле из сгенерированного объекта
kubectl create deployment web --image=nginx --dry-run=client \
  -o jsonpath='{.spec.selector.matchLabels}'

# прочитать значение из Secret
kubectl create secret generic db --from-literal=password=changeme --dry-run=client \
  -o jsonpath='{.data.password}' | base64 -d

# в реальном кластере (здесь не сработают):
# kubectl apply -f deployment.yaml
# kubectl get pods -n staging -l app=web
# kubectl describe deployment web
# kubectl logs deploy/web --tail=50

Как связаны Deployment и Service — через метки:

# Deployment: поды получают метку app: web
spec:
  selector:
    matchLabels:
      app: web          # какими подами управляет Deployment
  template:
    metadata:
      labels:
        app: web        # должна совпадать с matchLabels
---
# Service: трафик идёт на поды с той же меткой
spec:
  selector:
    app: web

Подводные камни

  • --dry-run=client без -o yaml печатает только deployment.apps/web created (dry run). Манифест виден только с -o yaml.
  • apply --dry-run=client всё равно ходит в кластер: ему нужна схема API. Без кластера сгенерированный манифест не «проверить через apply».
  • kubectl run и create role тоже обращаются к серверу даже с --dry-run=client. Под и Role придётся описывать вручную или взять за основу другой генератор.
  • Метки и селекторы должны совпадать. Service находит поды по spec.selector, Deployment — по spec.selector.matchLabels. Опечатка в метке не даёт ошибки: сервис просто останется без подов.
  • selector у Deployment нельзя поменять после создания — только пересоздать объект.
  • Secret — это не шифрование. Значения в data лишь закодированы base64 и читаются через base64 -d.
  • В сгенерированном YAML есть шум: creationTimestamp: null, status: {}, resources: {}. Это нормально, при желании удаляй.
  • Неймспейс по умолчанию — default. Без -n команды в кластере смотрят туда, и «пропавшие» объекты часто лежат в другом неймспейсе.
  • Всё после -- уходит в контейнер как команда. Флаги kubectl пиши до --.

См. также

yq · base64 · docker-compose · ansible