Я работаю в приложении с мультитенантным узлом, я знаю, что для создания нового пространства имен в Kubernetes можно запустить команду kubectl следующим образом:
kubectl create namespace <namespace name>
Как я могу создать новое пространство имен из узла Microservices, когда новый клиент регистрирует новую учетную запись?
Есть ли какой-нибудь API kubectl для запроса из внешнего приложения?
Необходимо ли пользователю выйти из приложения, уничтожить поды, созданные в кубернетах?

Это может быть так же просто, как вызов из оболочки в вашем приложении:
kubectl create namespace <your-namespace-name>
По сути, kubectl общается с kube-apiserver.
Вы также можете напрямую вызвать kube-apiserver. Это пример списка модулей:
$ curl -k -H 'Authorization: Bearer <token>' \
https://$KUBERNETES_SERVICE_HOST:6443/api/<api-version>/namespaces/default/pods
Более конкретно, чтобы создать пространство имен:
$ curl -k -H -X POST -H 'Content-Type: application/json' \
-H 'Authorization: Bearer <token>' \
https://$KUBERNETES_SERVICE_HOST:6443/api/v1/namespaces/ -d '
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"name": "mynewnamespace"
}
}'
Если вас интересует <token>, это Kubernetes Секрет, обычно принадлежащий ServiceAccount и связанный с ClusterRole, который позволяет вам создавать пространства имен.
Вы можете создать учетную запись службы следующим образом:
$ kubectl create serviceaccount namespace-creator
Затем вы увидите такой токен (токен создается автоматически):
$ kubectl describe sa namespace-creator
Name: namespace-creator
Namespace: default
Labels: <none>
Annotations: <none>
Image pull secrets: <none>
Mountable secrets: namespace-creator-token-xxxxx
Tokens: namespace-creator-token-xxxxx
Events: <none>
Тогда вы получите секрет:
$ kubectl describe secret namespace-creator-token-xxxxx
Name: namespace-creator-token-xxxx
Namespace: default
Labels: <none>
Annotations: kubernetes.io/service-account.name: namespace-creator
kubernetes.io/service-account.uid: <redacted>
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 7 bytes
token: <REDACTED> <== This is the token you need for Authorization: Bearer
Ваш ClusterRole должен выглядеть примерно так:
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: namespace-creator
rules:
- apiGroups: ["*"]
resources: ["namespaces"]
verbs: ["create"]
Затем вы должны привязать его так:
$ kubectl create clusterrolebinding namespace-creator-binding --clusterrole=namespace-creator --serviceaccount=namespace-creator
Когда дело доходит до написания кода, вы можете использовать любую клиентскую библиотеку HTTP на любом языке для вызова одних и тех же конечных точек.
Существуют также библиотеки, такие как библиотека клиент-идти, которая заботится о подключении к kube-apiserver.
Вот и все, добавлено еще немного подробностей! :-D
В зависимости от языка, на котором реализован ваш Microservice, вы можете просто использовать Client library внутри этого микросервиса или написать новый микросервис на языке по вашему выбору, и, как указано выше, используйте service account с ClusterRoleBinding, который может создавать пространства имен. и тебе хорошо идти.
Клиентские библиотеки здесь:
вы можете создать пространство имен, используя следующую команду:
kubectl create namespace << namespace_name >>.
Ниже приведены некоторые примеры.
kubectl create namespace dev
kubectl create namespace test
kubectl create namespace prod
Чтобы увидеть созданное пространство имен:
kubectl get namespace
or
kubectl get ns
or
kubectl get namespaces
Чтобы избежать упоминания пространства имен при каждом выполнении команды kubectl, например, при создании модуля, развертывания или любого другого объекта kubernetes, установите пространство имен, как указано ниже:
kubectl config set-context --current --namespace=test
Надеюсь, это помогло !!
Отличный ответ. Может быть, также упомянуть об этом и какие разрешения RBAC необходимы для его создания? ;)