恢复已获批准的菜单

KubernetesBeginner
立即练习

介绍

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 能保留恢复结果,然后在不改变参考服务的情况下检查了真实页面和实际菜单下载。

独立挑战会改变咖啡馆、菜单关系和已批准的版本,使用的仍是相同的配置、滚动更新与交付方法。