Skip to main content

Создаем пользователей в кубе

Предположим мы создали куб (on-premise или в облаке) и нам выдали админский кубконфиг, где авторизация происходит по сертификатам, например:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQWVpZ0F3SUJBZ0lVTVhZMjhWMEJaQld2Ry9hQnNZdDJ5OVprRmVRd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0dERVdNQlFHQTFVRUF4TU5hM1ZpWlhKdVpYUmxjeTFqWVRBZUZ3MHlOakEwTURrd056TTBNREJhRncwegpOakEwTURZd056TTBNREJhTUJneEZqQVVCZ05WQkFNVERXdDFZbVZ5Ym1WMFpYTXRZMkV3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURYOE9CZW9wN1VyektEbnpjQzRUNFNjZWVKZndGVFkvZWsKNXZQQjhIWlFWUWhzRzg5dlMrZEdJdkRZK2ZmMjd0YjZCVUs3ajdGd1Jta3ROSFpNSnNuUEVuSEZvdWp6YlkxSQo2SUhQVEY2TXE2VVJnU0NGSWtEVWRrd3JTZ0xQSFlKK3Bic0hNSFF2bW81ZFRQV1dCVzlVeVpxSnFzeW80WjBvCjVaS0VHc01reUFkVFE1b1J4d2Z3MkMwb1YyZ2N2dWxSdWI1aUtCVXBYRTM4ZGkrcEZ6WkNCaEp3NUQ2UU90cXgKUjlydHZtelRmRmJETlo3WkdEZlM4cFN4RTBwUThQZEF5M2pjQVpacGpueGZvYldueTdYRGVHOFJkQktzMTJMWApFK3RuSE9HRVB3ck5hb1Q1MTg4R3R3a095dGxvTEgyanlwUTJtT05FMTJxZlMrVzRnR2hsQWdNQkFBR2pRakJBCk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRVGlNbkYKWDhkUWhQYWdzZ2VXRWJNYXpnRDdrVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBYTVjOWl1YUdGNndiUGcwdApBZlRFRXUrbEZXMXlvRU4zWlU4T0lHdjIzMWh3ekRDVVdmYXlNOTkrcS9hbnlUbU5YMWZ4eExtMGNDMk9lRkJXCnM2bWc2STF1SFJrOTdJRU1FNGZkNFlhNVVoOGR0NTh0Vld3T3JSS1hoUFFkZWNTVGVISnM2MzBtcktsa1k2aTcKZTZFMHk0UU80cjBRVzN1N1hTMDNZSEpZc0duVCtmYVdSSTBmcEoyWWQ4OTA4SS9FbzBmMDR6bjlmYjZOVE5wMApwOHJUeDNpallhek1GNk1seHI1OFJoRmcxa1k5dWZEM1NsdkN5Q1F4Q2hDMUZKelBQaVNMcTZFNkt2VFloTHVzCkNTbW54WnRtMkh6Z25BWGE5aVRsN3krNDNQZDM3bEZ2VTJIQnRMczY0YjIrLzNlbjlKL2wwWitwVUJkVzhxenMKNXdVb0xnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://10.13.37.199:6443
  name: local
contexts:
- context:
    cluster: local
    user: user
  name: Default
current-context: Default
kind: Config
users:
- name: user
  user:
    client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURXVENDQWtHZ0F3SUJBZ0lVVnlkV283dkZQOHd2N1kwWXJmVGwrY2tBeEdrd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0dERVdNQlFHQTFVRUF4TU5hM1ZpWlhKdVpYUmxjeTFqWVRBZUZ3MHlOakEwTURrd056TTBNREJhRncweQpOekEwTURrd056TTBNREJhTURReEZ6QVZCZ05WQkFvVERuTjVjM1JsYlRwdFlYTjBaWEp6TVJrd0Z3WURWUVFECkV4QnJkV0psY201bGRHVnpMV0ZrYldsdU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0MKQVFFQXg1MmtpTHJtd1RHcG5YTXd5NStldnR0MzFtMzRBTEhtVGkyOE1xcjN5YTVRWUpEK1hYWEwrSzlZMForNQpXSjhESlhUSzJaendvenJIZFZjUXZpNm9iSDNFUUdhdGtSQXdiVkFvek90OGl1bzYzdUNaaU9GRHhRdWpBZ3l6Cm1uOW1tcTNobi9STHVEWVE1LzlyWFhYZGduYml4SmF4ZXNoQ2U2ZUptSS8rYkNYaDVyWGtxRXlpUFVtck5zcmgKZ2xiL1JpOG5FMERRaDRsZG9jOHpjNEtJVnFHT1JJQmhtWXMzMmRuWnduSStHYTlWbTRMQXRXdmlPd0RhMk9zZQpqSXBMT1FhSStUNklHUGh5blpTU1pUVjFYamZ1ZHlIRWxQSUVENFlMeWIrRnY2bjQ5WGN4NDA2UU9veFB6ek9zCkNGc0pxOENvM0s5eUlINnJkcVJtYmpSYVh3SURBUUFCbzM4d2ZUQU9CZ05WSFE4QkFmOEVCQU1DQmFBd0hRWUQKVlIwbEJCWXdGQVlJS3dZQkJRVUhBd0VHQ0NzR0FRVUZCd01DTUF3R0ExVWRFd0VCL3dRQ01BQXdIUVlEVlIwTwpCQllFRk12NnRlejMzalFDTS85UkM3YkMrRGtNNm5JeU1COEdBMVVkSXdRWU1CYUFGQk9JeWNWZngxQ0U5cUN5CkI1WVJzeHJPQVB1Uk1BMEdDU3FHU0liM0RRRUJDd1VBQTRJQkFRQ1UwRnNueVpPcG5OZFY1TEtsRTRFOC8rTXMKdlR6S1FJUkk1RUZMZ0JicXBhUzJmYTlNL3pDUElua1U2Yk53RTZTWE80YmtORmkyWjRzSSt2aDJHS1VKWWNlNwpROFk4YmNxTVoxSWI5Smo1TXNkekJCOFV5YmZ1d2hCNFB6WWc5c3l3MHNBWCtWL3NrUEt6YlBUNFY1WUdnRFhiCm9ra2orOWo3U05IMHNiTkdwTjJGV2dCRisvNlNZaFJEclpZdlZVWmsybzJNUk9zRXFhcUlhejNWQ25WUWYzMzkKRVVtV1dDdFg2VER6ejFEVm44M0lYQ2ErcWlVb3dEYVpGNTMwbFRPSHVNb0NHWGdtcnQ3ZnFpR3FzNFFOT2RVbgpWOUhaSURFQ0xsNXJvRVoxdDA1Smw2aWdrVkt3dUdzZkRtaTNOV0xRL05od1lSSkNSVDUrbEN6UDNweUQKLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb3dJQkFBS0NBUUVBeDUya2lMcm13VEdwblhNd3k1K2V2dHQzMW0zNEFMSG1UaTI4TXFyM3lhNVFZSkQrClhYWEwrSzlZMForNVdKOERKWFRLMlp6d296ckhkVmNRdmk2b2JIM0VRR2F0a1JBd2JWQW96T3Q4aXVvNjN1Q1oKaU9GRHhRdWpBZ3l6bW45bW1xM2huL1JMdURZUTUvOXJYWFhkZ25iaXhKYXhlc2hDZTZlSm1JLytiQ1hoNXJYawpxRXlpUFVtck5zcmhnbGIvUmk4bkUwRFFoNGxkb2M4emM0S0lWcUdPUklCaG1ZczMyZG5ad25JK0dhOVZtNExBCnRXdmlPd0RhMk9zZWpJcExPUWFJK1Q2SUdQaHluWlNTWlRWMVhqZnVkeUhFbFBJRUQ0WUx5YitGdjZuNDlYY3gKNDA2UU9veFB6ek9zQ0ZzSnE4Q28zSzl5SUg2cmRxUm1ialJhWHdJREFRQUJBb0lCQUFXQmgvWC9pUGxNb2VKZwpCWVlKN2NxR2c4K1pDKzE3WVNBdXVDc2JuU2NZNGVRV1pWd295dkUzWjEyczIzMElaUUZTbGVNQldiTVNIa200Ci9TeTg5dTI3S2ZLN20ra0FoMm82NFlCc3RHdzdUU1NhZDVHeEZjYkNVNE1HM0hhVC90YzZBQUcxKzZSTU8rRlkKdTFxQ0dlQ05FeVFDQ1VsbjBiR2pxN0tqc2lYMjN3Zld2RkJRZzBLSlR1TnEycVhqYU5YQ2RyU2NqNStLYVBORwpzVGhCU2JVYjVvMDVrcXRsd3A5U1NoenZzeHBVWFBoTmNCYjVQRlZmSG12L3F3NzB5L0cwQmhoUGVxV050RmJVCkYzL1k5aEJrMVhtZ1NNVmNIVFUrT3ZWQXNjVm1OVnBvVVhHQ2VHNEE0MWRCK1lWb24zZnE5Vkp1RzFuR0MwU3gKbDhUdXZmRUNnWUVBMGRzMlZwWmtFUHVrR05RdUNVSjBocGVQV0RsOThSN3lNY1hvNVJoRS9NWGhvR3lGUFFPMQphUkxpeS90MFVJNFFkUjVYSWQ4RTgyQ0lYQ0x5azN0RUN3bHVBUzhQc2lJVHg4bHRjbERER25ZTlBVWEZzK2kwClQ5SmFOMFNpL2o0Q2lkTjUrYm1VNnA0Q3h1bXNvZzEzTG5zTUhVUi8rM1pPaXBoazEzaFQxaEVDZ1lFQTg0SCsKVmpIM2VCV1E2NjlWbmRkSFU4dWdvbUwyeFNxekRvOTkxaE1ydFBJNUlVWndOODZNWUhYcWtwRS9KcUI0cXp0YwpNaXh4MG9QU2hYM2taYlNpcENjbzl4d09HYU5uTWprNFY0Z0M0eDYwRzJIcFY1THNFUmEzaU50UjhaUDdhMTBQCnVMQ3JaUTFmNit3bkowd0hzRHR6UFlYaWJVcmxJdlZ2dHBoaytXOENnWUVBbWFXRkdFcE9BMzBxZlI5RWdYVU4KZWNtWG93R2M2eUE4TlNMd3pHTkRoMHFlVW1XQis5VXVTanNRb0VaL3Q4YjcxN1FhR1d0KzVXNGxDRWh5RUhicwpyNlA4elpNV1M5YlZZcTVnbXBUMDgvZkE0NzZrN0g4UkhXd21yMVpxZS9rTXhMcDRFTlhHYVN5OVhjT1NxS2R4ClBpL0xBOWEyV1hjYU5ERTFpK2pHZ1BFQ2dZQk8vRm1OaUFPbmxnYytDOCtQdFdiVGpYZDdkUEpxbmlFYWxmelIKVmNLVm5RUmZBTVFodGdQZXZpRHFqZWFZRnZGTlNhSHNQSEpuUUk4bThlRUdCSVBGRDFiQVlQOUozYkQ1bjRuaApDcU0xSEo1N1MxVXZMTjhaNCs2QW0vT0drdU80dmFUOTJZQ2U5S21xa3gxWUo5ZE9tTm9XbUxrTGpvR294MGdIClNJTm9UUUtCZ0Q3SWV3MnBJeTFzRGg4bUxUbGJQS294ejhCWnZNK2RhMmpOVjN5enp1ZHRSbkNXL0o3MWl4MVIKZU1TbFpXcGRZR09NYWltUU1OMnp2QjdGUCtPNnpxaE16SldIL0Y2dm92c2lpWExsQmJpcmNTUnBYYVZyOERZdAo2di9XRHFMRlh1b0tmKyttM1FkZzhlaTY0MmZsWGJ0aVBoWVRwdlhLSTl6dU5hdXFLV0lnCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg==

Мы радостно начинаем раздавать этот кубконфиг всем сотрудником нашей дружной организации и всем хорошо. Но всем хорошо до того момента как кто-то уволится и заберет с собой этот кубконфиг.

Возникает вопрос - как отозвать у уволившегося сотрудника данный сертификат. Сейчас уже никак, потому что клиентский сертификат выпускается от корневого сертификата кластера и действует 1 год (обычно), а kubernetes не имеет встроенных механизмов отзыва сертификатов. 

Поэтому если с кубом работает больше одного человека - лучше заранее научиться управлять пользователями в кубе.

Нарезаем пользователей

В кубе есть несколько механизмов (тык) для авторизации. То что мы видели выше - "X.509 client certificates", о его минусах я писал выше. Из того что (как мне кажется) больше всего подойдет для живых пользователей: "Service account tokens" и "OpenID Connect Tokens". По второму можно найти инструкции в интернете, а по SA Tokens инфы довольно мало, о нем и пойдет речь.

Авторизация по SA токенам удобна тем что не требуется внешний OpenID сервер и аккаунт вместе с токен(ами) можно отозвать в одну команду.

За основу возьмем конфиг выше. Нам надо будет создать SA в кубе, повесить на него ClusterRoleBinding (можно более точечно выдать роли, но ради упрощения выдадим "cluster-admin"), сгенерировать токен и сформировать кубконфиг.

Создаем пользователя, выдаем ему доступы, генерируем временный токен:

# Создаем аккаунт (можно указать неймспейс)
[root@k8s-istio ~]# kubectl create serviceaccount ivan
serviceaccount/ivan created
# Вешаем clusterrole на Ивана
[root@k8s-istio ~]# kubectl create clusterrolebinding ivan-access-full-cluster --clusterrole=cluster-admin --serviceaccount=default:ivan
clusterrolebinding.rbac.authorization.k8s.io/ivan-access-full-cluster created
# Генерируем токен, например на 720 часов
[root@k8s-istio ~]# TOKEN=$(kubectl create token ivan --duration=720h)
[root@k8s-istio ~]# echo $TOKEN 
eyJhbGciOiJSUzI1NiIsImtpZCI6IkdkNmc0RU5lb0ZiT254dWxSQS1yU3B4NGhLMlZIWGVCc3MzYWxMdjRmWHcifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIiwic3lzdGVtOmtvbm5lY3Rpdml0eS1zZXJ2ZXIiXSwiZXhwIjoxNzc4MzE1NTI0LCJpYXQiOjE3NzU3MjM1MjQsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2YyIsImp0aSI6IjY2OWM0YmJkLTU4NDUtNDBjYy04ZDEyLTdhYWY0ZTY2Y2U1MiIsImt1YmVybmV0ZXMuaW8iOnsibmFtZXNwYWNlIjoiZGVmYXVsdCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJpdmFuIiwidWlkIjoiNGVjOWE1YTUtMjE0MS00M2IzLWE4YjgtYjNmOWE4NzQ3YmJhIn19LCJuYmYiOjE3NzU3MjM1MjQsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0Oml2YW4ifQ.VM9stmAYwvZg-6KDOFd_rD9lqf4RHSh9U-iahsncKEfUHZzwBYpE3tJ3ZxZvJ3G0STln1BKaioeLKn_MiSIY4ttn8zvlK_wQs-fslOsAAw5mnRYDrD7f-9H1c4P_RQo8dRULmYiCHIlq3OqqPpJtIUT1qiPEyIotThGxufQ5MEdmKDUExN9HIeaQbZbOX-lj1kKqETyuhQGrTjVqCs2G7gPSB3vPbgIAB71PxnvChwsK5M3Ijd1VarKN3rq87g-Qpo-xXLyvNfXyr4_RjUw9_4HokC7HhlOUI_NXYYN0lVzoKJeYVz8CJeIqGAv5CLmlnhvask5rbTGwau7VZStLpw

Выпускать токен без срока годности можно через создание секрета - так можно будет точечно его отозвать:

apiVersion: v1
kind: Secret
metadata:
  name: ivan-token
  namespace: default
  annotations:
    kubernetes.io/service-account.name: "ivan"
type: kubernetes.io/service-account-token
# Создаем секрет - токен будет создан кубернетисом автоматически
[root@k8s-istio ~]# kubectl apply -f secrey.yaml
secret/ivan-token created

# Получаем токен (может появиться не сразу)
[root@k8s-istio ~]# kubectl get secret ivan-token -o jsonpath={.data.token} | base64 -d
eyJhbGciOiJSUzI1NiIsImtpZCI6IkdkNmc0RU5lb0ZiT254dWxSQS1yU3B4NGhLMlZIWGVCc3MzYWxMdjRmWHcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZWNyZXQubmFtZSI6Iml2YW4tdG9rZW4iLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiaXZhbiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjJiNWNlOWUxLWY0ZWYtNDVkZS1hMmZmLTNjNjRlNDdjZDNmZiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0Oml2YW4ifQ.NE-kMaUoGK-2zvzk1bGUF52kwohavmGOHw3SCfG7Leh52mbfB8HmeJkCMcZKO28DREvh9GiYrdoa0C4gtzHF14vsBmdsL7jVmh67at0YJy0zBeiS9ioc85_faaQkwth7LoxVAhBJqdsXc6Zj593-oezG89wBujW6Ty4YT0iOyKiSu1jUrvkCPGNc012Rzd5pjUCna1HNy7cZcrD-5dT28xBJttELFsz9xGKPY9xW5FaI2r2K9S_FpdNCXoqfzCoVRUED9If8yKKoerKYNrAsaE25gtTjnRJBhKaX4aOXdGKm3yX6fC32d7nKDEjyiXsmCQ8L4U21iYSqYnxMBZnhNg

Теперь необходимо сформировать с этим токеном кубконфиг:

# Удаляем стандартного юзера
[root@k8s-istio ~]# kubectl config delete-user user
deleted user user from ivan.kubeconfig
# Удаляем стандартный контекст
[root@k8s-istio ~]# kubectl config delete-context Default
warning: this removed your active context, use "kubectl config use-context" to select a different one
deleted context Default from ivan.kubeconfig
# Прописываем в конфиге пользователя и его токен
[root@k8s-istio ~]# kubectl config set-credentials ivan --token=$TOKEN
User "ivan" set.
# Создаем контекст и переключаемся на него
[root@k8s-istio ~]# kubectl config set-context Default --cluster=local --user=ivan
Context "Default" created.

[root@k8s-istio ~]# kubectl config use-context Default
Switched to context "Default".

# Проверяем
[root@k8s-istio ~]# kubectl get no
NAME        STATUS   ROLES           AGE   VERSION
k8s-istio   Ready    control-plane   55m   v1.34.6+k0s

Все работает!

Если Иван уволится, мы можем в одну команду отозвать его кубконфиг:

# Все работает
[root@k8s-istio ~]# kubectl get no
NAME        STATUS   ROLES           AGE   VERSION
k8s-istio   Ready    control-plane   59m   v1.34.6+k0s

# Удаляем Ивана
[root@k8s-istio ~]# kubectl delete serviceaccount ivan
serviceaccount "ivan" deleted from default namespace

# Токены кешируются - отзыв происходит в течении минуты, но не сразу
[root@k8s-istio ~]# kubectl get no
NAME        STATUS   ROLES           AGE   VERSION
k8s-istio   Ready    control-plane   59m   v1.34.6+k0s

[root@k8s-istio ~]# kubectl get no
NAME        STATUS   ROLES           AGE   VERSION
k8s-istio   Ready    control-plane   59m   v1.34.6+k0s

[root@k8s-istio ~]# kubectl get no
error: You must be logged in to the server (Unauthorized)

Для понимания, вот так вот будет выглядеть кубконфиг с авторизацией по токену:

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURBRENDQWVpZ0F3SUJBZ0lVTVhZMjhWMEJaQld2Ry9hQnNZdDJ5OVprRmVRd0RRWUpLb1pJaHZjTkFRRUwKQlFBd0dERVdNQlFHQTFVRUF4TU5hM1ZpWlhKdVpYUmxjeTFqWVRBZUZ3MHlOakEwTURrd056TTBNREJhRncwegpOakEwTURZd056TTBNREJhTUJneEZqQVVCZ05WQkFNVERXdDFZbVZ5Ym1WMFpYTXRZMkV3Z2dFaU1BMEdDU3FHClNJYjNEUUVCQVFVQUE0SUJEd0F3Z2dFS0FvSUJBUURYOE9CZW9wN1VyektEbnpjQzRUNFNjZWVKZndGVFkvZWsKNXZQQjhIWlFWUWhzRzg5dlMrZEdJdkRZK2ZmMjd0YjZCVUs3ajdGd1Jta3ROSFpNSnNuUEVuSEZvdWp6YlkxSQo2SUhQVEY2TXE2VVJnU0NGSWtEVWRrd3JTZ0xQSFlKK3Bic0hNSFF2bW81ZFRQV1dCVzlVeVpxSnFzeW80WjBvCjVaS0VHc01reUFkVFE1b1J4d2Z3MkMwb1YyZ2N2dWxSdWI1aUtCVXBYRTM4ZGkrcEZ6WkNCaEp3NUQ2UU90cXgKUjlydHZtelRmRmJETlo3WkdEZlM4cFN4RTBwUThQZEF5M2pjQVpacGpueGZvYldueTdYRGVHOFJkQktzMTJMWApFK3RuSE9HRVB3ck5hb1Q1MTg4R3R3a095dGxvTEgyanlwUTJtT05FMTJxZlMrVzRnR2hsQWdNQkFBR2pRakJBCk1BNEdBMVVkRHdFQi93UUVBd0lCQmpBUEJnTlZIUk1CQWY4RUJUQURBUUgvTUIwR0ExVWREZ1FXQkJRVGlNbkYKWDhkUWhQYWdzZ2VXRWJNYXpnRDdrVEFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBYTVjOWl1YUdGNndiUGcwdApBZlRFRXUrbEZXMXlvRU4zWlU4T0lHdjIzMWh3ekRDVVdmYXlNOTkrcS9hbnlUbU5YMWZ4eExtMGNDMk9lRkJXCnM2bWc2STF1SFJrOTdJRU1FNGZkNFlhNVVoOGR0NTh0Vld3T3JSS1hoUFFkZWNTVGVISnM2MzBtcktsa1k2aTcKZTZFMHk0UU80cjBRVzN1N1hTMDNZSEpZc0duVCtmYVdSSTBmcEoyWWQ4OTA4SS9FbzBmMDR6bjlmYjZOVE5wMApwOHJUeDNpallhek1GNk1seHI1OFJoRmcxa1k5dWZEM1NsdkN5Q1F4Q2hDMUZKelBQaVNMcTZFNkt2VFloTHVzCkNTbW54WnRtMkh6Z25BWGE5aVRsN3krNDNQZDM3bEZ2VTJIQnRMczY0YjIrLzNlbjlKL2wwWitwVUJkVzhxenMKNXdVb0xnPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo=
    server: https://10.13.37.199:6443
  name: local
contexts:
- context:
    cluster: local
    user: ivan
  name: Default
current-context: Default
kind: Config
users:
- name: ivan
  user:
    token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkdkNmc0RU5lb0ZiT254dWxSQS1yU3B4NGhLMlZIWGVCc3MzYWxMdjRmWHcifQ.eyJhdWQiOlsiaHR0cHM6Ly9rdWJlcm5ldGVzLmRlZmF1bHQuc3ZjIiwic3lzdGVtOmtvbm5lY3Rpdml0eS1zZXJ2ZXIiXSwiZXhwIjoxNzc4MzE1NTI0LCJpYXQiOjE3NzU3MjM1MjQsImlzcyI6Imh0dHBzOi8va3ViZXJuZXRlcy5kZWZhdWx0LnN2YyIsImp0aSI6IjY2OWM0YmJkLTU4NDUtNDBjYy04ZDEyLTdhYWY0ZTY2Y2U1MiIsImt1YmVybmV0ZXMuaW8iOnsibmFtZXNwYWNlIjoiZGVmYXVsdCIsInNlcnZpY2VhY2NvdW50Ijp7Im5hbWUiOiJpdmFuIiwidWlkIjoiNGVjOWE1YTUtMjE0MS00M2IzLWE4YjgtYjNmOWE4NzQ3YmJhIn19LCJuYmYiOjE3NzU3MjM1MjQsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0Oml2YW4ifQ.VM9stmAYwvZg-6KDOFd_rD9lqf4RHSh9U-iahsncKEfUHZzwBYpE3tJ3ZxZvJ3G0STln1BKaioeLKn_MiSIY4ttn8zvlK_wQs-fslOsAAw5mnRYDrD7f-9H1c4P_RQo8dRULmYiCHIlq3OqqPpJtIUT1qiPEyIotThGxufQ5MEdmKDUExN9HIeaQbZbOX-lj1kKqETyuhQGrTjVqCs2G7gPSB3vPbgIAB71PxnvChwsK5M3Ijd1VarKN3rq87g-Qpo-xXLyvNfXyr4_RjUw9_4HokC7HhlOUI_NXYYN0lVzoKJeYVz8CJeIqGAv5CLmlnhvask5rbTGwau7VZStLpw