第四阶段 — 拆除
第四阶段按照逆依赖顺序移除演练期间创建的所有对象。本阶段在执行任何破坏性操作之前,需要人工明确确认。
按逆创建顺序移除对象 — 先删除依赖其他对象的对象:
- 已缓解域名 — 删除第三阶段创建的所有 CSD 已缓解域名
- HTTPS 负载均衡器 (
${F5XC_LB_NAME}-https) — 精简为骨架状态(保留 Let’s Encrypt 证书);若NAMESPACE_CREATED=true或有明确请求,则执行完整删除 - HTTP 负载均衡器 (
${F5XC_LB_NAME}-http) — 依赖源池 - 源池 — 依赖健康检查(如已创建)
- DNS 区域清理 — HTTPS LB 骨架保留其托管的 A 记录和 ACME 记录(这是预期行为 — 可保持证书有效)。HTTP LB 的托管记录在删除时自动清理。
default_rr_set_group中的手动记录需通过PUT手动清理 - 健康检查 — 仅在第一阶段步骤一中创建时执行
- 受保护域名 — 删除 CSD 受保护域名注册
- 命名空间 — 仅在第一阶段步骤零期间创建时执行(
NAMESPACE_CREATED=true)
删除已缓解域名
Section titled “删除已缓解域名”如果第三阶段已执行,请在移除基础设施对象之前删除所有已缓解域名。标准模拟创建 6 个已缓解域名:
for domain in cdn.jsdelivr.net esm.sh unpkg.com ga.jspm.io httpbin.org jsonplaceholder.typicode.com; do curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains/$domain"done验证:列出已缓解域名,确认数量为 0(或 1 — 请参阅以下说明):
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \ | jq '{count: (.items | length)}'HTTPS 负载均衡器
Section titled “HTTPS 负载均衡器”HTTPS LB 的拆除行为取决于命名空间是否在本次演示会话期间创建(来自第一阶段步骤零的 NAMESPACE_CREATED 变量):
NAMESPACE_CREATED=false(预先存在的命名空间)— 精简为骨架状态,保留 Let’s Encrypt 证书以供复用NAMESPACE_CREATED=true(演示期间创建的命名空间)— 完整删除,因为命名空间本身将被删除,证书无法保留
路径 A:精简为骨架(预先存在的命名空间)
Section titled “路径 A:精简为骨架(预先存在的命名空间)”当命名空间为预先存在时,将 HTTPS LB 精简为骨架状态 — 移除源池引用和 CSD 配置,同时保留域名绑定、https_auto_cert 设置以及 Let’s Encrypt 证书。这可避免在下次演示运行时触发新的证书申请(Let’s Encrypt 对每个精确标识符集每 7 天最多颁发 5 张重复证书)。
步骤一 — 获取当前 HTTPS LB 配置:
HTTPS_LB_JSON=$(curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https")步骤二 — 通过 jq 精简为骨架并 PUT 回:
echo "$HTTPS_LB_JSON" | jq '{ metadata: .metadata, spec: (.spec | del(.client_side_defense) | .disable_client_side_defense = {} | .default_route_pools = [])}' | curl -s -X PUT \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d @- \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq .jq 过滤器保留完整的 spec(域名、https_auto_cert、advertise_on_public_default_vip 以及所有已禁用的功能标志),同时移除 client_side_defense(替换为 disable_client_side_defense: {})并将 default_route_pools 清空为空数组。证书和 DNS 绑定保持不变。
验证 HTTPS LB 现已处于骨架状态:
curl -s \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https" \ | jq '{ name: .metadata.name, domains: .spec.domains, has_origin_pools: ((.spec.default_route_pools // []) | length > 0), has_csd: (.spec.client_side_defense != null), cert_state: .spec.cert_state }'预期结果:has_origin_pools: false、has_csd: false、domains 仍有值、cert_state 不变(例如 CertificateValid)。
路径 B:完整删除(演示期间创建的命名空间)
Section titled “路径 B:完整删除(演示期间创建的命名空间)”当命名空间在本次演示会话期间创建时,必须完整删除 HTTPS LB — 骨架保留没有意义,因为命名空间本身将在拆除结束时被移除。
curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-https"验证:GET /api/config/namespaces/\{namespace\}/http_loadbalancers 中不应包含 ${F5XC_LB_NAME}-https。
删除 HTTP 负载均衡器
Section titled “删除 HTTP 负载均衡器”删除主 HTTP LB:
curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/http_loadbalancers/xF5XC_LB_NAMEx-http"验证:GET /api/config/namespaces/\{namespace\}/http_loadbalancers 中不应包含 ${F5XC_LB_NAME}-http。如果 DELETE 返回 200 后对象仍出现在列表中,请等待 30 秒后再检查一次。如果第二次检查后仍存在,请向操作员报告 — 不要继续操作。
curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/origin_pools/xF5XC_ORIGIN_POOLx"验证:GET /api/config/namespaces/\{namespace\}/origin_pools 中不应包含该池名称。如果 DELETE 返回 200 后对象仍出现在列表中,请等待 30 秒后再检查一次。如果第二次检查后仍存在,请向操作员报告。
删除健康检查
Section titled “删除健康检查”curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/config/namespaces/xF5XC_NAMESPACEx/healthchecks/xF5XC_HC_NAMEx"验证:GET /api/config/namespaces/\{namespace\}/healthchecks 中不应包含该健康检查名称。如果 DELETE 返回 200 后对象仍出现在列表中,请等待 30 秒后再检查一次。如果第二次检查后仍存在,请向操作员报告。
删除受保护域名
Section titled “删除受保护域名”删除 CSD 受保护域名注册。受保护域名的作用域为租户级别(非命名空间级别),但它是与本次部署绑定的 CSD 配置对象 — 并非 DNS 区域那样的共享基础设施。
curl -s -X DELETE \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains/xF5XC_ROOT_DOMAINx"验证:列出受保护域名,确认该域名不再注册:
curl -s -X GET \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains" \ | jq '.items // [] | map(.metadata.name)'删除命名空间(条件执行)
Section titled “删除命名空间(条件执行)”此步骤仅在命名空间于第一阶段步骤零期间创建时执行(NAMESPACE_CREATED=true)。如果命名空间为预先存在(NAMESPACE_CREATED=false),请完全跳过此步骤 — 命名空间是不得删除的共享基础设施。
if [ "$NAMESPACE_CREATED" = "true" ]; then curl -s -X POST \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ -H "Content-Type: application/json" \ -d '{"name": "xF5XC_NAMESPACEx"}' \ "xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx/cascade_delete" | jq .fi验证:确认命名空间不再存在:
curl -s -o /dev/null -w '%\{http_code\}' \ -H "Authorization: APIToken xF5XC_API_TOKENx" \ "xF5XC_API_URLx/api/web/namespaces/xF5XC_NAMESPACEx"预期结果:若 NAMESPACE_CREATED=true 则为 404,若 NAMESPACE_CREATED=false 则为 200。
第四阶段证据摘要
Section titled “第四阶段证据摘要”| 对象 | 删除状态 | 验证状态 |
|---|---|---|
| 已缓解域名(6 个) | 全部 200(空 \{\})或第三阶段未运行时跳过 | 数量为 0(或 1 个幽灵条目)— 通过 |
HTTPS 负载均衡器(-https) | 200(骨架 PUT)或 200(若 NAMESPACE_CREATED=true 则完整删除) | 骨架已验证或不在列表中 — 通过 |
HTTP 负载均衡器(-http) | 200(空 \{\}) | 不在列表中 — 通过 |
| 源池 | 200(空 \{\}) | 不在列表中 — 通过 |
| 健康检查 | 200(空 \{\})或跳过 | 不在列表中 — 通过 |
| 受保护域名 | 200(空 \{\}) | 不在列表中 — 通过 |
| DNS 区域 | 未删除(共享基础设施) | 区域仍存在 — 通过 |
| 命名空间 | 若 NAMESPACE_CREATED=true 则 200(级联删除),否则跳过 | 若已删除则 404,若已保留则 200 — 通过 |
拆除完成。 当命名空间为预先存在(NAMESPACE_CREATED=false)时,除 HTTPS LB 骨架外,所有部署对象均已移除,骨架保留了 Let’s Encrypt 证书和域名绑定,以供下次演示运行使用。当命名空间在演示期间创建(NAMESPACE_CREATED=true)时,包括 HTTPS LB 和命名空间在内的所有对象均已完整删除。在两种情况下,DNS 区域及其非托管记录均保持完整。