介绍
Juniper Café 能正常响应请求,但最新菜单上 Oat Latte 的价格是 $35.00。健康的 Pod 仍可能提供错误的业务数据。你将恢复已获批准的秋季菜单,同时保留咖啡馆、早期版本以及独立的阅览室服务。
这是一个全新环境,拥有单独准备的发布历史,不使用上一个实验中的文件或进程。你应当已完成季节菜单实验:本课将复用其中的菜单格式、生成的 ConfigMap、Deployment 和下载检查,然后介绍修订版本的选择与恢复。35 分钟的时长是作者估计,并非对初学者实际计时所得。
恢复已获批准的修订版本
在这一步中,你将利用实际菜单和 Deployment 历史,选择并恢复已获批准的秋季版本。
打开 Café Menu,选择 Explore the menu,找到 Oat Latte。虽然网站和饮品详情页能正常加载,当前的 $35.00 价格却是错误的。切换到 Workspace,起始目录为 /home/labex/project/cafe-menu。
读取柜台团队批准的完整表格和季节标签。与上一个实验一样,价格是以分为单位的整数;350 表示 $3.50:
cat approved/menu.csv
id,name,price_cents,available
espresso,Espresso,250,true
oat-latte,Oat Latte,350,true
cold-brew,Cold Brew,390,false
maple-latte,Maple Latte,450,true
cat approved/season.txt
Autumn at Juniper
滚动更新成功意味着 Kubernetes 达到了所请求的 Pod 状态,并不代表每种饮品的价格都已得到验证。先检查健康的 Deployment,再列出其修订版本。rollout history 读取保留的 ReplicaSet;变更原因文本有助于识别每个已准备的发布版本:
kubectl get deployment cafe -n cafe-menu
kubectl rollout history deployment/cafe -n cafe-menu
历史中依次包含 everyday、autumn 和 misprint 修订版本。修订编号属于这个全新环境中的这个 Deployment;不要把某个编号当作通用的发布名称。
完整保存的版本也可供查看。比较之前的日常菜单与已获批准的秋季菜单:
cat versions/everyday/menu.json
cat versions/autumn/menu.json
日常版本的 Oat Latte 价格虽然正确,但它仍供应 Cold Brew,且不供应 Maple Latte。因此,随意恢复任一旧发布版本也是错误的。秋季版本与全部批准值以及季节标签一致。
检查修订版本 2,它是本环境中准备好的秋季修订版本。--revision=2 请求该版本的 Pod 模板详情:
kubectl rollout history deployment/cafe -n cafe-menu --revision=2
找到 menu 卷所引用的生成 ConfigMap。由于该 ConfigMap 仍然存在,这份保存的模板可以使用那个确切的旧配置启动新 Pod。
恢复该修订版本。rollout undo 将 Deployment 改为所选的早期 Pod 模板;--to-revision=2 明确选择已获批准的版本:
kubectl rollout undo deployment/cafe -n cafe-menu --to-revision=2
等待两个恢复后的副本就绪:
kubectl rollout status deployment/cafe -n cafe-menu --timeout=120s
deployment "cafe" successfully rolled out
切换到 Café Menu,选择 Our menu,必要时刷新。确认 Oat Latte 的价格为 $3.50,Maple Latte 可供应且价格为 $4.50,Cold Brew 不可供应。如果等待超时,使用上一实验教过的 kubectl get pods 和 kubectl describe deployment 排查流程;不要重置命名空间。

比较全部四张饮品卡片,包括不可供应的 Cold Brew。
一个重要限制:undo 恢复的是 Pod 模板,其中包括配置的名称。它不会恢复被就地编辑的 ConfigMap 中任意先前的内容。请保持每个已保留的生成配置不变。
使保存的发布配置与恢复结果一致
在这一步中,你将让保存的发布配置能够重现已经恢复的运行中应用。
返回 Workspace。线上回滚不会编辑本地文件。release 目录仍包含错误的候选版本;现在应用它会重新带回错误价格。替换之前先读取该文件:
cat release/menu.json
其中 Oat Latte 的价格仍为 3500 分。将已获批准的秋季菜单和 Deployment 定义复制到工作发布目录。每条 cp 只替换其指定的目标文件。保持原始版本目录不变:
cp versions/autumn/menu.json release/menu.json
cp versions/autumn/deployment.json release/deployment.json
Deployment 文件还包含已获批准的变更原因注解。现有的 kustomization.yaml 保留相同的生成器和命名空间。重新渲染发布配置:
kubectl kustomize release
生成的配置名称应与恢复后的秋季模板中的引用一致。由于菜单字节完全相同,因此无需创建新的数据版本。应用已调整一致的源文件:
kubectl apply -k release
kubectl rollout status deployment/cafe -n cafe-menu --timeout=120s
滚动更新完成后,应用仍使用已获批准的菜单。现在,再次 apply 会保留恢复结果,而不会撤销它。保留整个 release 目录:Deployment、菜单文件和生成器配置需要协同工作。如果复制时路径有误,pwd 和 ls versions/autumn 可以帮助定位提供的文件;重新执行这两条精确的复制命令,不要编辑保留的历史版本。
交付恢复后的菜单
在这一步中,你将通过真实的菜单下载完成交付,并确认不受影响的咖啡馆仍能正常使用。
切换到 Café Menu。在 Our menu 页面中,打开 Oat Latte 的 About this drink 链接,确认详情中的价格已改正为 $3.50,然后使用 Back to the menu 返回。打开 Visit us,确认地址和营业时间。使用 Download menu 下载实际的完整菜单。
切换到 Reference Menu,选择 Our menu。Willow Reading Room 必须仍显示日常菜单;修复 Juniper 不得改变这个独立服务。
返回 Workspace。使用第一个实验教过的 curl 选项保存实际下载文件:
curl --fail --silent --show-error http://127.0.0.1:8081/menu.csv -o menu-handover.csv
将它与批准表格比较:
diff -u approved/menu.csv menu-handover.csv
没有输出表示完整下载文件与批准内容一致。如果出现差异,请根据实际行内容,判断是恢复了错误版本,还是保存的源文件尚未同步。修正发布配置,等待滚动更新,然后重新下载;不要手动编辑收到的 CSV。
列出配置,确认旧版本仍然可用:
kubectl get configmaps -n cafe-menu
当运行中的咖啡馆、可复用的源文件和供员工使用的实际下载文件相互一致时,恢复才算完成。早期源文件版本和生成的配置对象仍保持完整。
总结
你区分了应用健康与菜单正确这两件事,利用完整的业务证据选择修订版本,并恢复了它所引用的保留配置。你还同步了本地发布配置,使后续 apply 能保留恢复结果,然后在不改变参考服务的情况下检查了真实页面和实际菜单下载。
独立挑战会改变咖啡馆、菜单关系和已批准的版本,使用的仍是相同的配置、滚动更新与交付方法。



