DO280 v4.14 综合练习手册 — OpenShift 管理实战指南
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:项目级权限管理
考试目标
在特定项目(命名空间)中为用户或组分配角色权限。
原理讲解
项目级权限限定在单个命名空间内,通过 RoleBinding 将 ClusterRole(或 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 policy是oc 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)
- 进入 OperatorHub
- 搜索目标 Operator
- 选择 Channel 和 Namespace
- 点击 Install
- 等待 CSV 状态变为 Succeeded
- 创建 自定义资源(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 命令直接可用。
考试场景: 创建 commander 和 pilot 组,将用户加入组,然后给组分配项目权限。
# 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 管理)考试备考。