Сделаю себе заметку со списком команд для работы с Kubernetes. Дополнять буду по мере необходимости использования тех или иных команд на работе или на моем сервере.
Для начала, если используете или планируете использовать vi/vim, то добавим настройки. Открываем:
$ vim ~/.vimrc
Вставляем:
" Yaml file handling
autocmd FileType yaml setlocal ts=2 sts=2 sw=2 expandtab
filetype plugin indent on
autocmd FileType yaml setl indentkeys-=<:>
" Copy paste with ctr+c, ctr+v, etc
:behave mswin
:set clipboard=unnamedplus
:smap <Del> <C-g>"_d
:smap <C-c> <C-g>y
:smap <C-x> <C-g>x
:imap <C-v> <Esc>pi
:smap <C-v> <C-g>p
:smap <Tab> <C-g>1>
:smap <S-Tab> <C-g>1<
Так же можно добавить автодополнение команд для kubectl.
Если используете BASH:
$ source <(kubectl completion bash) && \
echo "source <(kubectl completion bash)" >> ~/.bashrc
Перезапускаем оболочку или можно выполнить:
$ bash ~/.bashrc
Если используете ZSH:
$ source <(kubectl completion zsh) && \
echo "if [ $commands[kubectl] ]; then source <(kubectl completion zsh); fi" >> ~/.zshrc
Перезапускаем оболочку или можно выполнить:
$ . ~/.zshrc
И так, приступим к командам.
Работа с POD-ами в Kubernetes
Вывести все поды которые задеплоились:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
mirrormaker-in-kubernetes-chart-mirrormaker-in-kubernetes-mpsb8 0/1 Pending 0 19d
Вывести все нейм-спейсы которые используют поды:
$ kubectl get pods --all-namespaces
NAMESPACE NAME READY STATUS RESTARTS AGE
default mirrormaker-in-kubernetes-chart-mirrormaker-in-kubernetes-mpsb8 0/1 Pending 0 19d
docker compose-7b7c5cbbcc-6l5gt 1/1 Running 0 28d
docker compose-api-dbbf7c5db-jxmz4 1/1 Running 1 28d
Чтобы вывести информацию о задеплоином ПОД-е, используем:
$ kubectl get pod mirrormaker-in-kubernetes-chart-mirrormaker-in-kubernetes-mpsb8 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
mirrormaker-in-kubernetes-chart-mirrormaker-in-kubernetes-mpsb8 0/1 Pending 0 19d <none> <none> <none> <none>
Т.е синтаксис такой:
$ kubectl get pod <NAME_of_POD_HERE> -o wide
Или чтобы вывести инфу в виде YAML вывода, используем:
$ kubectl get pod <NAME_of_POD_HERE> -o yaml
Если нужно получить YAML вывод от ПОД-а без информации о кластере, то вот команда:
$ kubectl get pod my-pod -o yaml --export
Для вывода\дискрайба POD-а, выполняем:
$ kubectl describe pod <NAME_of_POD_HERE>
Или:
$ kubectl describe pods <NAME_of_POD_HERE>
Можно еще так:
$ kubectl describe nodes <NAME_of_POD_HERE>
Если есть необходимость отсортировать поды, например по количеству рестартов, то команда:
$ kubectl get pods --sort-by='.status.containerStatuses[0].restartCount'
Получить все поды по определенной лейбе:
$ kubectl get pods --selector=app=my_app_here -o \
jsonpath='{.items[*].metadata.labels.version}'
Так же, при необходимости, можно вывести все поды по конкретному неймспйсу и чтобы ПОД-ы были запущены:
$ kubectl get pods --field-selector=status.phase=Running -n docker
NAME READY STATUS RESTARTS AGE
compose-7b7c5cbbcc-6l5gt 1/1 Running 0 28d
compose-api-dbbf7c5db-jxmz4 1/1 Running 1 28d
Получить ExternalIPs всех узлов:
$ kubectl get nodes -o jsonpath='{.items[*].status.addresses[?(@.type=="ExternalIP")].address}'
Получить ПОД-ы со всеми лейбами которые они имеют, можно запустив команду:
$ kubectl get pods --show-labels
Удалить под можно так:
$ kubectl delete pod <NAME_OF_POD_HERE_1> <NAME_OF_POD_HERE_2>
Чтобы удалить ПОД с помощью файла в котором хранится конфигурация, можно так:
$ kubectl delete -f ./pod.json
Удалить ПОД-ы по определенной лейбе:
$ kubectl delete pods -l name=myLabel
Для удаления всех ПОД-ов в определенном неймспейсе:
$ kubectl -n <NAMESPACE_HERE> delete pod --all
Удалить все POD-ы, соответствующие awk pattern1 или pattern2 паттернам:
$ kubectl get pods -n <NAMESPACE_HERE> --no-headers=true | awk '/pattern1|pattern2/{print $1}' | xargs kubectl delete -n <NAMESPACE_HERE> pod
Идем дальше.
Работа с Deployments в Kubernetes
Создаем один deployment:
$ kubectl run <NAME_of_POD_HERE> --image=<NAME_of_IMAGE_HERE> --record
Получаем список деплойментов:
$ kubectl get deployments
Скользящее обновление «www» контейнеров «frontend» развертывания, обновление образа:
$ kubectl set image deployment/frontend www=image:v2
Список истории развертываний можно получить так:
$ kubectl rollout history deployment/<YOUR_DEPLOYMENT_NAME_HERE>
Если нужно получить конкретную, то выполняем:
$ kubectl rollout undo deployment/<YOUR_DEPLOYMENT_NAME_HERE> --to-revision=N
Наблюдайте за непрерывным обновлением статуса развертывания «внешнего интерфейса» до завершения
$ kubectl rollout status -w deployment/<YOUR_DEPLOYMENT_NAME_HERE>
Чтобы развернуть несколько реплик с приложением, выполняем:
$ kubectl scale deployment/<NAME_of_POD_HERE> --replicas=<N_COUNT_REPLICAS>
Можно использовать файл:
$ kubectl scale --replicas=3 -f scale_replicas.yaml
Если текущий размер деплоймена с равен 3, масштабируйте его до 4 так:
$ kubectl scale --current-replicas=3 --replicas=4 deployment/<YOUR_DEPLOYMENT_HERE>
Можно сделать реплику для нескольких деплойментов, например:
$ kubectl scale --replicas=5 rc/<YOUR_DEPLOYMENT_HERE_1> rc/<YOUR_DEPLOYMENT_HERE_2> rc/<YOUR_DEPLOYMENT_HERE_3>
Чтобы заменить ПОД описание которого содержится в файле можно так:
$ cat pod.json | kubectl replace -f -
Можно выполнить команду и пересоздать ПОД силой (Будет аутедж!):
$ kubectl replace --force -f ./pod.json
И так далее.
Работа с Services в Kubernetes
Чтобы получить список сервисов, выполняем:
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 28d
Если есть необходимость отсортировать сервисы по имени, используем команду:
$ kubectl get services --sort-by=.metadata.name
Создать POD в виде сервиса (создает endpoints):
$ kubectl expose deployment/<YOUR_DEPLOYMENT_NAME_HERE> --port=8080 --type=NodePort
Удалить service по определенной лейбе:
$ kubectl delete service -l name=myLabel
Для удаления всех service-ов в определенном неймспейсе:
$ kubectl -n <NAMESPACE_HERE> delete service --all
Шагаем дальше!
Работа с Volumes в Kubernetes
Чтобы получить список Persistent Volumes:
$ kubectl get pv
Чтобы получить список Persistent Volumes Claims:
$ kubectl get pvc
Если есть необходимость сортировки, можно использовать:
$ kubectl get pv -n <YOUR_NAMESPACE_HERE> --sort-by=.spec.capacity.storage
Можно использовать другие ключи при необходимости.
Работа с Secrets в Kubernetes
Для начала, получим список сикретов:
$ kubectl get secrets
NAME TYPE DATA AGE
default-token-rr6t6 kubernetes.io/service-account-token 3 28d
sh.helm.release.v1.mirrormaker-in-kubernetes-chart.v1 helm.sh/release.v1 1 19d
Если не знаете как создать сикрет через CLI, то можно использовать помощь:
$ kubectl create secret generic --help
Например, создаем вот такой сикрет:
$ kubectl create secret generic mysql --from-literal=password=root
Получим информацию о созданном сикрете так:
$ kubectl get secrets mysql -o yaml
apiVersion: v1
data:
password: cm9vdA==
kind: Secret
metadata:
creationTimestamp: "2019-12-23T21:33:24Z"
name: mysql
namespace: default
resourceVersion: "210625"
selfLink: /api/v1/namespaces/default/secrets/mysql
uid: e0ad6215-cc96-4e03-9ea8-ca5a58a5980c
type: Opaque
Или, можно создать сикрет следующим образом:
$ cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: mysecret
type: Opaque
data:
password: $(echo -n "s33msi4" | base64 -w0)
username: $(echo -n "jane" | base64 -w0)
EOF
Кому как удобнее, так и используйте.
Вывести все секреты, которые в данный момент используются ПОД-ами:
$ kubectl get pods -o json | jq '.items[].spec.containers[].env[]?.valueFrom.secretKeyRef.name' | grep -v null | sort | uniq
Что дальше? Дальше идем….
Работа с ConfigMaps в Kubernetes
Чтобы создать конфиг-мапу, например с JS файла:
$ kubectl create configmap <configmap_name_here> --from-file=config.js
Получаем инфу о конфиг-мапе:
$ kubectl get configmap <configmap_name_here> -o yaml
Работа с DNS в Kubernetes
Получим все DNS-ы по всем неймспейсам:
$ kubectl get pods --all-namespaces |grep dns
kube-system coredns-5c98db65d4-95dlc 1/1 Running 1 28d
kube-system coredns-5c98db65d4-rhvvs 1/1 Running 1 28d
Проверить DNS для nginx ПОД-а (при условии, что POD / контейнер работает) можно так:
$ kubectl exec -ti busybox -- nslookup nginx
Примечание: kube-proxy, работающий в worker узлах, управляет службами и устанавливает правила iptables для прямого трафика.
Работа с Ingress в Kubernetes
Получаем все ингресы:
$ kubectl get ingress
Или, если необходимо использовать другой namespace:
$ kubectl get ingress -n docker
No resources found in docker namespace.
Команды для управления типом службы Ingress для ClusterIP:
$ kubectl expose deployment <YOUR_DEPLOYMENT_HERE> --port=2368
Идем дальше.
Работа с Horizontal Pod Autoscaler в Kubernetes
Чтобы получить все поды которые были задеплоины в виде горизонтального маштабирования, так:
$ kubectl get hpa
Или, если нужно указать другое имя для неймспейса:
$ kubectl get hpa -n docker
No resources found in docker namespace.
Задеплоим сервис с репликой, например:
$ kubectl autoscale deployment <YOUR_DEPLOYMENT_HERE> --min=6 --max=666
Для помощи, используем:
$ kubectl autoscale --help
Работа с DaemonSets в Kubernetes
Чтобы получить ДемонСеты, стоит выполнить:
$ kubectl get daemonsets
Или:
$ kubectl get ds
Дальше добавлю если будет тут инфа.
Работа с Scheduler в Kubernetes
Политика на основе NodeSelector:
$ kubectl label node minikube foo=bar
Связывание узлов через API-сервер:
$ kubectl proxy
$ curl -H "Content-Type: application/json" -X POST --data @binding.json http://localhost:8001/api/v1/namespaces/default/pods/foobar-sched/binding
Работа с Tains and Tolerations в Kubernetes
Есть команда:
$ kubectl taint node master foo=bar:NoSchedule
Как-то так.
Troubleshooting в Kubernetes
И так, вот список команд которые помогут в траблшутинге K8S:
$ kubectl describe
$ kubectl logs
$ kubectl exec
$ kubectl get nodes --show-labels
$ kubectl get events
Пример, если необходимо получить логи с ПОД-а:
$ kubectl logs <YOUR_POD_HERE>
Тоже самое, но с использованием меток:
$ kubectl logs -l name=<YOUR_LABEL_HERE>
Вывести логи с придедущего инстала:
$ kubectl logs <YOUR_POD_HERE> --previous
Тоже самое, но мулитиконвеер:
$ kubectl logs <YOUR_POD_HERE> -c <YOUR_CONTAINER_HERE>
Журналы дампа, с именем метки = yourLabel (стандартный вывод):
$ kubectl logs -l name= yourLabel -c <YOUR_CONTAINER_HERE>
Можно добавить опцию «-f» чтобы получать логи в реальном времени:
$ kubectl logs -f <YOUR_POD_HERE>
Запускать pod как интерактивную оболочку:
$ kubectl run -i --tty busybox --image=busybox -- sh
Чтобы запустить энжинкс в pod в определенном пространстве имен:
$ kubectl run nginx --image=nginx --restart=Never -n
your_namespace_here
Запустите pod с nginx и запишите его спецификацию в файл с именем pod.yaml можно так:
$ kubectl run nginx --image=nginx --restart=Never --dry-run -o yaml > pod.yaml
Приатачиться к контейнеру можно так:
$ kubectl attach <YOUR_POD_HERE> -i
Чтобы сделать форвординг портов с локальной машины (например 5555) на ПОД (порт 6666), выполните:
$ kubectl port-forward <YOUR_POD_HERE> 5555:6666
Чтобы выполнить команду на ПОД-е (только в одном контейнере):
$ kubectl exec <YOUR_POD_HERE> -- ls /
Чтобы выполнить команду на ПОД-е (в нескольких контейнерах):
$ kubectl exec <YOUR_POD_HERE> -c <YOUR_CONTAINER_HERE> -- ls /
Показать метрики для данного ПОД-а и его контейнеров:
$ kubectl top pod <YOUR_POD_HERE> --containers
Выводим список ивентов отсортированых по timestamp:
$ kubectl get events --sort-by=.metadata.creationTimestamp
Может что-то еще полезное найду и дополню тут.
Взаимодействие с нодами и кластером
Можно пометить ноду как «недоступную» чтобы на нее не шел трафик:
$ kubectl cordon <YOUR_POD_HERE>
Выводим узел на мейнененс окно:
$ kubectl drain <YOUR_POD_HERE>
Вернуть ноду можно так:
$ kubectl uncordon <YOUR_POD_HERE>
Посмотреть метрики на хосте:
$ kubectl top node <YOUR_POD_HERE>
Чтобы вывести мастер-адресс и его сервисы, выполните:
$ kubectl cluster-info
Kubernetes master is running at https://kubernetes.docker.internal:6443
KubeDNS is running at https://kubernetes.docker.internal:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
Вывести текущее состояние дампа кластера в stdout:
$ kubectl cluster-info dump
Можно записать текущее состояние дампа кластера в файл, например:
$ kubectl cluster-info dump --output-directory=./k8s_state.json
Идем дальше.
Работа с Role Based Access Control в Kubernetes
Перечислите все поддерживаемые типы ресурсов вместе с их короткими именами, группой API, являются ли они пространством имен и Kind:
$ kubectl api-resources
Такс, чтобы вывести все ресурсы пространства имен:
$ kubectl api-resources --namespaced=true
Чтобы вывести все ресурсы не относящихся к пространству имен:
$ kubectl api-resources --namespaced=false
Чтобы получить только список имен, можно использовать:
$ kubectl api-resources -o name
Или, использовать такой подход (показать все ресурсы с расширенным (он же «широкий») выводом):
$ kubectl api-resources -o wide
Получить все ресурсы, которые поддерживают «list» и «get»:
$ kubectl api-resources --verbs=list,get
Получить все ресурсы в группе API «Расширения»:
$ kubectl api-resources --api-group=extensions
NAME SHORTNAMES APIGROUP NAMESPACED KIND
daemonsets ds extensions true DaemonSet
deployments deploy extensions true Deployment
ingresses ing extensions true Ingress
networkpolicies netpol extensions true NetworkPolicy
podsecuritypolicies psp extensions false PodSecurityPolicy
replicasets rs extensions true ReplicaSet
Почти подошли к завершению…
Работа с Role Based Access Control в Kubernetes
Создаем роль:
$ kubectl create role YOUR_ROLE_HERE --verb=get --verb=list --verb=watch --resource=pods
Получаем инфу о роле:
$ kubectl get rolebinding <YOUR_ROLE_HERE> -o yaml
Работа с Security Contexts в Kubernetes
Чтобы задеплоить контекст который описан в файле, выполните:
$ kubectl apply -f https://k8s.io/examples/pods/security/security-context.yaml
Или 2-й пример:
$ kubectl apply -f https://k8s.io/examples/pods/security/security-context-2.yaml
Дополню позже, когда столкнусь с необходимостью….
Работа с Pod Security Policies в Kubernetes
Дополню позже, когда столкнусь с необходимостью….
Работа с Network Policies в Kubernetes
Создаем аннотацию:
$ kubectl annotate ns <namespace> "net.beta.kubernetes.io/network-policy={\"ingress\": {\"isolation\": \"DefaultDeny\"}}"
Чтобы получить полную или обновленную информацию, советую обратиться к официальной документации!
Вот и все, статья «Команды Kubernetes в Unix/Linux» завершена.
Спасибо огромное за полезную статью и ваш труд.