Kubernetes多租户架构设计及租户/节点API、认证机制咨询
租户隔离Kubernetes集群方案设计
一、核心架构与隔离策略
1. 租户资源隔离
- 以Namespace作为租户的基础隔离单元,每个客户对应专属Namespace(如
customer-a-prod、customer-a-test),确保租户资源逻辑隔离。 - 用NetworkPolicy配置严格的入站/出站规则,禁止跨Namespace的Pod通信,实现网络层面的硬隔离。
- 结合ResourceQuota和LimitRange,为每个租户Namespace设置CPU、内存、存储等资源配额,防止单个租户抢占集群资源。
- 若需更强的租户隔离(如租户无法查看集群内其他租户的资源),可自定义Tenant CRD(自定义资源),通过RBAC绑定租户与Namespace的关联关系,仅允许租户访问自身所属的Namespace资源。
2. 客户节点与Pod调度隔离
- 要求客户节点加入集群时打上专属标签(如
tenant=customer-a),同时给节点添加Taint(如tenant=customer-a:NoSchedule),确保其他租户的Pod无法调度到该节点。 - 为租户的Pod配置NodeAffinity和Toleration,指定Pod仅能调度到自身租户标签的节点上,实现节点级的资源隔离。
- 允许租户在自身节点上部署多副本Pod,通过Deployment、StatefulSet等控制器管理相同容器的Pod实例,满足多节点部署需求。
二、Kubernetes相关API说明
1. 租户创建相关API
Kubernetes原生无Tenant类型API,可通过两种方式实现租户创建:
- Namespace API:直接调用
POST /api/v1/namespaces接口创建专属Namespace,作为租户的资源边界。对应kubectl命令:kubectl create namespace <customer-namespace>。 - 自定义Tenant CRD:通过
apiextensions.k8s.io/v1API创建Tenant自定义资源定义,再通过POST /apis/<group>/<version>/tenants接口创建租户实例,同时关联对应的Namespace、RBAC规则等。
2. 节点创建相关API
- Kubernetes原生提供Nodes API(
POST /api/v1/nodes),用于手动注册节点对象。但实际场景中,节点通常通过kubelet自动向apiserver注册:- 客户节点通过
kubeadm join命令加入集群时,kubelet会自动生成证书并向apiserver发起注册请求,背后调用的就是Nodes API。 - 若需手动注册,可先构造Node对象的JSON/YAML配置,再通过API提交,同时确保kubelet配置了正确的认证凭证与apiserver通信。
- 客户节点通过
三、认证机制选择与实现
1. 认证方案选型
- 证书认证:适合长期访问的用户(如租户管理员)或节点认证,安全性高,生命周期可自定义。
- 访问令牌(ServiceAccount Token):适合自动化工具、CI/CD流程等服务端访问场景,支持短期过期,便于权限回收。
2. 具体实现方式
证书认证(用户/节点)
- 用户证书:
- 生成证书签名请求(CSR),指定用户身份(如
CN=customer-a-admin)和组(如groups=tenant-admins)。 - 通过
POST /apis/certificates.k8s.io/v1/certificatesigningrequests提交CSR。 - 集群管理员通过
kubectl certificate approve <csr-name>审批请求,apiserver会签发客户端证书。 - 将证书分发给租户管理员,配置kubectl使用该证书访问集群,同时通过RBAC绑定该用户仅能访问自身Namespace的权限。
- 生成证书签名请求(CSR),指定用户身份(如
- 节点证书:
客户节点加入集群时,kubeadm join会自动生成kubelet的客户端证书和kubeconfig文件,确保节点与apiserver的安全通信。也可手动生成证书,配置kubelet的--client-certificate和--client-key参数使用该证书。
访问令牌(ServiceAccount)
- 为租户Namespace创建专属ServiceAccount:
kubectl create sa <customer-sa> -n <customer-namespace>。 - 绑定对应的Role(如允许部署Pod、查看资源等)到该ServiceAccount:
kubectl create rolebinding <customer-rb> -n <customer-namespace> --role=<tenant-role> --serviceaccount=<customer-namespace>:<customer-sa>。 - 生成短期访问令牌:
kubectl create token <customer-sa> -n <customer-namespace> --duration=24h,租户可使用该令牌通过kubectl或API调用访问集群资源。
内容的提问来源于stack exchange,提问作者Jayashree Madanala
相关产品推荐
相关产品推荐

