Info
Content

Как подключаться к K8S и самые популярные команды

Как подключиться

Основная утилита для работы с k8s - это kubectl

Как установить kubectl:


Очень полезно настроить автодополнение для kubectl, потому что команды у kubectl бывают длинными и сложными, а автодополнение позволит ускориться и меньше ошибаться

Чтобы kubectl мог найти и получить доступ к кластеру Kubernetes, нужен файл kubeconfig
По умолчанию конфигурация kubectl находится в ~/.kube/config

Команда kubectl cluster-info позволит проверить корректно ли сконфигурирован kubectl (если все хорошо, то она выведет информацию о кластере, а если есть проблемы, то выведет сообщение о проблеме)

Kubeconfig'ом пользуются разные утилиты:

  • Консольные - kubectl, k9s, helm, и пр
  • Графические - lens, webui, и пр

Для работы со всеми этими инструментами достаточно иметь корректный kubeconfig, они просто прочитают его и сразу (без дополнительных манипуляций) позволят работать


k9s_legionfarm.png
k9s

lens_legionfarm.png
lens


kubeconfig

Структура

Kubeconfig состоит из нескольких составных частей которые объединяются в контексты

С помощью группы команд kubectl config можно управлять содержимым kubeconfig'a

$ kubectl config <TAB>
current-context  delete-context   get-clusters     get-users        set              set-context      unset            view
delete-cluster   delete-user      get-contexts     rename-context   set-cluster      set-credentials  use-context

Подробнее тут: https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/


Где взять

Если кластер в Амазоне, то проще всего сделать это через aws-cli:

  1. Настроить aws-cli:
    Сконфигурировать
    $ aws configure
    AWS Access Key ID [None]: <secret>
    AWS Secret Access Key [None]: <secret>
    Default region name [None]: eu-west-3
    Default output format [None]: json
    
    Проверить
    $ aws sts get-caller-identity
    {
        "UserId": "<secret>",
        "Account": "<secret>",
        "Arn": "arn:aws:iam::<secret>:user/k8s-user"
    }
    
  2. Обновить kubeconfig
    $ aws eks --region eu-west-3 update-kubeconfig --name education-eks-RhxcE48z
    Added new context arn:aws:eks:eu-west-3:<secret>:cluster/education-eks-RhxcE48z to /Users/vandud/.kube/config
    

Если не удается, то kubeconfig можно запросить у команды devops


Основные команды

kubectl

config

Показать контексты

$ k config get-contexts
CURRENT   NAME                                                                CLUSTER                                                             AUTHINFO                                                            NAMESPACE
          arn:aws:eks:eu-west-3:<secret>:cluster/education-eks-RhxcE48z   arn:aws:eks:eu-west-3:<secret>:cluster/education-eks-RhxcE48z   arn:aws:eks:eu-west-3:<secret>:cluster/education-eks-RhxcE48z
*         docker-desktop                                                      docker-desktop                                                      docker-desktop
          legionfarm-with-vpn_us-east-2                                       arn:aws:eks:us-east-2:<secret>:cluster/legion-eks               aws:cluster/legion-eks
          legionfarm_us-west-2                                                arn:aws:eks:us-west-2:<secret>:cluster/staging                  lastbackend-user

Переключить контекст

kubectl config use-context CONTEXT-NAME

Также можно воспользоваться командой kubectx (устанавливается отдельно)

$ kubectx legionfarm_us-west-2
Switched to context "legionfarm_us-west-2".
$ kubectx
arn:aws:eks:eu-west-3:<secret>:cluster/education-eks-RhxcE48z
docker-desktop
legionfarm-with-vpn_us-east-2
legionfarm_us-west-2 

В ее выводе текущий контекст выделен цветом

Вместе с kubectx устанавливается kubens
Работает аналогично, но переключает не контексты, а неймспейсы (namespace - логический подкластер)

$ kubens monitoring
Context "legionfarm_us-west-2" modified.
Active namespace is "monitoring".

apply/create

apply - одна из самых частых команд, она применит к кластеру указанный манифест

kubectl apply -f ./manifest.yaml

Можно указать папку с манифестами, тогда применятся все манифесты из папки

kubectl apply -f ./dir

Команда create просто создает какой-либо ресурс, а apply создает если еще не создано, и обновит уже существующее

explain

Очень полезная и удобная команда
Предоставляет документацию по ресурсам

$ kubectl explain pods
$ kubectl explain pods.spec
$ kubectl explain pods.spec.tolerations
$ kubectl explain pods.spec.tolerations.effect

Каждая из этих команд выведет на экран соответствующую документацию

get

kubectl get тоже частая команда, она позволяет вывести список ресурсов определенного типа
Например посмотрим поды из неймспейса logging

$ kubectl get pods -n logging
NAME                  READY   STATUS    RESTARTS   AGE
loki-0                1/1     Running   0          44d
loki-promtail-68dpk   1/1     Running   0          18d
loki-promtail-9ldn7   1/1     Running   0          41d
loki-promtail-c6lm8   1/1     Running   0          41d
loki-promtail-ckwc5   1/1     Running   0          45d
loki-promtail-fzltl   1/1     Running   0          41d
loki-promtail-t4kvd   1/1     Running   0          37d

Кроме подов можно отобразить и другие ресурсы

$ kubectl get svc -n logging
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
loki            ClusterIP   172.20.47.212   <none>        3100/TCP   61d
loki-headless   ClusterIP   None            <none>        3100/TCP   61d

Ключ -o позволяет указать формат вывода, у него масса значений, ниже некоторые основные

$ kubectl get svc -n logging -o name
service/loki
service/loki-headless
$ kubectl get svc -n logging
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
loki            ClusterIP   172.20.47.212   <none>        3100/TCP   61d
loki-headless   ClusterIP   None            <none>        3100/TCP   61d
$ kubectl get svc -n logging -o wide
NAME            TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE   SELECTOR
loki            ClusterIP   172.20.47.212   <none>        3100/TCP   61d   app=loki,release=loki
loki-headless   ClusterIP   None            <none>        3100/TCP   61d   app=loki,release=loki
$ kubectl get svc -n logging -o json
...
$ kubectl get svc -n logging -o yaml
...

Вывод в формате json можно дальше парсить через jq

$ kubectl get svc -n logging -o json | jq .items[0].spec.clusterIP
"172.20.47.212"

edit/scale/delete

Можно редактировать ресурсы прямо наживую
Команда edit откроет манифест ресурса в вашем редакторе по умолчанию
После сохранения изменения применятся к ресурсу

$ k edit deployments/vm-grafana -n monitoring    
deployment.apps/vm-grafana edited

Командой scale можно масштабировать репликасеты

$ k scale --replicas=1 rs/vm-grafana-5d469c787 -n monitoring
replicaset.apps/vm-grafana-5d469c787 scaled

Команда delete удаляет ресурсы

$ kubectl -n monitoring get pod vm-grafana-5d469c787-45qm2
NAME                         READY   STATUS    RESTARTS   AGE
vm-grafana-5d469c787-45qm2   2/2     Running   0          37d
$ kubectl -n monitoring delete pod vm-grafana-5d469c787-45qm2
pod "vm-grafana-5d469c787-45qm2" deleted
$ kubectl -n monitoring get pod vm-grafana-5d469c787-lcnz8 # из-за deployment'a создался новый под (но старый удалился :) )
NAME                         READY   STATUS    RESTARTS   AGE
vm-grafana-5d469c787-lcnz8   2/2     Running   0          41s

logs

Чтобы посмотреть конец лога в режиме follow --tail 10 -f (как tail -f) контейнера grafana из пода vm-grafana-5d469c787-lcnz8:

$ k logs -n monitoring vm-grafana-5d469c787-lcnz8 -c grafana --tail 10 -f
{"@level":"debug","@message":"datasource: registering query type fallback handler","@timestamp":"2021-08-16T01:47:16.861844Z"}
t=2021-08-16T01:47:16+0000 lvl=info msg="inserting datasource from configuration " logger=provisioning.datasources name=VictoriaMetrics uid=
t=2021-08-16T01:47:16+0000 lvl=info msg="HTTP Server Listen" logger=http.server address=[::]:3000 protocol=http subUrl= socket=
t=2021-08-16T01:49:15+0000 lvl=eror msg="Failed to look up user based on cookie" logger=context error="user token not found"
t=2021-08-16T01:49:15+0000 lvl=info msg="Request Completed" logger=context userId=0 orgId=0 uname= method=GET path=/ status=302 remote_addr=10.0.151.54 time_ms=0 size=29 referer=
t=2021-08-16T01:49:15+0000 lvl=eror msg="Failed to look up user based on cookie" logger=context error="user token not found"
t=2021-08-16T01:49:25+0000 lvl=eror msg="Failed to look up user based on cookie" logger=context error="user token not found"
t=2021-08-16T01:49:25+0000 lvl=info msg="Request Completed" logger=context userId=0 orgId=0 uname= method=POST path=/api/frontend-metrics status=401 remote_addr=10.0.151.54 time_ms=0 size=26 referer=https://ops.lstbknd.net/login
t=2021-08-16T01:50:01+0000 lvl=eror msg="Failed to look up user based on cookie" logger=context error="user token not found"
t=2021-08-16T01:50:01+0000 lvl=info msg="Successful Login" logger=http.server User=admin@localhost
^C

port-forward

Очень полезная команда
Позволяет прокинуть порт от пода до локального хоста

Например из пода с графаной

$ kubectl -n monitoring port-forward vm-grafana-5d469c787-lcnz8 3000:3000
Forwarding from 127.0.0.1:3000 -> 3000
Forwarding from [::1]:3000 -> 3000
...

И видим в браузере что все работает

Screenshot_2021_02_02-12_49_03-2021-08-grafana.png

diff

Позволяет увидеть разницу между текущим состоянием ресурса и его описанием из файла

$ k apply -f configmap.yaml # применили
configmap/demo-config created
$ vim configmap.yaml # отредактировали
$ k diff -f configmap.yaml # смотрим чем отличаются
diff -u -N /var/folders/zd/bqd54lkx6_zgbwl9l72z8dzr0000gn/T/LIVE-445248743/v1.ConfigMap.default.demo-config /var/folders/zd/bqd54lkx6_zgbwl9l72z8dzr0000gn/T/MERGED-840651034/v1.ConfigMap.default.demo-config
--- /var/folders/zd/bqd54lkx6_zgbwl9l72z8dzr0000gn/T/LIVE-445248743/v1.ConfigMap.default.demo-config	2021-08-16 05:06:20.000000000 +0300
+++ /var/folders/zd/bqd54lkx6_zgbwl9l72z8dzr0000gn/T/MERGED-840651034/v1.ConfigMap.default.demo-config	2021-08-16 05:06:20.000000000 +0300
@@ -1,6 +1,6 @@
 apiVersion: v1
 data:
-  greeting: Salut # это в кластере
+  greeting: Salut-edited # а это в файле
 kind: ConfigMap
 metadata:
   annotations:
No Comments
Back to top