Команды Kubernetes в Unix/Linux

Сделаю себе заметку со списком команд для работы с 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» завершена.

One thought on “Команды Kubernetes в Unix/Linux

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.