Как создать пользователей в Kubernetes

Пользователи не существуют в Kubernetes. В зависимости от вашего опыта и того, на чем этот опыт сосредоточен, это утверждение может быть немного непонятным. Возможно, вы разработчик, создающий приложение, развернутое в Kubernetes. Вам был предоставлен файл kubeconfig, который позволяет вам «войти» в платформу. Но на самом деле этот файл не подключается к «пользователю». Вместо этого он представляет собой набор разрешений в виде роли, которые были применены к контексту. А этот контекст определяется набором сертификатов. Все это вместе взятое и есть то, что мы могли бы назвать пользователем, но на самом деле этот термин нигде в платформе не известен.

Как же создать этот набор сертификатов, чтобы создать пользователя? На самом деле, это не так сложно, но это длинный ряд шагов, которые необходимо выполнить, и сейчас мы их рассмотрим.

Примечание: Этот блог основан на видео, которое мы выпустили о создании пользователей в Kubernetes. Вы можете найти видео здесь:

Создание ключа пользователя

Первым шагом является создание исходного ключа, который представляет нашего пользователя. Этот ключ создается с помощью такого инструмента, как openssl, но еще одним популярным инструментом является cfssl, созданный Cloudflare. Некоторые считают, что cfssl проще в использовании, и это определенно выглядит проще в сценарии. Но для данного примера мы будем использовать openssl. Вы также можете выбрать для создания ключа несколько различных алгоритмов. Для этого примера мы будем использовать ED25519.

Предположим, что мы хотим вывести ключ в myuserkey.key:

openssl genpkey -out myuserkey.key -algorithm ed25519
Войти в полноэкранный режим Выйти из полноэкранного режима

В случае если вы хотите использовать RSA 4096 вместо ED25519:

openssl genrsa -out myuserkey.key -length 2048
Войдите в полноэкранный режим Выход из полноэкранного режима

Этот ключ сам по себе не имеет никакого значения для Kubernetes. Сначала нам нужно подписать его.

Создайте запрос на подписание сертификата

Для того чтобы подписать его, нам нужно создать запрос на подписание сертификата, а затем отправить этот запрос в Kubernetes. Чтобы создать такой запрос, выполните следующие действия:

openssl req -new -key myuserkey.key -out myuserkey.csr -subj "/CN=myuser/O=edit"
Войти в полноэкранный режим Выйти из полноэкранного режима

Давайте рассмотрим эту команду подробнее. Во-первых, есть req. Команда req создает и обрабатывает запросы на сертификат. -key позволяет нам указать ключ, созданный с помощью команды genpkey. -out задает выходной csr. Наконец, есть -subj. Сюда можно вписать многое, но Kubernetes нужны только общее имя и организация, которая используется для определения групп. Если вы не включите опцию -subj, вам будет предложено указать ряд других опций, например OU.

Отправьте CSR в Kubernetes

Итак, CSR создан. Теперь нам нужно отправить его в Kubernetes. Как и везде в Kubernetes, нам нужно создать YAML-файл.

cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: myuser
spec:
  request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlHaE1GVUNBUUF3SWpFUk1BOEdBMVVFQXd3SWRHVnpkSFZ6WlhJeERUQUxCZ05WQkFvTUJHVmthWFF3S2pBRgpCZ01yWlhBRElRRG9hVURHVHdYRXYyRjVBTk9yQW9QV0ZvWGhSbTlGQjFQSkpuVUFaWlJGZ0tBQU1BVUdBeXRsCmNBTkJBUGZUMldaVGU3R1VJcGVHZnhTbC93WFFTZGZPQmRoeFg5Q05CMEZpOEdteDhIaDcvd2hkVEgwUXRxWmEKWGthZ0h6ejVUbXRKWnNKZDQ4QlpCb3BLdFEwPQotLS0tLUVORCBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0K
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400  # one day
  usages:
  - client auth
EOF
Вход в полноэкранный режим Выход из полноэкранного режима

А теперь объяснение этой команды. Команда cat <<EOF ... EOF — это хороший простой способ выполнения многострочной команды. Надеюсь, apiVersion и kind имеют смысл. Мы указываем имя CSR в метаданных. Имя может быть любым, но лучше, чтобы оно было последовательным. Самая большая часть этой команды находится под spec.request. Его содержимое — это просто вывод файла csr после его base64-кодирования.

Если вы просто запустите cat myuser.csr | base64, вы получите csr с кучей добавленных новых строк. Итак, команда, которая вам нужна, следующая:

cat myuser.csr | base64 | tr -d "n"
Войти в полноэкранный режим Выйти из полноэкранного режима

И затем вставьте вывод этой команды в spec.request выше. spec.expirationSeconds — это следующее решение, которое вам нужно принять. Оно определяет, как долго будет действовать подписанный сертификат до истечения срока его действия. Вы хотите, чтобы это был относительно короткий промежуток времени, но не слишком короткий. Что значит слишком короткий? Вам придется распространять уникальный сертификат в виде файла kubeconfig среди всех ваших пользователей. Если у вас есть механизм распространения этого файла, чтобы он автоматически обновлялся, то идеальным вариантом будет сохранение этого значения на уровне минут. Но часто можно встретить значения в несколько месяцев или лет.

Получение одобренного сертификата из кластера

Теперь, когда CSR отправлен на кластер, нам нужно утвердить запрос.

kubectl certificate approve myuser
Войдите в полноэкранный режим Выйти из полноэкранного режима

Эта команда была легкой. Но чтобы использовать новый сертификат, нам нужно загрузить его и поместить в файл kubeconfig. Ресурс в Kubernetes для запросов на подписание сертификатов — csr. Так что вы, вероятно, сможете понять, какую команду использовать для этого:

kubectl get csr/myuser -o yaml
Войти в полноэкранный режим Выйти из полноэкранного режима

Конечно, это даст нам csr, а также все метаданные о запросе. Нам нужен только сертификат, но он хранится в кодировке base64. Чтобы получить его, мы можем выполнить следующую команду:

kubectl get csr myuser -o jsonpath='{.status.certificate}'| base64 -d > myuser.crt
Войти в полноэкранный режим Выйти из полноэкранного режима

Это было много шагов, чтобы добраться до файла сертификата. Если вы поищете информацию об этом процессе, вы найдете множество руководств, в которых говорится о том, что нужно просто загрузить сертификат и ключ для центра сертификации в кластере. Проблема такого подхода заключается в том, что использование управляемых Kubernetes является очень распространенным сценарием. И в большинстве случаев при использовании управляемых Kubernetes у вас нет доступа к панели управления, и поэтому вы не можете передать эти два файла на свою машину. Но использование кластера для утверждения сертификата будет работать независимо от того, используете ли вы управляемый или неуправляемый Kubernetes.

Создание файла Kubeconfig

Есть три команды, которые вы можете использовать для создания файла kubeconfig. Одна из них используется для установки пользователя, другая — для установки контекста, а третья — для установки кластера. К сожалению, чтобы установить кластер, вам нужен сертификат CA, но помните, что у нас нет доступа к нему, поскольку мы, вероятно, используем управляемый кластер. Но мы только что выполнили кучу команд на кластере, чтобы сгенерировать подписанный сертификат. Итак, у нас есть файл kubeconfig для администратора кластера, и мы можем использовать его.

Сделайте копию вашего файла kubeconfig и удалите все, кроме одного кластера, для которого мы создали пользователя. В итоге у вас получится что-то вроде этого:

apiVersion: v1
clusters:
  - cluster:
      certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURKekNDQWcrZ0F3SUJBZ0lDQm5Vd0RRWUpLb1pJaHZjTkFRRUxCUUF3TXpFVk1CTUdBMVVFQ2hNYourKeyWillBeALotLongerThanThisx2SW4rQTk3cGZWUDBGTGdUOVlteitpdzAwOHFXY1ZKdz09Ci0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0K
      server: https://af03b3bogus39-483c-b55f-4cserverurle60c.k8s.ondigitalocean.com
    name: k8s
Вход в полноэкранный режим Выход из полноэкранного режима

Эта часть будет одинаковой независимо от того, какая у вас роль.

Теперь добавим пользователя.

kubectl --kubeconfig myuserconfig config set-credentials myuser --client-key=testuserkey.key --client-certificate=testuserkey.crt --embed-certs=true
Войти в полноэкранный режим Выйти из полноэкранного режима

В --kubeconfig myuserconfig указывается, в каком файле kubeconfig вы хотите задать учетные данные. config говорит, что мы создаем файл kubeconfig. set-credentials myuser означает, что мы устанавливаем учетные данные в файле mention для субъекта, известного как myuser. client-key и client-certificate устанавливают соответствующие файлы. Если это все, что вы набрали, вы получите файл, который просто ссылается на каждый из файлов. Поэтому, если вы хотите поделиться файлом kubeconfig с другим человеком, вам нужно будет также поделиться файлом сертификата и ключа. Добавление опции embed-certs=true встроит их в строку, что упростит обмен файлом.

Наконец, выполните эту команду, чтобы добавить контекст.

kubectl --kubeconfig myuserconfig config set-context myuser --cluster=k8s --user=myuser
Войти в полноэкранный режим Выйти из полноэкранного режима

set-context задает имя контекста. А cluster и user задают каждый из этих элементов. Так что же такое контекст? Это просто связь между пользователем и кластером. Когда вы используете такой инструмент, как плагин krew kubectl ctx, вы выбираете именно контекст.

Теперь вы закончили настройку нового пользователя для вашего кластера. Это не так сложно сделать, хотя есть много команд, которые нужно выполнить. И большая часть из них является шаблонной, с несколькими ключевыми элементами, обновляемыми для каждого пользователя. Вы определенно можете написать сценарий, а также использовать отличный сценарий, который Брендан Бернс создал и выложил на своем GitHub. Но даже с такими инструментами вам все равно нужно придумать способ распространения сгенерированного файла kubeconfig. И это может оказаться самой сложной частью процесса.

Делать все в Infra

Альтернативой этому является использование Infra для создания пользователей и групп, а также для распространения файлов. Просто войдите в систему, перейдите в раздел Пользователи и заполните поле для ввода адреса электронной почты пользователя. Затем перейдите к Clusters и выберите свой кластер. Теперь выберите пользователя, которого вы только что создали, из выпадающего списка и укажите роль. И все готово. На самом деле это на два шага больше, чем то, что мы делали без Infra, что потребовало бы создания еще одного файла YAML для определения роли, а затем еще одного для привязки роли к пользователю, а затем применения этих двух файлов.

И это все, что нужно сделать, чтобы создать пользователя в Kubernetes. Странно, что хотя «пользователь» не является ресурсом первого класса в самом Kubernetes, он распознается в файле kubeconfig. И странно, что создание пользователя не является одношаговой командой в kubectl. Но, к счастью, такие инструменты, как Infra, превращают сложный многошаговый процесс в нечто, что можно выполнить за несколько секунд. Если вы еще не используете Infra, попробуйте. С помощью нашего быстрого запуска вы сможете начать работу за несколько минут независимо от того, где находится ваш кластер Kubernetes.

Оцените статью
devanswers.ru
Добавить комментарий