我如何在Kubernetes中创建新的名称空间

时间:2018-10-20 00:38:47

标签: kubernetes

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

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

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

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

3 个答案:

答案 0 :(得分:15)

就像从应用程序中的shell调用一样简单:

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 Secret,通常属于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客户端库来调用相同的端点。

还有client-go库之类的库,用于处理连接到kube-apiserver的问题。

答案 1 :(得分:1)

取决于实现Microservice的语言,您可以只在该微服务中使用Client library或以您选择的语言编写新的微服务,如上面的回答,请使用{ {1}}和service account可以创建名称空间。而且您走的很好。

客户端库here

  • Python
  • 开始
  • Java
  • JavaScript

答案 2 :(得分:0)

您可以使用以下命令创建命名空间

kubectl创建名称空间<< 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命令执行中都提及名称空间,例如在创建pod,deployment或任何其他kubernetes对象时,请按如下所述设置名称空间:

kubectl config set-context --current --namespace=test

希望这对您有帮助!