2. OpenShift架构与开发者视角

要真正用好OpenShift,开发者需要先建立一张“集群地图”:哪些组件属于平台底座、哪些资源由开发者创建、哪些操作会被平台策略拦截。OpenShift本质上是“Kubernetes + 企业级扩展”,它保留了Kubernetes的核心对象模型,同时叠加了安全、构建、镜像、路由、监控等能力。理解这套架构,能帮助你在遇到权限拒绝、Pod无法调度、镜像拉取失败等问题时,快速判断问题出在平台层还是应用层。

一、集群组成:控制平面与工作节点

一个OpenShift集群由控制平面(Control Plane)和工作节点(Worker Node)组成。控制平面是集群的“大脑”,负责接收请求、保存期望状态、调度工作负载;工作节点是“手脚”,负责实际运行容器。开发者通常不直接登录控制平面节点,而是通过API Server或Web控制台提交资源。

控制平面中的关键组件包括:

  • kube-apiserver:所有请求的统一入口,kubectl、oc、Web控制台、CI/CD系统都通过它读写资源。
  • etcd:保存集群全部状态数据,是集群的“唯一事实来源”。
  • kube-scheduler:决定Pod应该调度到哪个节点,依据资源请求、亲和性、污点与容忍等规则。
  • kube-controller-manager:运行各种控制器,持续把实际状态拉回到期望状态。
  • cloud-controller-manager:在云环境中对接负载均衡、存储、节点生命周期等云资源。

工作节点上运行的关键组件包括:

  • kubelet:节点代理,负责启动、停止、监控Pod。
  • CRI-O:OpenShift默认的容器运行时,负责拉取镜像并运行容器。
  • kube-proxy:维护Service的网络转发规则。
  • OVN-Kubernetes:OpenShift默认网络插件,提供Pod网络、Service网络和网络策略。

从开发者视角看,你提交一个Deployment后,请求先到API Server,写入etcd;Deployment控制器创建ReplicaSet,ReplicaSet控制器创建Pod;Scheduler为Pod选择节点;目标节点的kubelet通过CRI-O拉取镜像并启动容器。这条链路是理解OpenShift行为的基础。

OpenShift 集群组成与开发者请求链路 开发者入口 oc / kubectl Web Console / CI 控制平面 Control Plane kube-apiserver 统一入口 / 鉴权 etcd 集群状态存储 kube-scheduler 选择目标节点 controller-manager 维持期望状态 cloud-controller 云资源对接 工作节点 Worker kubelet Pod 生命周期 CRI-O 拉镜像 / 跑容器 kube-proxy / OVN Service / Pod 网络 项目 Project = 命名空间 Namespace + 策略 dev-team 开发项目 test-team 测试项目 prod-team 生产项目 配额 Quota · 限制 LimitRange · 网络策略 NetworkPolicy · RBAC 开发者可操作边界 可创建:Deployment Service / Route / PVC ConfigMap / Secret BuildConfig / ImageStream 不可操作:etcd / 节点 / 控制平面

二、项目与命名空间:开发者最常打交道的边界

在Kubernetes中,命名空间(Namespace)用于隔离资源;在OpenShift中,项目(Project)是命名空间的增强版。创建一个项目时,OpenShift会自动创建对应的Namespace,并附加默认的RBAC、配额、LimitRange、NetworkPolicy等策略。开发者通常通过oc new-project dev-team创建项目,随后所有资源都限定在该项目内。

项目带来的实际约束包括:

  • 名称唯一性:项目名即命名空间名,集群内全局唯一。
  • 资源配额:管理员可设置CPU、内存、Pod数量、PVC数量上限,超出后创建请求会被拒绝。
  • 默认限制:LimitRange可为未声明resources的容器设置默认requests/limits,避免“裸奔”容器。
  • 网络隔离:默认允许同项目内Pod互通,跨项目访问需显式NetworkPolicy或Service暴露。
  • 权限隔离:开发者通常只拥有自己项目的edit或admin角色,无法查看其他项目。

一个常见的教学示例:在dev-team项目中创建Deployment,副本数3,容器镜像为quay.io/example/web:v1,资源请求cpu=100m, memory=128Mi,限制cpu=500m, memory=256Mi。如果项目配额为cpu=2, memory=2Gi, pods=10,那么3个副本合计请求300m CPU、384Mi内存,在配额内可正常创建;若把副本数改为10,请求达到1 CPU、1.28Gi内存,仍可能通过,但Pod总数达到10,接近上限。此时再创建新应用就会触发配额拒绝,API返回类似exceeded quota: compute-resources的错误。

三、开发者可操作边界:能做什么、不能做什么

OpenShift通过RBAC和SCC(Security Context Constraints)划分开发者边界。开发者通常可以:

  • 在授权项目内创建、更新、删除Deployment、Service、Route、ConfigMap、Secret、PVC、BuildConfig、ImageStream等应用层资源。
  • 查看自己项目的Pod日志、事件、指标,使用oc logs、oc describe、oc get events排查问题。
  • 触发构建、回滚部署、调整副本数、修改环境变量和配置。
  • 使用oc port-forward临时访问Pod端口进行调试。

开发者通常不能:

  • 直接访问或修改etcd、控制平面组件、节点配置。
  • 创建ClusterRole、ClusterRoleBinding、Namespace级别的全局资源。
  • 使用特权容器、hostNetwork、hostPath等高风险配置,除非管理员通过SCC显式授权。
  • 查看其他项目的资源,除非被授予跨项目权限。
判断一个操作是否可行,最快的方法是执行oc auth can-i <verb> <resource> -n <project>。例如oc auth can-i create deployment -n dev-team返回yes,说明当前用户在该项目内可以创建Deployment。

四、从请求到运行:一次部署的完整链路

假设开发者执行oc apply -f web-deployment.yaml,集群内部发生以下过程:

  1. oc客户端把YAML发送到API Server,API Server完成认证、鉴权、准入控制。
  2. 准入控制器检查配额、LimitRange、SCC等策略,通过后写入etcd。
  3. Deployment控制器发现新对象,创建ReplicaSet;ReplicaSet控制器创建3个Pod对象。
  4. Scheduler为每个Pod选择满足资源请求和亲和性规则的节点。
  5. 目标节点kubelet收到Pod绑定信息,调用CRI-O拉取镜像并启动容器。
  6. OVN-Kubernetes为Pod分配IP,kube-proxy维护Service转发规则。
  7. 若创建了Route,OpenShift Ingress Controller将外部域名映射到Service。

观察结果时,可以按顺序执行:oc get deployment查看期望副本与实际副本是否一致;oc get pods -o wide查看Pod所在节点和IP;oc describe pod <name>查看事件;oc logs <pod>查看应用日志。如果Pod一直Pending,优先检查资源配额、节点可调度资源和PVC绑定状态;如果ImagePullBackOff,检查镜像地址、Secret和网络;如果CrashLoopBackOff,检查应用启动命令、配置和依赖服务。

开发者最容易忽略的边界是SCC。即使RBAC允许创建Pod,如果Pod要求以root运行、挂载hostPath或使用特权模式,SCC仍会拒绝。此时事件中会出现unable to validate against any security context constraint,需要调整容器安全上下文或联系管理员授权。

五、开发者视角的架构速查

层级 对象/组件 开发者是否可直接操作 典型用途
控制平面 etcd、apiserver、scheduler 否 集群状态与调度
节点 kubelet、CRI-O、OVN 否 运行容器与网络
项目 Namespace、Quota、LimitRange 部分(查看/使用) 资源隔离与配额
应用 Deployment、Service、Route 是 部署与暴露应用
配置 ConfigMap、Secret、PVC 是 配置与持久化
构建 BuildConfig、ImageStream 是 源码到镜像

掌握这张架构图后,开发者就能把“我的应用为什么没起来”拆解成几个可检查的层面:请求是否被API Server接受、是否通过配额和SCC、是否被调度到节点、镜像是否拉取成功、容器是否正常启动、Service和Route是否可达。每一层都有对应的oc命令和事件信息,定位效率会显著提升。