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?
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.
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 :