使用 Portainer Business 实现多租户 RBAC

解读

在国内金融、运营商、政务云等合规场景,**“多租户+细粒度权限”**是容器平台落地的硬性门槛。Portainer Business(以下简称 PB)作为轻量级可视化治理层,必须回答三个核心拷问:

  1. 租户间网络、存储、镜像仓库如何做到逻辑隔离;
  2. 如何与现有AD/LDAP/钉钉/企业微信打通,避免二次账号体系;
  3. 当租户规模>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/日志审计一体机

答案

步骤一:架构前置条件

  1. 购买 PB Business 许可证,节点数=物理 CPU 核数/2(国内代理商惯例)。
  2. 准备 MySQL 8.0 高可用实例(推荐 PolarDBTencent TDSQL),字符集 utf8mb4_bin,关闭 ONLY_FULL_GROUP_BY
  3. 镜像仓库采用 Harbor 2.8,开启 OIDC 集成,与 PB 共用 AD/LDAP 作为 IdP,避免双账号。

步骤二:PB 初始化与多租户底座

  1. 使用官方 Helm Chart 安装,values 关键项:
    • enterpriseEdition.enabled=true
    • persistence.storageClass=alicloud-disk-ssd(国内云厂商)
    • tls.force=true 并挂载 国密双证(SM2 签名+加密)。
  2. 首次登录创建 Super-Admin,立即开启 MFA(TOTP),绑定 钉钉扫码(通过自研插件)。
  3. 创建 “系统级” Endpoint 组,把 K8s 集群、Docker Swarm、Edge 节点按网络分区注册;标签规范=tenant/环境/等级,方便后续 GitOps 批量纳管。

步骤三:租户建模与 RBAC 落地

  1. 租户 = PB Team,命名规范:tenant-<公司拼音>-<环境>,例如 tenant-picc-prod
  2. 在 AD 侧创建 同步组 CN=picc-prod,OU=K8s,DC=corp,DC=com,PB 开启 LDAP Group Sync同步周期 15 min过滤规则=(&(objectClass=group)(cn=tenant-*))
  3. 为每个租户预制 三套角色
    • tenant-admin:拥有 Namespace 级所有权限,可编辑 ResourceQuota、NetworkPolicy;
    • tenant-developer只读+Pod 日志+终端,禁止删除 PVC、Secret;
    • tenant-viewer只读,供审计、运维值班。
      角色通过 PB Custom Role 创建,K8s 端自动生成 ClusterRole portainer-tenant-*绑定到对应 Namespace 的 RoleBinding
  4. Registry 隔离:在 PB 创建 “私有 Registry” 凭证,Scope 限定到 Team镜像拉取策略=IfNotPresentHarbor 项目级 RBAC 与 PB Team 同名,Replication 规则=push-based,实现 跨数据中心灾备

步骤四:资源配额与网络策略

  1. 在 PB Namespace 创建向导中,强制开启 ResourceQuota
    • CPU: requests=100m,limits=200m
    • Memory: requests=1Gi,limits=2Gi
    • Storage: storageclass-ssd=50Gi
      超出后 PB 自动 拒绝部署并返回 中文错误提示
  2. 网络策略采用 PB “内置模板”默认拒绝跨租户允许同租户 Namespace 内 Pod 全通Egress 只允许 80/443/53特殊端口走 CR 审批

步骤五:CI/CD 集成与 GitOps

  1. 在 PB “Custom Template” 中预置 Helm Chart 模板Values 文件托管在 GitLabWebhook 触发 PB Stack Update
  2. PB “Edge Job” 调用 Jenkinsfile镜像构建阶段使用 Docker Buildx多阶段构建=--target=prod非 root 用户=USER 65534镜像扫描=trivy --severity HIGH,CRITICAL
  3. 发布流水线通过 PB API/api/stacks/{id}/gitops自动更新回滚策略=kubectl rollout undo deployment/xxx审计日志自动写入 LTS(日志服务)。

步骤六:故障排查与性能调优

  1. PB “Activity Logs” 支持 中文关键词检索TraceIDJaeger 打通,定位 5xx 错误平均耗时 <30s。
  2. Team 数量>100 时,PB MySQL 端出现慢查询,需开启 索引提示CREATE INDEX idx_team_endpoint ON team_endpoint (team_id, endpoint_id);
  3. 许可证告警:PB 每日凌晨 02:00 上报 节点使用率超过 90% 自动发 钉钉机器人告警,预留 3 天缓冲避免 服务中断

拓展思考

  1. 混合云合规:若租户数据需留在 本地机房,PB 如何与 阿里专有云 Apsara Stack 对接?——需使用 PB Edge Agent反向隧道HTTPS 443证书采用国密 SM2审计日志通过 云桥同步到 监管平台
  2. License Server 高可用:PB 许可证服务是 单点,可基于 Nginx + Keepalived双活许可证文件OSS + CDNSHA256 校验防止篡改。
  3. K8s 1.28 新特性“UserNamespaces” 已 GA,PB 计划在下个版本支持 “Rootless Pod”如何与现有 RunC 版本兼容?——需升级 containerd ≥1.7,**PB 前端增加 “安全等级” 开关,**自动注入 securityContext: runAsUser: 65534