Шпаргалка: kubectl

Для практики курса используйте d8 k — drop-in-обёртку d8 над kubectl (см. шпаргалку d8): синтаксис, флаги и вывод идентичны ванильному kubectl. Ниже везде, где встречается kubectl, можно подставить d8 k, и наоборот. Полные разборы — по мере прохождения M1, M10.

Самые используемые команды

Эти команды встречаются почти в каждом уроке курса — выучите их в первую очередь.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
kubectl create namespace <name>                     # изолированный namespace для практики урока
kubectl config set-context --current --namespace=<ns>

kubectl apply -f <file>                              # применить манифест из файла
kubectl apply -n <ns> -f - <<'EOF' ... EOF            # применить манифест из stdin (heredoc)

kubectl get <kind> [-n <ns> | -A]                     # список объектов
kubectl get <kind> <name> -o yaml                     # полный YAML объекта
kubectl get <kind> <name> -o wide                     # с доп. колонками (узел, IP)
kubectl get <kind> -o jsonpath='{.status...}'         # точечное значение поля
kubectl describe <kind> <name> [-n <ns>]              # события и детали объекта

kubectl logs <pod> [-c <container>] [-f] [--previous] # логи контейнера
kubectl exec -it <pod> [-c <container>] -- <cmd>      # выполнить команду в контейнере

kubectl delete <kind> <name> [-n <ns>]
kubectl patch <kind> <name> --type=merge -p '<json>'  # точечное изменение объекта

kubectl rollout status deployment/<name>
kubectl rollout restart deployment/<name>
kubectl rollout undo deployment/<name> [--to-revision=N]

kubectl get events -n <ns> --sort-by='.lastTimestamp'
kubectl auth can-i <verb> <resource> --as=<user> [-n <ns>]

Контекст, конфигурация, namespace

1
2
3
4
5
6
7
8
9
kubectl version --client                              # версия клиента
kubectl cluster-info                                  # адрес API-сервера
kubectl config view --minify                          # активный контекст kubeconfig
kubectl config get-contexts                           # список контекстов
kubectl config use-context <name>                     # переключить контекст/кластер
kubectl config set-context --current --namespace=<ns> # namespace по умолчанию для контекста
kubectl get ns                                         # список namespace
kubectl create namespace <name>
export KUBECONFIG=~/.kube/config                      # явный путь к kubeconfig

Просмотр объектов (get/describe)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
kubectl get <kind>                                     # список в текущем namespace
kubectl get <kind> -A                                  # во всех namespace
kubectl get <kind> -n <ns>
kubectl get <kind> -o wide
kubectl get <kind> -o yaml
kubectl get <kind> -o json
kubectl get <kind> -o jsonpath='{.status.phase}'
kubectl get <kind> -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.foo}{"\n"}{end}'  # табличный вывод по нескольким объектам
kubectl get <kind> -o custom-columns=NAME:.metadata.name,REPLICAS:.spec.replicas
kubectl get <kind1>,<kind2>,<kind3> [-n <ns>]          # несколько видов ресурсов одной командой
kubectl describe <kind> <name> [-n <ns>]
kubectl describe <kind> -n <ns> -l app=<label>         # describe по label selector (несколько объектов)
kubectl api-resources --namespaced=true                # список namespace-scoped типов
kubectl api-resources --namespaced=false                # список cluster-scoped типов
kubectl api-resources | grep -iE "<pattern>"           # поиск типа ресурса по имени
kubectl explain <kind>[.<field>...]                    # схема полей ресурса/CRD (см. также d8 k explain application.spec)
kubectl get events -n <ns> --sort-by='.lastTimestamp'  # события в хронологическом порядке
kubectl get crd | grep <pattern>                       # проверка наличия CRD в кластере

Логи и exec

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kubectl logs <pod> [-n <ns>]
kubectl logs <pod> [-n <ns>] [-c <container>] [-f]
kubectl logs <pod> -n <ns> --previous                  # логи предыдущего (упавшего) контейнера
kubectl logs -n <ns> job/<name>                        # логи через ссылку на объект Job
kubectl logs -n <ns> -l app=<name> --tail=100           # логи по label без привязки к конкретному Pod
kubectl logs deploy/<name> -n <ns>                      # логи через ссылку на Deployment
kubectl exec -it <pod> [-n <ns>] -- <cmd>
kubectl exec -it <pod> -n <ns> -- sh -c "<cmd>"
kubectl exec -n <ns> deploy/<name> -- <cmd>             # выполнение в Pod'е Deployment без -it
kubectl exec -n <ns> deploy/<name> -- env | grep <pattern>
kubectl port-forward -n <ns> pod/<name> <local>:<pod-port>
kubectl attach my-pod -i                                # подключиться к уже работающему процессу контейнера

Изменение объектов

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
kubectl apply -f <file> [-n <ns>]
kubectl apply -n <ns> -f -   <<'EOF' ... EOF            # применить из stdin без временного файла
kubectl edit <kind> <name> [-n <ns>]
kubectl delete <kind> <name> [-n <ns>]
kubectl delete <kind> <name> -n <ns> --wait=false       # не ждать завершения удаления
kubectl delete <kind> -n <ns> -l app=<label>            # удаление по label
kubectl delete <kind> <name> -n <ns> --ignore-not-found
kubectl delete pvc <name> -n <ns>                       # прямое удаление PVC (обходит helm.sh/resource-policy: keep)
kubectl delete --cascade=<foreground|background|orphan> # управление каскадным удалением зависимых объектов
kubectl patch <kind> <name> [-n <ns>] --type=merge -p '{"spec":{...}}'
kubectl patch <kind> <name> [-n <ns>] --type=json -p '[{"op":"replace","path":"/spec/...","value":...}]'
kubectl label ns <ns> <key>=<value> [--dry-run=server]
kubectl annotate <kind> <name> [-n <ns>] <key>=<value> [--overwrite]
kubectl wait --for=condition=Ready <kind> -l app=<label> -n <ns> --timeout=60s
kubectl get <kind> -n <ns> -w                           # watch за изменением состояния

Deployment / ReplicaSet

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
kubectl create deployment <name> --image=<image> --replicas=<n>
kubectl get deployment,replicaset,pod -n <ns> -o wide
kubectl get deployment <name> -n <ns>
kubectl get deployments -A -l app=<label>
kubectl get pod -n <ns> -o jsonpath='{.items[0].metadata.ownerReferences}'
kubectl set image deployment/<name> <container>=<image> [-n <ns>]
kubectl scale deployment/<name> --replicas=<n> [-n <ns>]
kubectl rollout status deployment/<name> [-n <ns>]
kubectl rollout history deployment/<name> [-n <ns>]
kubectl rollout undo deployment/<name> [-n <ns>]
kubectl rollout undo deployment/<name> --to-revision=<N> [-n <ns>]
kubectl rollout restart deployment/<name> [-n <ns>]
kubectl resume deployment/<name>                        # снять паузу после kubectl rollout pause

Service / DNS / сетевая отладка

1
2
3
4
5
6
7
8
kubectl get svc [-n <ns>]
kubectl get svc,endpointslices -n <ns>
kubectl get endpointslices -l kubernetes.io/service-name=<svc>
kubectl describe svc <name> [-n <ns>]
kubectl patch svc <name> -n <ns> --type=merge -p '<json>'
kubectl run debug --rm -it --image=busybox [-n <ns>] -- sh
kubectl run debug --rm -it --image=busybox -n <ns> -- sh -c "<cmd>"
kubectl run debug --rm -it --image=busybox -n <ns> -- nslookup <svc>

ConfigMap / Secret

1
2
3
4
5
6
kubectl create configmap <name> [-n <ns>] --from-literal=<k>=<v> [--from-file=<path>]
kubectl create secret generic <name> [-n <ns>] --from-literal=<k>=<v> [--type=<type>]
kubectl create secret generic <name> --from-file=.dockerconfigjson=./config.json --type=kubernetes.io/dockerconfigjson
kubectl get secret <name> [-n <ns>] -o jsonpath='{.data.<key>}'   # значение в base64, декодировать через `base64 -d`
kubectl patch configmap <name> -n <ns> --type=merge -p '{"data":{...}}'
kubectl patch secret <name> -n <ns> --type=merge -p '{"immutable":true}'

Селекторы: labels

1
2
3
4
5
6
7
8
kubectl get pods -l 'env=prod,tier!=frontend'           # равенство и неравенство
kubectl get pods -A -l 'env=staging'
kubectl get pods -A -l 'team in (a,b)'                  # set-based: In
kubectl get pods -A -l 'team notin (b)'                 # set-based: NotIn
kubectl get <kind> -A -l 'key'                          # Exists
kubectl get <kind> -A -l '!key'                         # DoesNotExist
kubectl describe resourcequota <name> -n <ns>
kubectl describe limitrange <name> -n <ns>

Volumes / Storage

1
2
3
4
5
6
7
8
kubectl get pvc,pv [-n <ns>]
kubectl get storageclass
kubectl get storageclass,replicatedstorageclass
kubectl describe pvc <name> [-n <ns>]
kubectl get pv -o jsonpath='{.items[0].spec.persistentVolumeReclaimPolicy}'
kubectl get pv | grep Released
kubectl get pvc -n <ns> -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.storageClassName}{"\n"}{end}'
kubectl get volumesnapshot,volumesnapshotclass -A

Ingress / Gateway API

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kubectl get ingress [-n <ns>]
kubectl describe ingress <name> [-n <ns>]
kubectl get ingressclass
kubectl patch ingress <name> -n <ns> --type=json -p '[<json-patch>]'
kubectl delete ingress <name> -n <ns> --ignore-not-found

kubectl get crd | grep gateway.networking.k8s.io        # проверка наличия Gateway API CRD
kubectl get gatewayclass                                 # инфраструктурный уровень
kubectl get gateway -A                                   # точки входа
kubectl get httproute [-n <ns>]                           # маршруты L7 (уровень разработчика)
kubectl get httproute <name> -n <ns> -o yaml              # проверка status.parents.conditions
kubectl get referencegrant -n <ns>                        # разрешения cross-namespace ссылок

Ресурсы Gateway API (без отдельной CLI-команды, но важны для понимания модели): GatewayClass (cluster-scoped), Gateway (точка входа), HTTPRoute (namespaced-маршрутизация), ReferenceGrant (разрешение cross-namespace ссылок), ListenerSet и ClusterALBInstance (ресурсы модуля Deckhouse alb).

Jobs / CronJobs

1
2
3
4
5
6
7
8
kubectl create job <name> --image=<image> [-- <cmd>]
kubectl create job --from=cronjob/<name> <manual-run-name>   # ручной запуск CronJob вне расписания
kubectl get job,pod -n <ns>
kubectl get job,cronjob [-n <ns>]
kubectl get cronjob,job -n <ns> -w
kubectl get pods -n <ns> -l job-name=<name> -w
kubectl describe job <name> [-n <ns>]
kubectl delete job <name>

RBAC

1
2
3
4
5
6
7
kubectl create serviceaccount <name> [-n <ns>]
kubectl create role <name> --verb=get,list --resource=configmaps [-n <ns>]
kubectl create rolebinding <name> --role=<role>|--clusterrole=<cr> --serviceaccount=<ns>:<sa> [-n <ns>]
kubectl auth can-i <verb> <resource> --as=system:serviceaccount:<ns>:<sa> [-n <ns>]
kubectl auth can-i <verb> <resource> -n <ns> --as=<user>
kubectl get role,rolebinding,clusterrole,clusterrolebinding [-n <ns>]
kubectl get rolebinding -n <ns>

Иерархия namespace-ролей Deckhouse (в RoleBinding.roleRef.name): d8:use:role:viewerd8:use:role:userd8:use:role:managerd8:use:role:admin.

Автомасштабирование: HPA / VPA

1
2
3
4
5
kubectl get hpa [-n <ns> | -A] [-o wide]
kubectl describe hpa <name> -n <ns>
kubectl get servicemetric,ingressmetric -A               # кастомные метрики Deckhouse для HPA
kubectl get vpa [-n <ns> | -A]
kubectl describe vpa <name> -n <ns>                       # включая Recommendation: CPU/память

PodDisruptionBudget и эвакуация узлов

1
2
3
4
kubectl get pdb [-n <ns> | -A]
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data --dry-run=server   # dry-run с учётом PDB
kubectl drain <node> --dry-run=server
kubectl taint nodes <node> <key>=<value>:NoSchedule

Мониторинг, логирование, observability (Deckhouse CRD)

1
2
3
4
5
6
kubectl get podmonitor,probe,scrapeconfig -n <ns>
kubectl get podmonitor -n <ns> -o yaml | grep -A1 "prometheus:"
kubectl get clusterobservabilitymetricsrulesgroup,observabilitymetricsrulesgroup -A
kubectl get customalertmanager -n <ns>
kubectl get clusterlogdestination -A
kubectl get podloggingconfig -n <ns>

Backup

1
2
kubectl get volumesnapshotclass
kubectl get cronjob -n <ns>                                # периодические backup-джобы (дамп БД и т.п.)

Security

1
kubectl label ns <ns> security.deckhouse.io/pod-policy=restricted [--dry-run=server]

Application / package (marketplace CRD платформы)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
kubectl explain application.spec
kubectl get application [-A | -n <ns>]
kubectl get app -n <ns>                                    # shortName для application
kubectl get app -n <ns> -w
kubectl get app <name> -n <ns> -o jsonpath='{.status.conditions}'
kubectl get app <name> -n <ns> -o jsonpath='{.status.conditions}' | jq
kubectl get app <name> -n <ns> -o jsonpath='{.status.summary}'; echo
kubectl get app <name> -n <ns> -o jsonpath='{.status.conditions[?(@.type=="UpdateInstalled")]}'
kubectl patch app -n <ns> <name> --type=merge -p '{"spec":{"packageVersion":"<version>"}}'
kubectl get deployment -n <ns> -l app.kubernetes.io/name=<package-name>
kubectl get <resource> -n <ns> -l app.kubernetes.io/instance=<instance-name>
kubectl explain packagerepository | packagerepositoryoperation | applicationpackageversion | applicationpackage
kubectl get packagerepository [-o yaml]
kubectl get packagerepositoryoperation
kubectl get applicationpackageversion [-A] | grep <name>
kubectl get applicationpackage <name> -o yaml

Troubleshooting

1
2
3
4
5
kubectl get events -n <ns> --sort-by='.lastTimestamp'      # FailedScheduling, ImagePullBackOff и т.п.
kubectl logs <pod> -n <ns> --previous
kubectl get statefulset -n d8-upmeter | grep smoke-mini     # проверка SLA-инфраструктуры Upmeter
kubectl exec -it <pod> -- sh                                 # НЕ работает в distroless-контейнерах
kubectl debug -it <pod> --image=busybox --target=<container> # эфемерный debug-контейнер (в т.ч. для distroless)

Deckhouse platform (Module / ModuleConfig)

1
2
3
4
5
6
7
8
9
kubectl get modules                                          # cluster-wide Module
kubectl get module <name> -o yaml
kubectl get module <name> -o jsonpath='{.status.summary}'; echo
kubectl get moduleconfig [<name>] [-o yaml]
kubectl get moduleconfig <name> -o jsonpath='{.spec.enabled}'; echo
kubectl patch moduleconfig <name> --type=merge -p '{"spec":{"enabled":true|false}}'
kubectl get moduleconfig -o custom-columns=NAME:.metadata.name,ENABLED:.spec.enabled
kubectl get modulesource
kubectl get pods -n d8-system [-l app=deckhouse]

Дополнительно: полезные команды из официальной документации Kubernetes

Эти команды не встречаются напрямую в уроках курса, но входят в официальный kubectl Quick Reference и пригодятся в реальной эксплуатации.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
kubectl top pod [-n <ns>]                                    # метрики CPU/памяти по подам (нужен metrics-server)
kubectl top pod <name> --containers                          # метрики по каждому контейнеру пода
kubectl top pod <name> --sort-by=cpu|memory
kubectl top node                                              # метрики узлов
kubectl cp <ns>/<pod>:<path> <local-path>                     # скопировать файл из пода на локальную машину
kubectl run -i --tty busybox --image=busybox:1.28 -- sh       # разовый интерактивный под
kubectl run <name> --image=<image> --dry-run=client -o yaml > pod.yaml  # сгенерировать манифест без применения
kubectl cordon <node>                                          # запретить планирование новых подов на узел
kubectl uncordon <node>
kubectl diff -f <file>                                         # показать разницу перед apply
kubectl get pods --field-selector=status.phase=Running
kubectl get pods --sort-by='.status.startTime'