Какие-то команды могут оказаться повседневной обыденностью для некоторых читателей, но если найдутся и те, кто откроет для себя новое, улучшив тем самым свою эффективность, цель статьи будет достигнута.
NB: Некоторые из перечисленных ниже команд были составлены нашими инженерами, а другие найдены на просторах интернета. В последнем случае они были проверены и признаны полезными.
Итак, поехали!
Получение списков pod'ов и узлов
- Думаю, что получение всех pod'ов из всех пространств имён путем
указания ключа
--all-namespaces
не является секретом ни для кого. Но многие так привыкли к нему, что не заметили появления более короткой версии-A
(по меньшей мере, такая возможность точно присутствует начиная с релиза Kubernetes 1.15). - Как найти все проблемные pod'ы, которые не в запущенном
состоянии (т.е. не
Running
)?kubectl get pods -A --field-selector=status.phase!=Running | grep -v Complete
Кстати, присмотреться к--field-selector
вообще очень полезно (см. документацию). - Получить список узлов с указанием объема их оперативной
памяти:
kubectl get no -o json | \ jq -r '.items | sort_by(.status.capacity.memory)[]|[.metadata.name,.status.capacity.memory]| @tsv'
- Получить список узлов и количество pod'ов на них:
kubectl get po -o json --all-namespaces | \ jq '.items | group_by(.spec.nodeName) | map({"nodeName": .[0].spec.nodeName, "count": length}) | sort_by(.count)'
- Бывает, что по какой-то причине DaemonSet не выехал на какой-то
узел. Искать вручную утомительное занятие, поэтому вот мини-скрипт
для получения списка узлов, на которые не выехали
DaemonSet'ы:
ns=my-namespacepod_template=my-podkubectl get node | grep -v \"$(kubectl -n ${ns} get pod --all-namespaces -o wide | fgrep ${pod_template} | awk '{print $8}' | xargs -n 1 echo -n "\|" | sed 's/[[:space:]]*//g')\"
- Вот так с
kubectl top
можно получить pod'ы, которые потребляют максимальное количество процессора или памяти:# cpukubectl top pods -A | sort --reverse --key 3 --numeric# memorykubectl top pods -A | sort --reverse --key 4 --numeric
- Сортировка списка pod'ов в данном случае, по количеству
рестартов:
kubectl get pods --sort-by=.status.containerStatuses[0].restartCount
Разумеется, сортировка может быть и по другим полям (см. PodStatus и ContainerStatus).
Получение другой информации
- Когда производится отладка работы Ingress'а, мы неизбежно
доходим до сервиса и далее ищем pod'ы по его селектору. Сначала я
искал селектор в манифесте сервиса, но со временем позже начал
применять
-o wide
:kubectl -n jaeger get svc -o wideNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTORjaeger-cassandra ClusterIP None <none> 9042/TCP 77d app=cassandracluster,cassandracluster=jaeger-cassandra,cluster=jaeger-cassandra
Как легко увидеть, в этом случае мы сразу получаем селектор, по которому сервис находит нужные pod'ы. - Получить по каждому контейнеру каждого pod'а его limits и
requests:
kubectl get pods -n my-namespace -o=custom-columns='NAME:spec.containers[*].name,MEMREQ:spec.containers[*].resources.requests.memory,MEMLIM:spec.containers[*].resources.limits.memory,CPUREQ:spec.containers[*].resources.requests.cpu,CPULIM:spec.containers[*].resources.limits.cpu'
- У команды
kubectl run
(а такжеcreate
,apply
,patch
) есть замечательная возможность посмотреть изменения до их применения это делает флаг--dry-run
. А если применить вкупе с-o yaml
, можно получить манифест требуемой сущности. Например:kubectl run test --image=grafana/grafana --dry-run -o yamlapiVersion: apps/v1kind: Deploymentmetadata: creationTimestamp: null labels: run: test name: testspec: replicas: 1 selector: matchLabels: run: test strategy: {} template: metadata: creationTimestamp: null labels: run: test spec: containers: - image: grafana/grafana name: test resources: {}status: {}
Осталось только сохранить в файл, удалить пару системных/ненужных полей и можно использовать дальше. - Получить пояснение по манифесту какого-либо ресурса:
kubectl explain hpaKIND: HorizontalPodAutoscalerVERSION: autoscaling/v1DESCRIPTION: configuration of a horizontal pod autoscaler.FIELDS: apiVersion <string> APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources kind <string> Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds metadata <Object> Standard object metadata. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#metadata spec <Object> behaviour of autoscaler. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#spec-and-status. status <Object> current information about the autoscaler.
Полная и весьма полезная информация!
Сети
- Получить внутренние IP-адреса узлов кластера:
kubectl get nodes -o json | \ jq -r '.items[].status.addresses[]? | select (.type == "InternalIP") | .address' | \ paste -sd "\n" -
- Вывести все сервисы и nodePort, которые они занимают:
kubectl get --all-namespaces svc -o json | \ jq -r '.items[] | [.metadata.name,([.spec.ports[].nodePort | tostring ] | join("|"))]| @tsv'
- В ситуациях, когда возникают проблемы с CNI (например, с
Flannel), для выявления проблемного pod'а надо проверить маршруты.
Здесь очень пригодятся подсети pod'ов, которые используются в
кластере:
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' | tr " " "\n"
Логи
- Получение логов pod'а c человекочитаемым timestamp на случай
его отсутствия:
kubectl -n my-namespace logs -f my-pod --timestamps2020-07-08T14:01:59.581788788Z fail: Microsoft.EntityFrameworkCore.Query[10100]
Выглядит намного удобнее, не так ли? - Не ждите, пока выведется весь лог контейнера pod'а используйте
--tail
:kubectl -n my-namespace logs -f my-pod --tail=50
- Получить логи со всех контейнеров pod'а:
kubectl -n my-namespace logs -f my-pod --all-containers
- Получить логи со всех pod'ов на основании label'а:
kubectl -n my-namespace logs -f -l app=nginx
- Получить логи предыдущего контейнера, который, к примеру,
упал:
kubectl -n my-namespace logs my-pod --previous
Другие быстрые действия
- Как скопировать все секреты из одного пространства имён в
другое?
kubectl get secrets -o json --namespace namespace-old | \ jq '.items[].metadata.namespace = "namespace-new"' | \ kubectl create-f -
- Быстро создать самоподписанный сертификат для тестов:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=grafana.mysite.ru/O=MyOrganization"kubectl -n myapp create secret tls selfsecret --key tls.key --cert tls.crt
Полезные ссылки по теме
Вместо заключения небольшой список схожих материалов и коллекций, найденных в интернете:
- Официальная подсказка (cheatsheet) из документации Kubernetes;
-
Краткое практическое введение и неплохая табличка (2 стр.) от
Linux Academy, которая поможет сократить время начинающим
инженерам:
- Весьма обширный список команд от Blue Matador, разбитый по разделам;
- Подборка ссылок в gist'е на таблицы с командами, статьи по теме и некоторые команды;
- GitHub-репозиторий Kubernetes-Cheat-Sheet от другого энтузиаста содержит только команды, разбитые по категориям;
- GitHub-репозиторий kubectl-aliases настоящий рай для любителей сокращений.
P.S.
Читайте также в нашем блоге: