DO280 v4.14 综合练习手册 — OpenShift 管理实战指南

本手册基于 OKD 4.21 / Kubernetes 1.31 实验环境,覆盖 EX280(OpenShift 管理)考试全部核心考点。每道题包含理论讲解、核心命令、YAML 模板、考试陷阱、实操验证,可作为考前冲刺手册使用。

⚠️ 原版对比标注:每道题中用 📌 原版命令 标注了与 DO280v4.14 原版练习题的差异,确保考试操作与真实环境一致。


DO280 是什么?

课程定位

DO280: Red Hat OpenShift Administration II: Operating a Production Kubernetes Cluster 是红帽官方的 OpenShift 运维课程,目标是让你学会在生产环境中安装、配置和管理 OpenShift Container Platform 集群

简单来说:Kubernetes 太底层,OpenShift 在上面包了一层企业级的东西,DO280 教你怎么用好这层东西。

学完能做什么

能力 具体内容
集群管理 安装 OpenShift、管理节点、升级集群
身份认证 配置 HTPasswd、LDAP、GitHub 等身份提供者
权限控制 RBAC 精细控制谁能访问什么资源
应用部署 部署、扩缩容、滚动更新、回滚
网络管理 Route 路由、TLS 加密、NetworkPolicy 隔离
存储管理 PV/PVC 持久化存储配置
安全加固 Secret、ServiceAccount、SCC 安全约束
故障排查 诊断和修复常见的集群与应用问题
运维自动化 Operator 安装与管理、Helm 包管理

对应考试

考试 说明
考试编号 EX280
考试名称 Red Hat Certified Specialist in OpenShift Administration
考试形式 实操考试(Performance-based),没有选择题!全部在真实 OpenShift 集群上操作
考试时长 3 小时
题目数量 约 20-25 道
及格线 70%(210 分满分,需 210 × 0.7 = 147 分以上)
有效期 3 年
费用 约 $400 USD

考试特点

  • 实操为主:每道题给你一个操作目标,你在真实的 OpenShift 集群里完成,系统自动评分
  • 没有选择题:不会问你"以下哪个是正确的",而是直接让你做
  • 时间紧张:21 道题 × 3 小时,平均每题 8.5 分钟,需要熟练操作
  • 环境是真实的:不是模拟器,是一个完整的 OpenShift 集群
  • 可以查文档:考试环境提供 OpenShift 官方文档,但查文档会浪费时间

与 DO180 的关系

课程 定位 侧重
DO180 入门 容器基础、Pod、基本部署
DO280(本手册) 进阶 OpenShift 运维、认证、权限、存储、网络
DO380 高级 集群安装、多集群管理、高级安全

建议先学 DO180 打基础,再学 DO280。

知识图谱

DO280 知识体系
├── 身份与认证
│   ├── HTPasswd / LDAP / GitHub
│   ├── 用户管理
│   └── 组管理
├── 权限管理
│   ├── RBAC(Role / ClusterRole)
│   ├── ClusterRoleBinding / RoleBinding
│   └── self-provisioner 控制
├── 资源管理
│   ├── ResourceQuota(项目配额)
│   ├── LimitRange(容器限制)
│   └── 扩缩容(手动 / HPA)
├── 应用管理
│   ├── Deployment / DeploymentConfig
│   ├── Helm 包管理
│   ├── CronJob
│   └── Operator
├── 网络
│   ├── Service / Route
│   ├── TLS(edge / passthrough / reencrypt)
│   └── NetworkPolicy
├── 存储
│   ├── PV / PVC / StorageClass
│   └── NFS / Ceph
├── 安全
│   ├── Secret / ConfigMap
│   ├── ServiceAccount
│   └── SCC(安全上下文约束)
└── 运维
    ├── 故障排查
    ├── must-gather
    └── 项目模板

环境准备

集群架构

┌──────────────────────────────────────┐
│         Kubernetes / OpenShift        │
├──────────────────┬───────────────────┤
│ master (Control Plane) │ worker (Node) │
│ 192.168.10.101   │ 192.168.10.102    │
│ 4C / 8GB / 45GB  │ 4C / 8GB / 45GB   │
├──────────────────┴───────────────────┤
│ 工具链:oc 4.21 / kubectl / helm 3   │
│ 网络:Calico / Ingress NGINX         │
│ 存储:local-path provisioner          │
└──────────────────────────────────────┘

登录集群

ssh [email protected]
oc get nodes

练习 1:配置 HTPasswd 身份提供者

考试目标

将 HTPasswd 文件配置为 OpenShift 集群的身份提供者,使用户可通过用户名/密码登录。

原理讲解

OpenShift 默认不提供本地用户管理,需要通过 OAuth 配置 身份提供者(Identity Provider) 来认证用户。

认证流程:

用户登录 → OAuth Server → 查询 Identity Provider (HTPasswd)
                                    ↓
                            验证用户名/密码
                                    ↓
                          创建/关联 User + Identity 对象

完整操作流程:

Step 1: 创建 HTPasswd 文件(存储用户名和加密密码)
   ↓
Step 2: 将文件存为 OpenShift Secret(命名空间:openshift-config)
   ↓
Step 3: 修改 OAuth 配置,引用该 Secret
   ↓
Step 4: OAuth Operator 自动重启,用户可登录

核心命令

# Step 1: 创建 HTPasswd 文件(首次创建)
htpasswd -c -B -b ./htpasswd armstrong indionce

# 追加用户(不能加 -c,否则覆盖)
htpasswd -B -b ./htpasswd jobs sestiver
htpasswd -B -b ./htpasswd wozniak glegunge

# Step 2: 创建 Secret(必须在 openshift-config 命名空间)
oc create secret generic ex280-idp-secret \
  --from-file htpasswd=./htpasswd \
  -n openshift-config

# Step 2.5: 备份当前 OAuth 配置(重要!方便回滚)
oc get oauth cluster -o yaml -n openshift-config > oauth-cluster-backup.yaml

# Step 3: 编辑 OAuth 资源
oc edit oauth cluster
# 或用 YAML 文件创建后 replace
# oc replace -f oauth.yaml

OAuth YAML 模板

apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  name: cluster
spec:
  identityProviders:
  - name: htpasswd_provider          # 身份提供者名称(自定义)
    mappingMethod: claim             # claim | add | lookup
    type: HTPasswd
    htpasswd:
      fileData:
        name: ex280-idp-secret       # Step 2 中创建的 Secret 名称

mappingMethod 策略对比

策略 说明
claim 默认值。根据身份提供者返回的声明自动映射用户
add 每次登录都创建新的 Identity 关联(可能导致重复用户)
lookup 仅查找已手动创建的 Identity 映射

📌 原版命令差异

项目 原版练习 我们的环境
Secret 名称 ex280-idp-secret htpasswd-secret
应用方式 oc replace -f oauth.yaml oc edit oauth cluster
备份步骤 oc get oauth cluster -o yaml > backup.yaml 未包含
用户名 armstrong/jobs/wozniak user1/user2/developer

⚠️ 考试建议:先备份 oauth-cluster-backup.yaml,再用 oc replace -f oauth.yaml 应用,方便回滚。oc edit 也可以,但无法精确回滚。

考试陷阱

陷阱 正确做法
htpasswd 未加 -B 参数 必须使用 -B(bcrypt 加密),OpenShift 不接受其他加密方式
Secret 创建在错误的命名空间 必须在 openshift-config 命名空间
追加用户时使用了 -c 第一次创建用 -c,追加用户时不能加 -c(否则覆盖)
不理解 mappingMethod claim = 默认自动映射;add = 强制新增;lookup = 仅查找

练习 2:集群级权限管理

考试目标

授予或回收用户的集群级角色,如 cluster-admin(超级管理员)和 self-provisioner(自建项目权限)。

原理讲解

RBAC(基于角色的访问控制)由两部分组成:

用户 ──→ ClusterRoleBinding ──→ ClusterRole ──→ 权限集合
                                    │
                        cluster-admin(全局管理员)
                        self-provisioner(可创建项目)
                        basic-user(基础权限)
                        sudoer(可模拟其他用户)

ClusterRole 与 Role 的区别:

类型 作用范围 典型用途
ClusterRole 全集群 cluster-admin、self-provisioner
Role 单个命名空间 项目级权限

灵活组合: ClusterRole 绑定到 ClusterRoleBinding = 全局生效;ClusterRole 绑定到 RoleBinding = 仅在该命名空间生效。

核心命令

# 授予集群管理员
oc adm policy add-cluster-role-to-user cluster-admin jobs

# 授予 self-provisioner(允许创建新项目)
oc adm policy add-cluster-role-to-user self-provisioner wozniak

⚠️ 禁止用户自建项目(考试重点!)

原版练习的完整步骤是 三步,缺一不可:

# Step 1: 从组中移除 self-provisioner 权限
# (不是从用户移除,而是从 system:authenticated:oauth 组移除!)
oc adm policy remove-cluster-role-from-group \
  self-provisioner system:authenticated:oauth

# Step 2: 防止 OAuth Operator 自动恢复权限(关键!)
# 不加这步的话,Operator 会定期把权限加回来
oc annotate clusterrolebinding.rbac self-provisioners \
  'rbac.authorization.kubernetes.io/autoupdate=false' --overwrite

# Step 3: 验证
oc auth can-i create projectrequests
# → no

其他常用命令

# 授予给组
oc adm policy add-cluster-role-to-group self-provisioner devops-team

# 回收权限
oc adm policy remove-cluster-role-from-user cluster-admin developer

# 验证权限
oc auth can-i create projectrequests
oc auth can-i --list

📌 原版命令差异

项目 原版练习 我们的手册(旧版)
禁止自建项目 remove-cluster-role-from-group ... system:authenticated:oauth remove-cluster-role-from-user
防回滚 oc annotate ... autoupdate=false 缺失

🔴 这是最重要的差异! 考试禁止自建项目必须从 移除,并加 autoupdate=false 注解,否则 Operator 会自动恢复权限。

考试陷阱

陷阱 说明
remove-cluster-role-from-user 代替 from-group 默认所有认证用户都在 system:authenticated:oauth 组中,必须从组移除
忘记 autoupdate=false OAuth Operator 会定期恢复 self-provisioner 权限
oc delete user 代替权限回收 删除用户不等于回收权限

练习 3:项目级权限管理

考试目标

在特定项目(命名空间)中为用户或组分配角色权限。

原理讲解

项目级权限限定在单个命名空间内,通过 RoleBindingClusterRole(或 Role)绑定到用户/组/ServiceAccount。

核心命令

# 授予项目级 admin(完全控制项目)
oc policy add-role-to-user admin armstrong -n apollo
oc policy add-role-to-user admin armstrong -n gemini

# 授予组权限
oc policy add-role-to-group edit commander -n apollo
oc policy add-role-to-group view pilot -n apollo

# 授予用户 view
oc policy add-role-to-user view wozniak -n titan

# 等同完整命令:
oc adm policy add-role-to-user admin developer -n my-project

# 回收权限
oc adm policy remove-role-to-user admin developer -n my-project

# 查看项目内所有 RoleBinding
oc get rolebinding -n my-project

内置角色对比

角色 权限级别 可管理权限? 可删除资源?
admin 项目管理员
edit 读写
view 只读

📌 原版命令差异

项目 原版练习 我们的手册
命令简写 oc policy add-role-to-user oc adm policy add-role-to-user
批量操作 多项目循环 for PROJECT in ...; do oc new-project ...; done 单项目操作

⚠️ oc policyoc adm policy add-role-to-user 的简写,考试中两种都常见。


练习 4:用户组管理

考试目标

创建用户组(Group),向组中添加或移除用户,实现批量权限管理。

核心命令

# 创建组
oc adm groups new commander
oc adm groups new pilot

# 向组中添加用户
oc adm groups add-users commander armstrong
oc adm groups add-users pilot aldrin collins

# 从组中移除用户
oc adm groups remove-users pilot collins

# 查看组
oc get groups
oc describe group commander

# 组绑定权限
oc policy add-role-to-group edit commander -n apollo

# 删除组
oc delete group pilot

📌 原版命令差异

无差异,命令格式一致。


练习 5:资源配额与限制

考试目标

在项目中配置 ResourceQuota(项目级资源总量限制)和 LimitRange(容器级资源默认值与上下限)。

原理讲解

ResourceQuota 控制命名空间内资源的总量上限。

LimitRange 控制单个容器的资源范围,并为未指定资源的容器注入默认值。

ResourceQuota 命令

# 原版考试命令(包含 replicationcontrollers)
oc create quota ex280-quota \
  --hard=cpu=2,memory=1Gi,pods=3,replicationcontrollers=3,services=6

# 查看配额
oc describe quota ex280-quota

LimitRange YAML

apiVersion: v1
kind: LimitRange
metadata:
  name: ex280-limits
  namespace: bluebook
spec:
  limits:
  - type: Container
    default:
      cpu: 500m
      memory: 512Mi
    defaultRequest:
      cpu: 200m
      memory: 256Mi
    max:
      cpu: "1"
      memory: 1Gi
    min:
      cpu: 100m
      memory: 128Mi
oc apply -f ex280-limits.yaml
oc get limitranges ex280-limits

📌 原版命令差异

项目 原版练习 我们的手册
配额参数 replicationcontrollers=3 未包含
LimitRange oc apply -f xxx.yaml 一致

⚠️ replicationcontrollers 是 OpenShift 特有的配额类型(对应 DeploymentConfig),原生 K8s 没有,但考试可能考到。


练习 6:手动扩容

考试目标

使用 oc scale 命令手动调整 Deployment 的副本数量。

核心命令

# 扩容
oc scale deployment/minion --replicas 5
oc scale deployment/landing --replicas 3

# 查看
oc get pods -w

📌 原版命令差异

无差异,命令格式一致。


练习 7:HPA 自动扩缩容

考试目标

配置 HPA(Horizontal Pod Autoscaler),根据 CPU 使用率自动调整 Pod 副本数。

核心命令

# 先给 Deployment 设置资源 requests(必须!)
oc edit deployment hydra
# 修改 resources 字段

# 创建 HPA
oc autoscale deployment/hydra --max 9 --min 6 --cpu-percent 60

# 查看
oc get hpa

📌 原版命令差异

项目 原版练习 我们的手册
参数 --min 6 --max 9 --cpu-percent 60 --min 1 --max 5 --cpu-percent 50
设资源方式 oc edit deployment oc set resources

💡 参数不同但命令格式一致,考试时根据题目要求调整数值。


练习 8:HTTPS Route(TLS 路由)

考试目标

创建支持 HTTPS 的 Route,配置 TLS 证书实现加密访问。

原理讲解

Route 是 OpenShift 内置的 HTTP 路由,支持三种 TLS 终止模式:

模式 加密链路 场景
edge 客户端 → LB(TLS 终止)→ Pod(HTTP) 最常用
passthrough 客户端 → LB(不解析)→ Pod(TLS) 自管理证书
reencrypt 客户端 → LB(TLS 终止,重新加密)→ Pod(TLS) 双向加密

核心命令

# Step 1: 使用 newcert 脚本生成 CA 签名证书(考试环境专用)
newcert
# 输入 Subject: /C=US/ST=NV/L=Hiko/O=CIA/OU=USAF/CN=classified.apps.ocp4.example.com

# Step 2: 创建 edge Route
oc create route edge --service oxcart \
  --hostname classified.apps.ocp4.example.com \
  --key classified.apps.ocp4.example.com.key \
  --cert classified.apps.ocp4.example.com.crt

📌 原版命令差异

项目 原版练习 我们的手册
证书生成 newcert 脚本(CA 签名) openssl 自签
证书 CN classified.apps.ocp4.example.com secure.apps.example.com

⚠️ newcert 是考试环境预装的证书生成脚本,自动完成 CSR 生成和 CA 签名。学习环境中可用 openssl 替代。

考试陷阱

陷阱 说明
混淆三种 TLS 终止模式 edge 最常用,考试默认选它
证书格式错误 必须是 PEM 格式
忘记指定 --hostname Route 会自动生成随机域名

练习 9:Helm 部署应用

考试目标

使用 Helm 包管理器从 Chart 仓库部署应用到 OpenShift 集群。

核心命令

# 添加仓库(原版用内网仓库)
helm repo add ex280-repo http://workstation.lab.example.com/charts/
helm repo update

# 搜索
helm search repo --versions

# 安装
helm install etherpad ex280-repo/etherpad

# 查看
helm repo list

📌 原版命令差异

项目 原版练习 我们的手册
仓库地址 内网 http://workstation.lab.example.com/charts/ 公网 https://charts.bitnami.com
Chart 名 etherpad nginx

💡 命令格式完全一致,考试时根据题目指定的仓库和 Chart 名操作。


练习 10:创建 Secret

考试目标

创建 Secret 对象存储敏感数据(密码、证书、Token)。

核心命令

# 从字面量创建
oc create secret generic magic \
  --from-literal decoder_ring="XpWy9KdcP3Tr9FFHGQgZgVRCKukQdrQsbcl0c2ZYhDk="

# 从文件创建(HTPasswd 场景)
oc create secret generic ex280-idp-secret \
  --from-file htpasswd=./htpasswd \
  -n openshift-config

# 查看
oc get secrets
oc get secret -n openshift-config | grep ex280

📌 原版命令差异

项目 原版练习 我们的手册
参数格式 --from-literal key=value(无空格) --from-literal=KEY=value

💡 两种写法都正确:--from-literal key=val--from-literal=key=val


练习 11:应用引用 Secret(环境变量)

考试目标

将 Secret 中的数据作为环境变量注入到 Pod 中。

核心命令

# 从 Secret 注入为环境变量
oc set env deployment/qed --from=secret/magic

# 查看
oc set env deployment/qed --list

📌 原版命令差异

无差异,命令格式一致。


练习 12:ServiceAccount 与 SCC

考试目标

创建 ServiceAccount 并分配给 Pod,通过 SCC(安全上下文约束)控制容器的权限级别。

核心命令

# 创建 ServiceAccount
oc create serviceaccount ex280sa

# 给 SA 授予 anyuid SCC
oc adm policy add-scc-to-user anyuid -z ex280sa

# 让 Deployment 使用指定 SA
oc set serviceaccount deployment/oranges ex280sa

# 也可以给 CronJob 绑定 SA
oc set serviceaccount cronjob.batch/job-runner magna

📌 原版命令差异

项目 原版练习 我们的手册
CronJob 绑 SA oc set serviceaccount cronjob.batch/job-runner magna 未包含

💡 CronJob 的 SA 绑定格式是 cronjob.batch/<name>,考试可能考到。


练习 13:排查部署故障

考试目标

诊断并修复 Deployment 的部署失败问题。

原理讲解

部署故障排查的核心思路:

Pod 异常 → oc get pods → oc describe pod → oc logs → 修复

场景 A:CrashLoopBackOff(原版考试场景)

# 1. 查看状态
oc get all
# Pod 处于 CrashLoopBackOff 状态

# 2. 查看日志
oc logs <pod-name>

# 3. describe 查看详情
oc describe pod <pod-name>

# 4. 根据日志修复(可能是镜像问题、命令错误、配置缺失等)

场景 B:ServiceAccount 不存在

# 1. 查看 Deployment 状态
oc get deployment broken-app
# READY: 0/2

# 2. describe ReplicaSet 看错误
oc describe rs <replicaset-name>
# Events: serviceaccount "xxx" not found

# 3. 修复:改回 default SA
oc set serviceaccount deployment/broken-app default

📌 原版命令差异

项目 原版练习 我们的手册(旧版)
故障类型 CrashLoopBackOff ReplicaFailure(SA 不存在)

💡 考试两种场景都可能出现,建议都掌握。

常见故障速查

状态 原因 排查命令
Pending 资源不足 oc describe pod
ImagePullBackOff 镜像拉取失败 oc describe pod
CrashLoopBackOff 容器启动后崩溃 oc logs <pod>
CreateContainerConfigError SA/Secret 不存在 oc describe rs

练习 14:排查资源不足问题

考试目标

诊断因资源请求超出集群容量导致的 Pod Pending 问题,并修复。

核心命令

# 1. 查看 Pod 状态
oc get all
# Pod 处于 Pending 状态

# 2. describe 看原因
oc describe pod <pod>
# Events: Insufficient cpu, Insufficient memory

# 3. 修复:降低资源请求
oc edit deployment <name>
# 修改 resources.requests

# 4. 验证
oc get pods

📌 原版命令差异

无差异,场景一致。


练习 15:NetworkPolicy 网络策略

考试目标

创建 NetworkPolicy 实现 Pod 间的网络隔离。

原版考试场景

考试中通常是 已有 deny-all 策略,需要创建 放行规则

# 1. 查看现有策略
oc get networkpolicies.networking.k8s.io
# NAME          POD-SELECTOR   AGE
# db-deny-all   <none>         4h25m

# 2. 创建放行规则 YAML
vim db-allow-conn.yaml

# 3. 应用
oc apply -f db-allow-conn.yaml

放行规则 YAML 示例

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: db-allow-conn
  namespace: database
spec:
  podSelector:
    matchLabels:
      app: database
  ingress:
  - from:
    - namespaceSelector:
        matchLabels:
          name: allowed-ns
    ports:
    - protocol: TCP
      port: 3306
  policyTypes:
  - Ingress

📌 原版命令差异

项目 原版练习 我们的手册(旧版)
场景 已有 deny-all,创建放行规则 从零创建 deny-all + 放行

⚠️ 考试更可能是 “已有 deny-all,需要放行特定流量”,而不是从零创建。


练习 16:项目模板

考试目标

创建项目模板,使每个新建项目自动包含 LimitRange、ResourceQuota 等资源。

核心命令

# Step 1: 用 OpenShift 专用命令生成模板
oc adm create-bootstrap-project-template -o yaml > project-template.yaml

# Step 2: 编辑模板(添加 LimitRange 等资源定义)
vim project-template.yaml

# Step 3: 保存到 openshift-config 命名空间
oc create -f project-template.yaml -n openshift-config

# Step 4: 引用模板(关键!编辑 projects 不是 schedulers!)
oc edit projects.config.openshift.io cluster
# 在 spec 中添加:
#   projectRequestTemplate:
#     name: <template-name>

# 查看模板
oc get template -n openshift-config

📌 原版命令差异

项目 原版练习 我们的手册(旧版)
创建模板 oc adm create-bootstrap-project-template oc create configmap
资源类型 Template(OpenShift 特有) ConfigMap ❌
引用配置 oc edit projects.config.openshift.io cluster oc edit schedulers...

🔴 重大差异! 考试必须用 OpenShift 原生的 Template 资源和 projects.config.openshift.io 配置,不能用 K8s 的 ConfigMap 方式。

考试陷阱

陷阱 说明
用 ConfigMap 代替 Template 考试要求用 oc adm create-bootstrap-project-template
编辑 schedulers 而不是 projects 正确路径是 projects.config.openshift.io cluster
模板中资源指定了 namespace 模板资源不需要指定 namespace

练习 17:安装 Operator

考试目标

通过 OperatorHub 安装 Operator 并验证其功能。

核心步骤(Web Console)

  1. 进入 OperatorHub
  2. 搜索目标 Operator
  3. 选择 ChannelNamespace
  4. 点击 Install
  5. 等待 CSV 状态变为 Succeeded
  6. 创建 自定义资源(CR)

命令行查看

oc get csv -A
oc get subscriptions -A
oc get all -n openshift-file-integrity

📌 原版命令差异

无差异,都是 Web Console 操作。


练习 18:CronJob

考试目标

创建 CronJob 实现定时任务执行。

核心命令

# 创建 CronJob
oc create cronjob job-runner \
  --image=registry.ocp4.example.com:8443/ubi8/ubi:8.4 \
  --schedule="05 04 02 * *"

# 给 CronJob 绑定 ServiceAccount
oc set serviceaccount cronjob.batch/job-runner magna

# 修改成功 Job 保留数量
oc patch cronjobs job-runner -p '{"spec":{"successfulJobsHistoryLimit": 14}}'

# 查看
oc get cronjobs.batch

Cron 表达式

┌───────────── 分 (0-59)
│ ┌─────────── 时 (0-23)
│ │ ┌───────── 日 (1-31)
│ │ │ ┌─────── 月 (1-12)
│ │ │ │ ┌───── 周 (0-7, 0和7=周日)
│ │ │ │ │
05 04 02 * *   = 每月2号 04:05
*/5 * * * *    = 每5分钟

📌 原版命令差异

项目 原版练习 我们的手册(旧版)
绑定 SA oc set serviceaccount cronjob.batch/... 未包含
history limit oc patch cronjobs ... successfulJobsHistoryLimit: 14 未包含

⚠️ CronJob 的 SA 绑定和 history limit 是常见考点,必须掌握。


练习 19:must-gather 集群诊断

考试目标

使用 oc adm must-gather 收集集群诊断信息并打包。

核心命令

# Step 1: 收集集群信息
oc adm must-gather

# Step 2: 获取集群 ID
clusterID=$(oc get clusterversions.config.openshift.io -o yaml | grep clusterID | awk '{print $NF}')

# Step 3: 用 clusterID 命名打包
tar cvaf ex280-ocp-${clusterID}.tar.gz must-gather.local.*

# Step 4: 上传(考试环境)
/usr/local/bin/upload-cluster-data ex280-ocp-${clusterID}.tar.gz

📌 原版命令差异

项目 原版练习 我们的手册(旧版)
文件名 ex280-ocp-${clusterID}.tar.gz must-gather.tar.gz
clusterID oc get clusterversions... 提取 未包含
上传 /usr/local/bin/upload-cluster-data 未包含

⚠️ 考试要求用 clusterID 命名打包文件,这是评分点。


练习 20:PV 与 PVC 存储管理

考试目标

创建 PersistentVolume(PV)和 PersistentVolumeClaim(PVC),将存储挂载到 Pod。

核心命令

# 查看存储信息
oc get storageclass nfs-storage -o jsonpath='{.parameters}' | jq .

# 使用 oc set volumes 挂载 PVC(考试完整参数)
oc set volumes deployment/landing \
  --add --name web-volume \
  --type pvc \
  --claim-class nfs-storage \
  --claim-mode ReadOnlyMany \
  --claim-size 1Gi \
  --claim-name landing-pvc \
  -m /var/www/html/

# 也可以先手动创建 PV 和 PVC
oc apply -f nfs-pv.yaml
oc get pv
oc get pvc

PV YAML(原版)

apiVersion: v1
kind: PersistentVolume
metadata:
  name: landing-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
  - ReadOnlyMany
  storageClassName: nfs-storage
  persistentVolumeReclaimPolicy: Delete
  nfs:
    path: /exports-ocp4
    server: nfs.ocp4.example.com

📌 原版命令差异

项目 原版练习 我们的手册(旧版)
oc set volumes --claim-class/mode/name 缺少这些参数
存储类型 NFS(ReadOnlyMany local-path(ReadWriteOnce
PV 类型 nfs: hostPath:

⚠️ --claim-class(指定 StorageClass)、--claim-mode(访问模式)、--claim-name(PVC 名称)都是考试常见参数。


练习 21:健康探针

考试目标

为容器配置 Liveness、Readiness 和 Startup 探针。

核心命令

# 原版考试命令(含完整参数)
oc set probe deployment/atlas \
  --liveness --open-tcp=8080 \
  --initial-delay-seconds=10 \
  --timeout-seconds=30

# 查看
oc describe pod <pod>
oc get pods -w

📌 原版命令差异

项目 原版练习 我们的手册(旧版)
参数 --initial-delay-seconds=10 --timeout-seconds=30 只有 --open-tcp

⚠️ --initial-delay-seconds(初始延迟)和 --timeout-seconds(超时)是考试常见参数。


考试技巧总结

万能排查公式

异常 → oc describe pod <pod>     (看 Events,最关键!)
     → oc logs <pod>              (看应用日志)
     → oc get events --sort-by=.lastTimestamp (看最近事件)
     → oc describe deployment <name> (看 ReplicaSet 状态)

高频命令速查

# 登录
oc login -u admin -p redhatocp https://api.ocp4.example.com:6443

# 切换项目
oc project <project-name>

# 权限管理
oc policy add-role-to-user <role> <user> -n <ns>        # 简写
oc adm policy add-role-to-user <role> <user> -n <ns>     # 完整
oc adm policy add-cluster-role-to-user <role> <user>
oc adm policy add-scc-to-user anyuid -z <sa>
oc auth can-i <verb> <resource>

# 调试
oc get all / oc describe pod / oc logs / oc rsh / oc exec
oc adm must-gather

命令速记对照

简写 完整命令
oc policy add-role-to-user oc adm policy add-role-to-user
oc project oc config set-context --current --namespace


考试实操指南(OpenShift 特有功能)

⚠️ 以下 5 个功能是 OpenShift 独有的,我们的 K8s 实验环境无法完整模拟。本章提供考试环境中的完整操作步骤,确保你在真实考场上不会卡壳。


考试 #4:用户组管理(完整步骤)

考试环境中 oc adm groups 命令直接可用。

考试场景: 创建 commanderpilot 组,将用户加入组,然后给组分配项目权限。

# Step 1: 登录
oc login -u admin -p redhatocp https://api.ocp4.example.com:6443

# Step 2: 创建组
oc adm groups new commander
oc adm groups new pilot

# Step 3: 向组中添加用户
oc adm groups add-users commander armstrong
oc adm groups add-users pilot aldrin
oc adm groups add-users pilot collins

# Step 4: 给组分配项目权限
oc policy add-role-to-group edit commander -n apollo
oc policy add-role-to-group view pilot -n apollo

# Step 5: 验证
oc get groups
oc describe group commander

考试验证:

# 用组内用户登录,确认权限生效
oc login -u armstrong -p indionce
oc auth can-i get pods -n apollo   # → yes(edit 权限)
oc auth can-i delete pods -n apollo # → yes

考试 #7:HPA 自动扩缩容(考试版)

考试场景: 给 Deployment 设置资源,然后创建 HPA。

# Step 1: 切换项目
oc project lerna

# Step 2: 查看现有 Deployment
oc get deployment
# NAME    READY   UP-TO-DATE   AVAILABLE   AGE
# hydra   1/1     1            1           12h

# Step 3: 编辑 Deployment,添加 resources(必须!)
oc edit deployment hydra
# 在 container 下添加:
#   resources:
#     requests:
#       cpu: 100m
#       memory: 128Mi

# Step 4: 创建 HPA
oc autoscale deployment/hydra --max 9 --min 6 --cpu-percent 60

# Step 5: 验证
oc get hpa
# NAME    REFERENCE          TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
# hydra   Deployment/hydra   <unknown>/60% 6         9         1          10s

# Step 6: 等 metrics 就绪后再检查
oc get hpa
# TARGETS 应显示类似: 2%/60%

考试陷阱:

  • 不设 resources.requests → HPA 报错 FailedGetResourceMetric
  • --min 设太小 → 可能不符合题目要求

考试 #8:HTTPS Route(完整步骤)

考试场景:newcert 脚本生成 CA 签名证书,然后创建 edge Route。

# Step 1: 切换项目
oc project area51

# Step 2: 使用 newcert 生成证书
newcert
# 根据题目输入 Subject 字段:
# Country Name (2 letter code) [XX]: US
# State or Province Name (full name) []: NV
# Locality Name (eg, city) []: Hiko
# Organization Name (eg, company) []: CIA
# Organizational Unit Name (eg, section) []: USAF
# Common Name (eg, your name or your server's hostname) []: classified.apps.ocp4.example.com
# Email Address []: (回车跳过)

# newcert 会生成以下文件:
# classified.apps.ocp4.example.com.crt   (证书)
# classified.apps.ocp4.example.com.key   (私钥)
# classified.apps.ocp4.example.com.csr   (CSR,不需要)

# Step 3: 创建 edge Route
oc create route edge --service oxcart \
  --hostname classified.apps.ocp4.example.com \
  --key classified.apps.ocp4.example.com.key \
  --cert classified.apps.ocp4.example.com.crt

# Step 4: 验证
oc get route
# NAME      HOST/CLASS   PATH   SERVICES   PORT   TERMINATION   WILDCARD
# oxcart    classified.apps.ocp4.example.com   oxcart   8080      edge           None

# Step 5: 测试 HTTPS 访问
curl -k https://classified.apps.ocp4.example.com

如果 newcert 不可用,用 openssl 手动生成:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout classified.apps.ocp4.example.com.key \
  -out classified.apps.ocp4.example.com.crt \
  -subj "/C=US/ST=NV/L=Hiko/O=CIA/OU=USAF/CN=classified.apps.ocp4.example.com"

考试陷阱:

  • 证书 CN 必须与 --hostname 一致
  • --key--cert 的文件名要对应
  • 考试可能要求删除旧 Route 再创建新的

考试 #16:项目模板(完整步骤)

考试场景: 创建一个项目模板(含 LimitRange),让每个新建项目自动应用该模板。

# Step 1: 用 OpenShift 专用命令生成模板
oc adm create-bootstrap-project-template -o yaml > project-template.yaml

# Step 2: 编辑模板,添加 LimitRange
vim project-template.yaml

模板 YAML 示例(编辑后):

apiVersion: template.openshift.io/v1
kind: Template
metadata:
  name: project-request
  namespace: openshift-config
objects:
- apiVersion: v1
  kind: LimitRange
  metadata:
    name: resource-limits
    namespace: ${PROJECT_NAME}
  spec:
    limits:
    - type: Container
      default:
        cpu: 500m
        memory: 512Mi
      defaultRequest:
        cpu: 200m
        memory: 256Mi
parameters:
- name: PROJECT_NAME
# Step 3: 保存模板到 openshift-config 命名空间
oc create -f project-template.yaml -n openshift-config

# Step 4: 引用模板(关键!编辑 projects 资源,不是 schedulers!)
oc edit projects.config.openshift.io cluster

spec 中添加:

spec:
  projectRequestTemplate:
    name: project-request
# Step 5: 验证
oc get template -n openshift-config
# NAME              READY   STATUS   AGE
# project-request   True             5m

# Step 6: 创建新项目测试
oc new-project test-template
oc get limitrange -n test-template
# NAME             CREATED AT
# resource-limits  2026-04-18T...

考试陷阱:

  • ConfigMap 代替 Template错误,必须用 Template
  • 编辑 schedulers.config.openshift.io错误,应该编辑 projects.config.openshift.io
  • 模板中的资源指定了 namespace → 应用 ${PROJECT_NAME} 变量

考试 #19:must-gather(完整步骤)

考试场景: 收集集群诊断信息,用 clusterID 命名打包,上传到指定位置。

# Step 1: 收集集群信息(可能需要几分钟)
oc adm must-gather

# 收集完成后会在当前目录生成 must-gather.local.<随机数>/ 目录

# Step 2: 获取集群 ID
clusterID=$(oc get clusterversions.config.openshift.io -o yaml | grep clusterID | awk '{print $NF}')
echo $clusterID
# 例: d4e5f6a7-b8c9-0123-def4-567890abcdef

# Step 3: 用 clusterID 命名打包
tar cvaf ex280-ocp-${clusterID}.tar.gz must-gather.local.*

# Step 4: 验证打包文件
ls -lh ex280-ocp-*.tar.gz

# Step 5: 上传(考试环境专用命令)
/usr/local/bin/upload-cluster-data ex280-ocp-${clusterID}.tar.gz

考试陷阱:

  • 忘记用 clusterID 命名 → 可能扣分
  • 打包路径不对 → 在 must-gather.local.*/上一级执行 tar
  • oc adm must-gather 卡住 → 等待,不要 Ctrl+C,可能需要 3-5 分钟

考试环境特殊工具

考试环境中预装了以下工具,学习环境没有:

工具 用途 替代方案
newcert 生成 CA 签名证书 openssl req -x509
oc adm create-bootstrap-project-template 生成项目模板 手写 Template YAML
oc adm must-gather 收集集群诊断 K8s 上无等价命令
/usr/local/bin/upload-cluster-data 上传诊断数据 N/A(考试专用)
oc adm groups 用户组管理 K8s 上无等价命令

考试环境信息

考试中通常会提供:

信息 示例值
API 地址 https://api.ocp4.example.com:6443
Web Console https://console-openshift-console.apps.ocp4.example.com
管理员账号 admin / redhatocp
普通用户 由题目指定(如 armstrong/indionce
内部 Registry registry.ocp4.example.com:8443
Helm 仓库 http://workstation.lab.example.com/charts/

祝考试顺利! 🎉

本手册基于 OKD 4.21 / Kubernetes 1.31 实验环境编写,对照 DO280v4.14 原版练习题校验,适用于 EX280(OpenShift 管理)考试备考。