kubernetes - 我如何在 Kubernetes 中创建新的命名空间
问题描述
我在一个多租户节点应用程序中工作,我知道在 Kubernetes 中创建一个新的命名空间可以运行 kubectl 命令,如下所示:
kubectl create namespace <namespace name>
当新客户注册新帐户时,如何从节点微服务创建新的命名空间?
是否有一些 kubectl API 可以从外部应用程序发出请求?
用户是否需要从应用程序中注销,销毁在 kubernetes 中创建的 pod?
解决方案
它可以像从应用程序中的 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 的管道。
推荐阅读
- cypress - 安装 cypress 版本时导航器未定义错误
- sql - 如何将oracle中的行转换为特定的列集?
- redis - grpc_message":"在 'projects/xxx/locations/xxx/instances/xxx' 上的权限 'redis.instances.get' 被拒绝
- c# - sql中的批量比较
- node.js - 未捕获的 TypeError:setPrototypeOf 不是函数
- fortran - 如何确保 do 语句中的所有代码都由一个线程在 Fortran 中使用 omp_lib 执行?
- angular - 成功构建Angular后需要将dist文件夹复制到另一个文件夹
- mysql - 我需要使用 sql 查询根据 orderId 获取最后创建的合格乘客 ID 和 ping 乘客 ID
- php - 使用 php 和 VS Code 在 mysql 中显示 مريÙ
- node.js - 如何找到特定的 _id 并从对象数组中更新它?