Как подключаться к K8S и самые популярные команды
Как подключиться
Основная утилита для работы с k8s - это kubectl
Как установить kubectl:
Очень полезно настроить автодополнение для kubectl, потому что команды у kubectl бывают длинными и сложными, а автодополнение позволит ускориться и меньше ошибаться
Чтобы kubectl мог найти и получить доступ к кластеру Kubernetes, нужен файл kubeconfig
По умолчанию конфигурация kubectl находится в ~/.kube/config
Команда kubectl cluster-info
позволит проверить корректно ли сконфигурирован kubectl (если все хорошо, то она выведет информацию о кластере, а если есть проблемы, то выведет сообщение о проблеме)
Kubeconfig'ом пользуются разные утилиты:
Для работы со всеми этими инструментами достаточно иметь корректный kubeconfig, они просто прочитают его и сразу (без дополнительных манипуляций) позволят работать
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:
- Настроить 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" }
- Обновить 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
...
И видим в браузере что все работает
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