使用 Portainer Business 实现多租户 RBAC
解读
在国内金融、运营商、政务云等合规场景,**“多租户+细粒度权限”**是容器平台落地的硬性门槛。Portainer Business(以下简称 PB)作为轻量级可视化治理层,必须回答三个核心拷问:
- 租户间网络、存储、镜像仓库如何做到逻辑隔离;
- 如何与现有AD/LDAP/钉钉/企业微信打通,避免二次账号体系;
- 当租户规模>50、集群>10 套时,PB 自身性能与许可证会不会成为瓶颈。
面试官想听的不仅是“点按钮”,而是你对底层 Docker/RBAC 模型、K8s CRD、许可证机制、审计合规的闭环设计。
知识点
- PB 授权模型:Endpoints → Teams → Roles → Users 四级映射,与 K8s RBAC 的 ClusterRole/Role 并非一一对应,需理解 PB 在 K8s 端自动生成的 RoleBinding 命名规则。
- 许可证维度:PB Business 按 Managed Node 数量计费,LDAP/SAML/OAuth 仅 Business 版开放;CE 版无多租户。
- 资源隔离手段:PB 通过 Namespace + Resource Quota + NetworkPolicy 三元组落地,StorageClass 只允许白名单挂载。
- 安全加固:PB 强制 HTTPS + JWT;内置 OIDC Group Claim 映射到 Team;Registry 凭据用 PB 的 Encrypted Config 存储,而非 Docker config.json 明文。
- 高可用部署:PB 官方 Helm Chart 默认 单副本 SQLite,生产必须切换 MySQL/PostgreSQL 并做 PVC 快照备份;许可证文件需挂在 Secret 中,滚动升级时避免 License Server 重复拉取。
- 审计合规:PB Business 提供 API 级别审计日志,格式符合 GB/T 22239-2019 网络安全等级保护 2.0 要求,需接入国内 ELK/日志审计一体机。
答案
步骤一:架构前置条件
- 购买 PB Business 许可证,节点数=物理 CPU 核数/2(国内代理商惯例)。
- 准备 MySQL 8.0 高可用实例(推荐 PolarDB 或 Tencent TDSQL),字符集 utf8mb4_bin,关闭 ONLY_FULL_GROUP_BY。
- 镜像仓库采用 Harbor 2.8,开启 OIDC 集成,与 PB 共用 AD/LDAP 作为 IdP,避免双账号。
步骤二:PB 初始化与多租户底座
- 使用官方 Helm Chart 安装,values 关键项:
enterpriseEdition.enabled=truepersistence.storageClass=alicloud-disk-ssd(国内云厂商)tls.force=true并挂载 国密双证(SM2 签名+加密)。
- 首次登录创建 Super-Admin,立即开启 MFA(TOTP),绑定 钉钉扫码(通过自研插件)。
- 创建 “系统级” Endpoint 组,把 K8s 集群、Docker Swarm、Edge 节点按网络分区注册;标签规范=
tenant/环境/等级,方便后续 GitOps 批量纳管。
步骤三:租户建模与 RBAC 落地
- 租户 = PB Team,命名规范:
tenant-<公司拼音>-<环境>,例如tenant-picc-prod。 - 在 AD 侧创建 同步组
CN=picc-prod,OU=K8s,DC=corp,DC=com,PB 开启 LDAP Group Sync,同步周期 15 min,过滤规则=(&(objectClass=group)(cn=tenant-*))。 - 为每个租户预制 三套角色:
- tenant-admin:拥有 Namespace 级所有权限,可编辑 ResourceQuota、NetworkPolicy;
- tenant-developer:只读+Pod 日志+终端,禁止删除 PVC、Secret;
- tenant-viewer:只读,供审计、运维值班。
角色通过 PB Custom Role 创建,K8s 端自动生成 ClusterRoleportainer-tenant-*,绑定到对应 Namespace 的 RoleBinding。
- Registry 隔离:在 PB 创建 “私有 Registry” 凭证,Scope 限定到 Team,镜像拉取策略=
IfNotPresent,Harbor 项目级 RBAC 与 PB Team 同名,Replication 规则=push-based,实现 跨数据中心灾备。
步骤四:资源配额与网络策略
- 在 PB Namespace 创建向导中,强制开启 ResourceQuota:
- CPU:
requests=100m,limits=200m - Memory:
requests=1Gi,limits=2Gi - Storage:
storageclass-ssd=50Gi
超出后 PB 自动 拒绝部署并返回 中文错误提示。
- CPU:
- 网络策略采用 PB “内置模板”,默认拒绝跨租户,允许同租户 Namespace 内 Pod 全通,Egress 只允许 80/443/53,特殊端口走 CR 审批。
步骤五:CI/CD 集成与 GitOps
- 在 PB “Custom Template” 中预置 Helm Chart 模板,Values 文件托管在 GitLab,Webhook 触发 PB Stack Update。
- PB “Edge Job” 调用 Jenkinsfile,镜像构建阶段使用 Docker Buildx,多阶段构建=
--target=prod,非 root 用户=USER 65534,镜像扫描=trivy --severity HIGH,CRITICAL。 - 发布流水线通过 PB API(
/api/stacks/{id}/gitops)自动更新,回滚策略=kubectl rollout undo deployment/xxx,审计日志自动写入 LTS(日志服务)。
步骤六:故障排查与性能调优
- PB “Activity Logs” 支持 中文关键词检索,TraceID 与 Jaeger 打通,定位 5xx 错误平均耗时 <30s。
- 当 Team 数量>100 时,PB MySQL 端出现慢查询,需开启 索引提示:
CREATE INDEX idx_team_endpoint ON team_endpoint (team_id, endpoint_id);。 - 许可证告警:PB 每日凌晨 02:00 上报 节点使用率,超过 90% 自动发 钉钉机器人告警,预留 3 天缓冲避免 服务中断。
拓展思考
- 混合云合规:若租户数据需留在 本地机房,PB 如何与 阿里专有云 Apsara Stack 对接?——需使用 PB Edge Agent,反向隧道走 HTTPS 443,证书采用国密 SM2,审计日志通过 云桥同步到 监管平台。
- License Server 高可用:PB 许可证服务是 单点,可基于 Nginx + Keepalived 做 双活,许可证文件放 OSS + CDN,SHA256 校验防止篡改。
- K8s 1.28 新特性:“UserNamespaces” 已 GA,PB 计划在下个版本支持 “Rootless Pod”,如何与现有 RunC 版本兼容?——需升级 containerd ≥1.7,**PB 前端增加 “安全等级” 开关,**自动注入
securityContext: runAsUser: 65534。