KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力

KubeSphere 容器云实践:从管理 K8s 到建设企业 PaaS,还需要哪些能力

本文由 RuoYi Office 团队整理,结合实际项目分享企业软件的设计思路与开发经验。

当团队已经能在KubeSphere中查看微服务、Pod、事件与日志,下一步往往希望把它交给更多开发者:"选一个服务,填环境和版本,就能完成发布。"

从查看容器到自助发布,中间还有一段需要设计的交付流程。谁能改哪个环境,版本来自哪里,配置由谁提供,什么状态算成功,失败以后如何恢复,都需要明确答案。

本文结合RuoYi Office实验室,把Kubernetes、KubeSphere、Jenkins、独立观测平台和运维门户放到一条应用交付链中。重点是核对每个组件真正承担的职责,并据此规划企业PaaS的下一步。

▲ 管理界面让运行状态更容易看见;平台还需要约束谁能交付什么、如何判断结果以及由谁处理失败。

一、用一次BPM服务发布,理解平台应该交付什么

假设流程团队希望把一个BPM版本放到全功能微服务验证环境。对使用者而言,理想过程是选择服务、确认环境和版本,然后得到可访问的应用、发布结果与排查入口。

平台内部至少要回答:

  • 这个版本属于全功能版还是OA版,能否与当前网关、系统服务和数据库配合。
  • 镜像与配置来自哪个受控来源,能否核对不可变摘要。
  • 调用者能否操作目标环境,发布身份是否会越过其他环境。
  • Nacos注册、Service、业务API和观测入口如何关联。
  • 失败时是停止、回滚应用,还是需要处理数据库兼容与外部回调。

本实验室已有全功能版与OA版、单体与微服务的环境划分,业务运行在Kubernetes中;Jenkins承担构建与发布,KubeSphere承担容器管理,Grafana/Loki提供独立观测,统一运维主页组织访问入口。

这些组件已经可以组合使用,但当前发布流程仍依靠明确的流水线与配置,并没有实现面向所有开发者的完整自助申请、配额、审批与恢复服务。

▲ 上半部分是当前组件分工,下方列出待设计或验收的治理能力;不能把演进目标计入已完成项。

二、先确认Core与扩展,避免把菜单当安装清单

本案例运行KubeSphere 4.1.3 Core,当前核心Deployment有ks-apiserver、ks-console、ks-controller-manager,本轮采样各有一个就绪副本。

实际安装配置包含:

yaml 复制代码
global:
  tag: v4.1.3
telemetry:
  enabled: false
ha:
  enabled: false
redisHA:
  enabled: false
ksExtensionRepository:
  enabled: false

来源:k8s/kubesphere-values.yaml选定字段。只表示本案例配置,不是通用生产安装模板。

当前Extension对象清单为空,Jenkins与监控是独立部署。不能因为入口里有"流水线""监控与日志",就把它们描述成已经安装并验收的KubeSphere原生扩展。

KubeSphere v4.1官方介绍也将核心与可独立开发、部署的扩展分开。选型时应按组件列出版本、支持范围、部署方式和验收结果,而不是只写一个平台版本。

官方架构介绍:

https://www.kubesphere.io/zh/docs/v4.1/01-intro/01-introduction/

兼容性是交付输入,功能实测不能改写支持矩阵

本案例Kubernetes为1.36.5。2026-10-31重新核对的v4.1环境要求页面仍写明:4.1.3经测试的Kubernetes范围是1.21---1.30,其他版本不保证兼容,扩展组件还各有支持要求。

因此这里继续将当前组合作为实验性环境,不推荐照搬为生产支持组合。已经能登录、查看Deployment,只能说明这些具体功能在本次环境可用,不能推导升级、卸载、所有终端和全部扩展都受支持。

官方环境要求:

https://www.kubesphere.io/zh/docs/v4.1/03-installation-and-upgrade/01-preparations/01-supported-k8s/

这项检查最好发生在安装之前。若后续选择其他版本或商业服务,也应重新核对对应支持资料,不能沿用本文的旧矩阵。

三、先把微服务看清,再设计对开发者开放什么

当前全功能微服务环境有29个Deployment,包含28个后端与一个前端。它们具有独立的工作负载对象,但共享网关、服务发现和中间件依赖。

▲ 这是管理员视角下的真实负载列表。能看到多个服务,不等于已经实现团队级自助发布或租户隔离。

BPM服务详情可以进一步关联副本、Pod、节点与端口:

▲ 从业务模块落到具体运行对象,才能继续查看事件、日志与配置引用;运行对象也是后续交付记录应该关联的对象。

开发者平台要隐藏一部分重复操作,但应保留关键决策:目标环境、服务依赖、版本来源、配置来源、发布影响和失败处理。只把原来的kubectl动作搬成更多按钮,仍然要求使用者自行理解所有部署细节。

例如,看到BPM有独立Deployment,不代表可以任意用另一套版本替换它。还应检查它与系统权限、网关、流程数据以及其他RPC契约的兼容。平台应在交付入口声明这些依赖,避免把运行时故障留给使用者拼凑。

四、企业空间、Namespace与业务租户,要分开建模

三个概念容易同时被称为"租户":

  • 业务租户:企业应用内的数据、身份和权限边界。
  • Kubernetes Namespace:资源名称和部分管理策略的作用域。
  • KubeSphere企业空间/项目:面向组织协作、资源与权限管理的模型。

它们可以建立映射,但不会自动等价。应用里的tenantId,不会自动成为集群Namespace;创建Namespace,也不会自动完成企业空间成员、资源配额与网络隔离。

当前只读清单中,WorkspaceTemplate只有内置system-workspace。四个主要业务Namespace没有kubesphere.io/workspace标签;全功能微服务Namespace中,ResourceQuota、LimitRange和NetworkPolicy对象清单为空。

这些事实说明当前环境还没有通过上述对象建立完整的团队治理方案。它们不能推出整个集群完全没有其他安全控制,但足以提醒我们:有四个环境名称,不能据此宣称多租户平台已经建成。

下一步应先确定组织映射:谁拥有哪些环境、共享哪些中间件、谁能申请资源,再决定企业空间、项目、配额、网络策略和凭据怎样配套。应在专用测试身份下验证,而不只用管理员观察页面。

五、把发布权限做成可验证的边界

当前Jenkins发布使用独立ServiceAccount,绑定到目标业务Namespace。真实RoleBinding为:

yaml 复制代码
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: pipeline-deployer
  namespace: ro-all-cloud
subjects:
  - kind: ServiceAccount
    name: ro-all-cloud-deployer
    namespace: serverlab-build
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: pipeline-deployer

来源:k8s/all-cloud-deployer-rbac.yaml,与当前集群对象核对。ServiceAccount所在Namespace与被授权的资源Namespace可以不同。

本轮管理员使用身份模拟读取授权结果,没有执行资源修改:

bash 复制代码
actor=system:serviceaccount:serverlab-build:ro-all-cloud-deployer
identity=(--as="$actor" --as-group=system:serviceaccounts
  --as-group=system:serviceaccounts:serverlab-build
  --as-group=system:authenticated)
kubectl auth can-i patch deployments -n ro-all-cloud "${identity[@]}"
kubectl auth can-i patch deployments -n ro-oa-cloud "${identity[@]}"
kubectl auth can-i get secrets -n kube-system "${identity[@]}"
kubectl auth can-i create roles -n ro-all-cloud "${identity[@]}"
kubectl auth can-i get pods/log -n ro-all-cloud "${identity[@]}"

这组命令要求操作者具备相应的身份模拟权限;普通发布任务直接检查自身权限,不需要分发管理员凭据。

模拟时同时带入ServiceAccount的组,避免只模拟用户名、遗漏组授权后把拒绝结果误当成完整身份的权限结论。

实际答案依次为yes / no / no / no / yes:能修改本环境Deployment、能读本环境Pod日志;不能直接修改OA环境Deployment、读取kube-system Secret或在本环境创建Role。

这种正向与反向检查,比"流水线能发布,所以权限正确"更完整。不过它验证的是这些具体API授权,不是所有提权路径都已排除。

由于发布身份可以修改工作负载模板,还需要评估可引用的ServiceAccount、Secret和存储,以及准入策略。直接get Secret被拒,不意味着可管理的工作负载就绝不可能接触凭据。开放给不受信任团队之前,应单独完成这层约束与验证。

六、发布成功要附带证据,不能只留下一个绿灯

本环境使用独立Jenkins:固定输入与镜像摘要、按环境发布、归档状态与事件。既有全功能微服务发布记录包含manifest、部署结果、Pod状态和传输层稳定性记录。

▲ 读取已有发布记录,没有触发新构建。产物可以回答发布了什么、当时哪些对象就绪,而不是只提供一个成功标志。

流水线中的关键检查包括:

bash 复制代码
test "$(./kubectl auth can-i patch deployments -n ro-all-cloud)" = yes
test "$(./kubectl auth can-i get secrets -n kube-system || true)" = no
test "$(./kubectl auth can-i patch deployments -n ro-oa-cloud || true)" = no

./kubectl wait --for=condition=Available deployment --all \
  -n ro-all-cloud --timeout=900s
./kubectl get deployments -n ro-all-cloud -o json > deployment-status.json
./kubectl get pods -n ro-all-cloud -o wide > pod-status.txt

来源:ci/Jenkinsfile.deploy-all-cloud,按原顺序摘录权限与就绪读取部分,中间apply与完整循环省略。不能把这段当成完整发布脚本。

完整门禁还要求预期Pod同时处于Running/Ready,连续检查六次,每次之间有间隔。它在归档文本中明确表示传输层检查,业务验收仍需继续。

PaaS交付结果应继续关联代表性API、服务发现、消息/任务回调与业务场景结果。一个BPM容器Ready,不代表审批提交、跨服务权限与流程完成回写都已通过。

同样,"有镜像digest和旧manifest"是恢复设计的输入,不等于已经演练过全部回滚。数据库变更兼容、旧镜像可用性、配置版本和外部任务都可能影响恢复。

七、独立观测平台可以组合,但要明确集成到哪一层

Grafana、Prometheus、Loki在当前环境独立运行,提供节点指标和日志入口。

▲ 这是独立看板,不是KubeSphere原生监控扩展的安装证据。平台接入时应分别声明入口、数据源和权限。

"组合"可以先做到链接跳转,再逐步关联Namespace、服务、Pod、镜像与发布编号。但每增加一层,都有需要验收的内容:

  • 链接能打开:只证明入口可访问。
  • 自动带入服务与时间窗:还要确认对象和查询条件正确。
  • 团队只能看到本环境日志:需要数据源与查询授权边界。
  • 告警送达负责人并完成处理:需要路由、通知和响应证据。

不能用一个管理员可访问的Grafana截图,替代所有团队的日志隔离或告警闭环。本案例已有观测基础,团队级权限、应用专项指标和长期告警响应仍应逐项设计。

八、统一运维主页先解决"去哪里",再谈"替我做什么"

实际运维主页已经把业务入口、KubeSphere项目、Jenkins、监控和中间件放到同一目录中。对使用者而言,它减少了记端口与找入口的成本。

▲ 打开应用与管理容器是不同入口。主页提供导航,不代替目标系统认证。

微服务详情还展示模块、环境、镜像摘要、实际构建来源与当前边界:

▲ "最近核验就绪"来自固定证据快照,实时健康和重启信息需要到实际运行与观测系统查看。

页面启动时读取静态目录:

javascript 复制代码
const response = await fetch('data.json', { cache: 'no-store' });
if (!response.ok) throw new Error('HTTP ' + response.status);
data = await response.json();

来源:portal/app.js。no-store控制缓存使用,不会让静态JSON自动产生实时集群状态。

本轮访问到的目录有34个入口、28个后端服务条目,生成时间为2026-10-29。这不是当前Running Pod数量。门户中可以同时存在正常入口、待部署项目与连接信息,它们需要用不同状态表达。

这个主页没有自动巡检或定时运维,没有替用户登录其他系统,收藏仅保存在当前浏览器。它已经完成入口治理的一部分,尚不是统一身份、自助发布与实时监控的完整前台。

如果继续增加"发布"操作,不能直接让浏览器持有集群管理员token。应由受控后端验证身份、环境与输入,提交到受权限约束的交付流程,并提供状态、日志和结果。这里是后续设计方向,本轮没有增加任何写操作。

九、从现有容器云走向PaaS,按交付契约逐步推进

可以把后续建设拆成三个阶段,每阶段都有明确完成条件。

第一阶段:资源与入口可核对。 服务目录能关联工作负载、镜像、配置来源、流水线和观测入口;显示快照时间,不把旧记录当实时状态。当前实验室已经具备其中多项基础,继续统一对象标识与证据来源即可减少重复查询。

第二阶段:固定的交付路径可重用。 为BPM等服务定义允许的目标环境、输入版本、依赖、资源、凭据引用、就绪与业务验收,失败保留旧结果和诊断证据。当前固定流水线可作为基础,但不能把全环境发布能力直接宣称为任意单服务自助交付。

第三阶段:团队可以在边界内自助使用。 再补组织/项目映射、额度、身份、审批或审计规则、准入限制、日志权限、告警响应和恢复演练。用普通团队身份完成一次完整流程,并验证跨环境拒绝、失败处理与证据访问,才适合扩大开放范围。

平台团队维护的不只是工具版本,还包括这条路径能保证什么、依赖谁、何时会失败。已有组件可以组合推进,不必为了统一外观重复部署第二套CI或监控;但组合后的身份、数据、对象与责任也必须明确。

常见问题(FAQ)

安装KubeSphere之后,是否就拥有完整企业PaaS?

需要核对实际Core、扩展、应用交付和治理能力。能管理工作负载是基础,自助申请、权限、验收与恢复还需形成完整流程。

Kubernetes Namespace与KubeSphere企业空间有什么关系?

它们属于不同管理层次,需要明确组织与项目映射。已有Namespace不能自动证明企业空间成员、配额与网络策略已配置完成。

独立Jenkins可以和KubeSphere一起使用吗?

可以。本案例用Jenkins发布、KubeSphere管理运行对象。需要核对环境、权限与证据关联,不能将独立部署描述成已安装原生DevOps扩展。

统一运维主页是否可以直接当实时健康看板?

取决于数据来源。本案例是静态目录和验证快照,显示更新时间;实时状态需要到集群与观测系统读取。

如何判断可以向更多开发团队开放平台?

用非管理员身份验收一条完整交付路径,同时检查授权拒绝、凭据边界、业务验证、日志权限与失败恢复。只证明管理员能操作还不够。

让每项平台能力都能回答一个具体交付问题

这套实践保留了各工具的清晰职责:KubeSphere帮助看清运行对象,Jenkins约束交付过程,独立观测系统提供指标与日志,运维主页组织入口和证据。

下一步的价值在于把这些能力连成开发团队可理解、可重复使用的交付契约。用实际权限、版本、验收和恢复结果评估平台,会比计算菜单数量更接近企业微服务落地的需求。

如果这篇对你有用,欢迎点赞支持。

我们会持续分享企业软件开发实践与 RuoYi Office 产品进展。

相关推荐
风吹稻子1 小时前
etcd备份与恢复:删了 etcd.yaml,容器为什么还在跑?——一次 K8s 控制面死锁排查实录
kubernetes
weirong5 小时前
Operator 的测试该写到哪一层?139 个用例之后我划的三条线
kubernetes
软件技术NINI7 小时前
基于SpringBoot和Vue的新能源汽车销售推荐系统
java·vue.js·spring boot·后端·汽车·毕业设计·毕设
Flynn Liang7 小时前
LangChain4j 生产级工程骨架:12 个模块 + Docker 一键启动
java·spring boot·langchain·rag·langchain4j
逐流人8 小时前
手工建集群到全自动发布:k8s集群部署与DevOps流水线整合实战
ci/cd·云原生·kubernetes·云计算·devops
我不会起名字3228 小时前
K8s Pod 反复重启 CrashLoopBackOff:从 exit code 到根因的 5 步排查
云原生·容器·kubernetes·k8s
RuoyiOffice8 小时前
固定资产维修管理:从报修、审批到办结,原资产卡怎么回查?
spring boot·固定资产·ruoyi office·资产维修·维修审批·维修办结·资产履历
招风的黑耳9 小时前
SpringBoot+Vue+MySQL 民宿在线预定平台 完整可运行版(源码+文档)
vue.js·spring boot·mysql
我不会起名字3229 小时前
K8s 节点磁盘打满导致 Pod 被驱逐:4 类占用与回收顺序
运维·kubernetes·k8s·diskpressure·evicted