首页 > 解决方案 > 我如何在 Kubernetes 中创建新的命名空间

问题描述

我在一个多租户节点应用程序中工作,我知道在 Kubernetes 中创建一个新的命名空间可以运行 kubectl 命令,如下所示: kubectl create namespace <namespace name>

当新客户注册新帐户时,如何从节点微服务创建新的命名空间?

是否有一些 kubectl API 可以从外部应用程序发出请求?

用户是否需要从应用程序中注销,销毁在 kubernetes 中创建的 pod?

标签: kubernetes

解决方案


它可以像从应用程序中的 shell 调用一样简单:

kubectl create namespace <your-namespace-name>

本质上,kubectl 与 kube-apiserver 对话。

也可以直接调用 kube-apiserver。这是列出 pod 的示例:

$ 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 Secret ,通常属于 ServiceAccount 并绑定到ClusterRole允许您创建命名空间的 a。

您可以像这样创建服务帐户:

$ 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 客户端库来调用相同的端点。

还有一些库,例如client-go库,负责连接到 kube-apiserver 的管道。


推荐阅读