跳到內容

第四階段 — 拆除

第四階段依照反向相依順序,移除演練過程中所建立的所有物件。本階段在執行任何破壞性操作前,需要人工明確確認。

反向建立順序移除物件 — 先刪除相依於其他物件的物件:

  1. 已緩解網域 — 刪除第三階段所建立的所有 CSD 已緩解網域
  2. HTTPS 負載平衡器 (${F5XC_LB_NAME}-https) — 縮減為骨架狀態(保留 Let’s Encrypt 憑證);若 NAMESPACE_CREATED=true 或明確要求時,執行完整 DELETE
  3. HTTP 負載平衡器 (${F5XC_LB_NAME}-http) — 相依於來源集區
  4. 來源集區 — 相依於健康檢查(若已建立)
  5. DNS 區域清理 — HTTPS LB 骨架會保留其受管理的 A 記錄與 ACME 記錄(此為預期行為 — 可保持憑證有效)。HTTP LB 受管理的記錄會於刪除時自動清理。default_rr_set_group 中的手動記錄需透過 PUT 進行手動清理
  6. 健康檢查 — 僅限第一階段步驟 1 中已建立者
  7. 受保護網域 — 刪除 CSD 受保護網域登錄
  8. 命名空間 — 僅限第一階段步驟 0 期間所建立者(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 的拆除行為取決於命名空間是否於本次示範工作階段期間建立(來自第一階段步驟 0 的 NAMESPACE_CREATED 變數):

  • NAMESPACE_CREATED=false(預先存在的命名空間)— 縮減為骨架狀態,保留 Let’s Encrypt 憑證以供重複使用
  • NAMESPACE_CREATED=true(示範期間建立的命名空間)— 執行完整 DELETE,因為命名空間本身將被刪除,憑證無法保留

路徑 A:縮減為骨架(預先存在的命名空間)

Section titled “路徑 A:縮減為骨架(預先存在的命名空間)”

當命名空間為預先存在時,將 HTTPS LB 縮減為骨架狀態 — 移除來源集區參考與 CSD 設定,同時保留網域繫結、https_auto_cert 設定及 Let’s Encrypt 憑證。此舉可避免在下次示範執行時觸發新的憑證申請(Let’s Encrypt 對每個精確識別符集合在 7 天內強制執行最多 5 份重複憑證的限制)。

步驟 1 — 取得目前的 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")

步驟 2 — 透過 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 過濾器會保留完整規格(網域、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)'

此步驟在命名空間於第一階段步驟 0 期間建立(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 則完整 DELETE)骨架已驗證或不在清單中 — 通過
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 區域及其非受管理記錄均維持完整。