- PVSM.RU - https://www.pvsm.ru -
Внутри компании мы активно делимся между собой полученными знаниями: не только в виде формальных wiki-инструкций, но и сообщениями в Slack (а чтобы ничего не терялось, предусмотрена умная система поиска, но это уже отдельная история…). У нас накопилось уже большое количество разнообразных заготовок для консольных операций в Kubernetes с kubectl. Про них и пойдет речь в этой статье.
Какие-то команды могут оказаться повседневной обыденностью для некоторых читателей, но если найдутся и те, кто откроет для себя новое, улучшив тем самым свою эффективность, — цель статьи будет достигнута.
NB: Некоторые из перечисленных ниже команд были составлены нашими инженерами, а другие — найдены на просторах интернета. В последнем случае они были проверены и признаны полезными.
Итак, поехали!
--all-namespaces
не является секретом ни для кого. Но многие так привыкли к нему, что не заметили появления более короткой версии — -A
(по меньшей мере, такая возможность точно присутствует начиная с релиза Kubernetes 1.15).Running
)?
kubectl get pods -A --field-selector=status.phase!=Running | grep -v Complete
Кстати, присмотреться к --field-selector
вообще очень полезно (см. документацию [1]).
kubectl get no -o json |
jq -r '.items | sort_by(.status.capacity.memory)[]|[.metadata.name,.status.capacity.memory]| @tsv'
kubectl get po -o json --all-namespaces |
jq '.items | group_by(.spec.nodeName) | map({"nodeName": .[0].spec.nodeName, "count": length}) | sort_by(.count)'
ns=my-namespace
pod_template=my-pod
kubectl 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'ы, которые потребляют максимальное количество процессора или памяти:
# cpu
kubectl top pods -A | sort --reverse --key 3 --numeric
# memory
kubectl top pods -A | sort --reverse --key 4 --numeric
kubectl get pods --sort-by=.status.containerStatuses[0].restartCount
Разумеется, сортировка может быть и по другим полям (см. PodStatus [2] и ContainerStatus [3]).
-o wide
:
kubectl -n jaeger get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
jaeger-cassandra ClusterIP None <none> 9042/TCP 77d app=cassandracluster,cassandracluster=jaeger-cassandra,cluster=jaeger-cassandra
Как легко увидеть, в этом случае мы сразу получаем селектор, по которому сервис находит нужные pod'ы.
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 yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: test
name: test
spec:
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 hpa
KIND: HorizontalPodAutoscaler
VERSION: autoscaling/v1
DESCRIPTION:
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.
Полная и весьма полезная информация!
kubectl get nodes -o json |
jq -r '.items[].status.addresses[]? | select (.type == "InternalIP") | .address' |
paste -sd "n" -
kubectl get --all-namespaces svc -o json |
jq -r '.items[] | [.metadata.name,([.spec.ports[].nodePort | tostring ] | join("|"))]| @tsv'
kubectl get nodes -o jsonpath='{.items[*].spec.podCIDR}' | tr " " "n"
kubectl -n my-namespace logs -f my-pod --timestamps
2020-07-08T14:01:59.581788788Z fail: Microsoft.EntityFrameworkCore.Query[10100]
Выглядит намного удобнее, не так ли?
--tail
:
kubectl -n my-namespace logs -f my-pod --tail=50
kubectl -n my-namespace logs -f my-pod --all-containers
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
Вместо заключения — небольшой список схожих материалов и коллекций, найденных в интернете:
Читайте также в нашем блоге:
Автор: Сизов Сергей
Источник [13]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/sistemnoe-administrirovanie/355581
Ссылки в тексте:
[1] документацию: https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/
[2] PodStatus: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#podstatus-v1-core
[3] ContainerStatus: https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.18/#containerstatus-v1-core
[4] Официальная подсказка (cheatsheet): https://kubernetes.io/ru/docs/reference/kubectl/cheatsheet/
[5] Краткое практическое введение и неплохая табличка (2 стр.): https://linuxacademy.com/blog/containers/kubernetes-cheat-sheet/
[6] Весьма обширный список команд: https://www.bluematador.com/learn/kubectl-cheatsheet
[7] Подборка ссылок в gist'е: https://gist.github.com/pydevops/0efd399befd960b5eb18d40adb68ef83
[8] GitHub-репозиторий Kubernetes-Cheat-Sheet: https://github.com/RehanSaeed/Kubernetes-Cheat-Sheet
[9] GitHub-репозиторий kubectl-aliases: https://github.com/ahmetb/kubectl-aliases
[10] Полезные команды и советы при работе с Kubernetes через консольную утилиту kubectl: https://habr.com/ru/company/flant/blog/333956/
[11] Консольные помощники для работы с Kubernetes через kubectl: https://habr.com/ru/company/flant/blog/341606/
[12] Обзор графических интерфейсов для Kubernetes: https://habr.com/ru/company/flant/blog/506948/
[13] Источник: https://habr.com/ru/post/512762/?utm_source=habrahabr&utm_medium=rss&utm_campaign=512762
Нажмите здесь для печати.