web-dev-qa-db-fra.com

Comment créer un nouvel espace de noms dans Kubernetes

Je travaille dans une application pour nœud à locataires multiples. Je sais que pour créer un nouvel espace-noms dans Kubernetes, il est possible d'exécuter une commande kubectl comme suit: kubectl create namespace <namespace name>

Comment créer un nouvel espace de noms à partir du noeud Microservices lorsqu'un nouveau client s'inscrit pour un nouveau compte?

Existe-t-il une API kubectl permettant d'effectuer une demande depuis une application externe?

Est-il nécessaire pour l'utilisateur de se déconnecter de l'application, de détruire les pods créés dans les kubernetes?

17
mleaf

Cela pourrait être aussi simple que d'appeler depuis un shell dans votre application:

kubectl create namespace <your-namespace-name>

Kubectl parle essentiellement au kube-apiserver.

Vous pouvez également appeler directement le kube-apiserver. Ceci est un exemple pour lister les pods:

$ curl -k -H 'Authorization: Bearer <token>' \
              https://$KUBERNETES_SERVICE_Host:6443/api/<api-version>/namespaces/default/pods

Plus spécifiquement pour créer un espace de noms:

$ 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"
    }
}'

Au cas où vous vous interrogeriez sur le <token>, c’est un Kubernetes Secret appartenant typiquement à un ServiceAccount et lié à un ClusterRole qui vous permet de créer des espaces de noms.

Vous pouvez créer un compte de service comme ceci:

$ kubectl create serviceaccount namespace-creator

Ensuite, vous verrez le jeton comme ceci (un jeton est généré automatiquement):

$ 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>

Ensuite, vous obtiendrez le secret:

$ 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

Votre ClusterRole devrait ressembler à ceci:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: namespace-creator
rules:
- apiGroups: ["*"]
  resources: ["namespaces"]
  verbs: ["create"]

Ensuite, vous le lieriez comme ceci:

$ kubectl create clusterrolebinding namespace-creator-binding --clusterrole=namespace-creator --serviceaccount=namespace-creator

Quand il s'agit d'écrire du code, vous pouvez utiliser n'importe quelle bibliothèque client HTTP dans n'importe quelle langue pour appeler les mêmes points de terminaison.

Il existe également des bibliothèques telles que la bibliothèque client-go qui s’occupe de la connexion à un kube-apiserver.

21
Rico

Dépend de la langue dans laquelle votre Microservice est implémenté, vous pouvez simplement utiliser le Client library dans ce microservice ou écrivez un nouveau microservice dans la langue de votre choix et, comme indiqué ci-dessus, utilisez un service account avec ClusterRoleBinding pouvant créer des espaces de noms. et vous êtes prêt à partir.

Bibliothèques clientes ici :

  • Python
  • Aller
  • Java
  • Javascript
1
Ijaz Ahmad Khan