跳转到内容

第四阶段 — 拆除

第四阶段按照逆依赖顺序移除演练期间创建的所有对象。本阶段在执行任何破坏性操作之前,需要人工明确确认。

逆创建顺序移除对象 — 先删除依赖其他对象的对象:

  1. 已缓解域名 — 删除第三阶段创建的所有 CSD 已缓解域名
  2. HTTPS 负载均衡器 (${F5XC_LB_NAME}-https) — 精简为骨架状态(保留 Let’s Encrypt 证书);若 NAMESPACE_CREATED=true 或有明确请求,则执行完整删除
  3. HTTP 负载均衡器 (${F5XC_LB_NAME}-http) — 依赖源池
  4. 源池 — 依赖健康检查(如已创建)
  5. DNS 区域清理 — HTTPS LB 骨架保留其托管的 A 记录和 ACME 记录(这是预期行为 — 可保持证书有效)。HTTP LB 的托管记录在删除时自动清理。default_rr_set_group 中的手动记录需通过 PUT 手动清理
  6. 健康检查 — 仅在第一阶段步骤一中创建时执行
  7. 受保护域名 — 删除 CSD 受保护域名注册
  8. 命名空间 — 仅在第一阶段步骤零期间创建时执行(NAMESPACE_CREATED=true

如果第三阶段已执行,请在移除基础设施对象之前删除所有已缓解域名。标准模拟创建 6 个已缓解域名:

Terminal window
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 — 请参阅以下说明):

Terminal window
curl -s \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/mitigated_domains" \
| jq '{count: (.items | length)}'

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 配置:

Terminal window
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 回:

Terminal window
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_certadvertise_on_public_default_vip 以及所有已禁用的功能标志),同时移除 client_side_defense(替换为 disable_client_side_defense: {})并将 default_route_pools 清空为空数组。证书和 DNS 绑定保持不变。

验证 HTTPS LB 现已处于骨架状态:

Terminal window
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: falsehas_csd: falsedomains 仍有值、cert_state 不变(例如 CertificateValid)。

路径 B:完整删除(演示期间创建的命名空间)

Section titled “路径 B:完整删除(演示期间创建的命名空间)”

当命名空间在本次演示会话期间创建时,必须完整删除 HTTPS LB — 骨架保留没有意义,因为命名空间本身将在拆除结束时被移除。

Terminal window
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 LB:

Terminal window
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 秒后再检查一次。如果第二次检查后仍存在,请向操作员报告 — 不要继续操作。

Terminal window
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 秒后再检查一次。如果第二次检查后仍存在,请向操作员报告。

Terminal window
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 秒后再检查一次。如果第二次检查后仍存在,请向操作员报告。

删除 CSD 受保护域名注册。受保护域名的作用域为租户级别(非命名空间级别),但它是与本次部署绑定的 CSD 配置对象 — 并非 DNS 区域那样的共享基础设施。

Terminal window
curl -s -X DELETE \
-H "Authorization: APIToken xF5XC_API_TOKENx" \
"xF5XC_API_URLx/api/shape/csd/namespaces/xF5XC_NAMESPACEx/protected_domains/xF5XC_ROOT_DOMAINx"

验证:列出受保护域名,确认该域名不再注册:

Terminal window
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)'

此步骤在命名空间于第一阶段步骤零期间创建时执行(NAMESPACE_CREATED=true)。如果命名空间为预先存在(NAMESPACE_CREATED=false),请完全跳过此步骤 — 命名空间是不得删除的共享基础设施。

Terminal window
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

验证:确认命名空间不再存在:

Terminal window
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

对象删除状态验证状态
已缓解域名(6 个)全部 200(空 \{\})或第三阶段未运行时跳过数量为 0(或 1 个幽灵条目)— 通过
HTTPS 负载均衡器(-https200(骨架 PUT)或 200(若 NAMESPACE_CREATED=true 则完整删除)骨架已验证或不在列表中 — 通过
HTTP 负载均衡器(-http200(空 \{\}不在列表中 — 通过
源池200(空 \{\}不在列表中 — 通过
健康检查200(空 \{\})或跳过不在列表中 — 通过
受保护域名200(空 \{\}不在列表中 — 通过
DNS 区域未删除(共享基础设施)区域仍存在 — 通过
命名空间NAMESPACE_CREATED=true200(级联删除),否则跳过若已删除则 404,若已保留则 200 — 通过

拆除完成。 当命名空间为预先存在(NAMESPACE_CREATED=false)时,除 HTTPS LB 骨架外,所有部署对象均已移除,骨架保留了 Let’s Encrypt 证书和域名绑定,以供下次演示运行使用。当命名空间在演示期间创建(NAMESPACE_CREATED=true)时,包括 HTTPS LB 和命名空间在内的所有对象均已完整删除。在两种情况下,DNS 区域及其非托管记录均保持完整。