Как я создаю новое пространство имен в Kubernetes

Я работаю в приложении с мультитенантным узлом, я знаю, что для создания нового пространства имен в Kubernetes можно запустить команду kubectl следующим образом: kubectl create namespace <namespace name>

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

Есть ли какой-нибудь API kubectl для запроса из внешнего приложения?

Необходимо ли пользователю выйти из приложения, уничтожить поды, созданные в кубернетах?

Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
33
0
26 326
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Это может быть так же просто, как вызов из оболочки в вашем приложении:

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.

Отличный ответ. Может быть, также упомянуть об этом и какие разрешения RBAC необходимы для его создания? ;)

Michael Hausenblas 20.10.2018 05:07

Вот и все, добавлено еще немного подробностей! :-D

Rico 20.10.2018 08:24

В зависимости от языка, на котором реализован ваш Microservice, вы можете просто использовать Client library внутри этого микросервиса или написать новый микросервис на языке по вашему выбору, и, как указано выше, используйте service account с ClusterRoleBinding, который может создавать пространства имен. и тебе хорошо идти.

Клиентские библиотеки здесь:

  • Python
  • Идти
  • Джава
  • Javascript

вы можете создать пространство имен, используя следующую команду:

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

Надеюсь, это помогло !!

Другие вопросы по теме