譯者 | 李睿
審校 | 重樓
2024年12月11日, OpenAI公司提供的服務(wù)由于新部署的遙測(cè)服務(wù)出現(xiàn)問題而遭遇重大停機(jī)。此次事件影響了API、ChatGPT和Sora服務(wù),導(dǎo)致持續(xù)數(shù)小時(shí)的服務(wù)中斷。作為一家致力于提供準(zhǔn)確高效的人工智能解決方案的供應(yīng)商,OpenAI公司為此發(fā)布一份詳細(xì)的事后分析報(bào)告,公開地討論了出現(xiàn)問題的原因,以及他們?nèi)绾斡?jì)劃防止在未來發(fā)生類似事件。
本文將闡述此次事件的技術(shù)細(xì)節(jié),分析根本原因,并探討開發(fā)人員和管理分布式系統(tǒng)的組織可以從此次事件中吸取的關(guān)鍵教訓(xùn)。
事件時(shí)間線
以下是OpenAI公司在2024年12月11日發(fā)生停機(jī)事件的快照:
時(shí)間 (PST) | 事件 |
3:16PM | 開始對(duì)客戶產(chǎn)生輕微影響;觀察到服務(wù)降級(jí) |
3:27PM | 工程師開始重定向受影響集群的流量 |
3:40PM | 記錄的最大客戶影響;所有服務(wù)的重大中斷 |
4:36PM | 第一個(gè)Kubernetes集群開始恢復(fù) |
5:36PM | API服務(wù)開始大幅復(fù)蘇 |
5:45PM | 觀察到ChatGPT大幅恢復(fù) |
7:38PM | 所有集群中的所有服務(wù)均已經(jīng)完全恢復(fù) |
圖1 :OpenAI的停機(jī)事件時(shí)間線——服務(wù)降級(jí)到完全恢復(fù)
事件的根本原因分析
事件的根源在于美國(guó)太平洋標(biāo)準(zhǔn)時(shí)間(PST)12月11日下午3:12部署的一個(gè)新的遙測(cè)服務(wù),以提高Kubernetes控制平臺(tái)的可觀察性。然而,該服務(wù)意外地使多個(gè)集群的Kubernetes API服務(wù)器過載從而導(dǎo)致級(jí)聯(lián)故障。
詳細(xì)解析
(1)遙測(cè)服務(wù)部署
遙測(cè)服務(wù)旨在收集詳細(xì)的Kubernetes控制平臺(tái)指標(biāo),但其配置不當(dāng)觸發(fā)了跨數(shù)千個(gè)節(jié)點(diǎn)同時(shí)進(jìn)行的資源密集型Kubernetes API操作。
(2)控制平臺(tái)過載
負(fù)責(zé)集群管理的Kubernetes控制平臺(tái)不堪重負(fù)。雖然處理用戶請(qǐng)求的數(shù)據(jù)平臺(tái)仍保持部分功能,但它依賴于控制平臺(tái)進(jìn)行DNS解析。隨著緩存的DNS記錄過期,依賴實(shí)時(shí)DNS解析的服務(wù)開始出現(xiàn)故障。
(3)測(cè)試不足
該部署在測(cè)試環(huán)境中進(jìn)行了測(cè)試,但測(cè)試集群的規(guī)模并未模擬生產(chǎn)集群的規(guī)模。因此,在測(cè)試期間未檢測(cè)到API服務(wù)器負(fù)載問題。
如何緩解問題
當(dāng)事件發(fā)生時(shí),OpenAI的工程師很快確定了根本原因,但由于Kubernetes控制平臺(tái)超載,無(wú)法訪問API服務(wù)器,因此在實(shí)施修復(fù)時(shí)面臨一些挑戰(zhàn)。他們采取了多管齊下的辦法:
- 縮小集群規(guī)模:減少每個(gè)集群中的節(jié)點(diǎn)數(shù)量可以降低API服務(wù)器負(fù)載。
- 阻止網(wǎng)絡(luò)訪問Kubernetes管理API:阻止額外的API請(qǐng)求,允許服務(wù)器恢復(fù)。
- 擴(kuò)展Kubernetes API服務(wù)器:配置額外的資源有助于清除掛起的請(qǐng)求。
這些措施使工程師能夠重新獲得對(duì)控制平臺(tái)的訪問權(quán)限,并消除有問題的遙測(cè)服務(wù),從而恢復(fù)服務(wù)功能。
經(jīng)驗(yàn)教訓(xùn)
此次事件凸顯了在分布式系統(tǒng)中進(jìn)行健壯測(cè)試、監(jiān)控和故障安全機(jī)制的重要性。以下是OpenAI從停機(jī)事件吸取(并實(shí)施)的經(jīng)驗(yàn)和教訓(xùn):
1.穩(wěn)健的分階段推出
現(xiàn)在,所有基礎(chǔ)設(shè)施更改都將遵循分階段推出,并進(jìn)行持續(xù)監(jiān)控。這可以確保問題在擴(kuò)展到整個(gè)系統(tǒng)之前及早發(fā)現(xiàn)并緩解問題。
2.故障注入測(cè)試
通過模擬故障(例如,禁用控制平臺(tái)或推出糟糕的更改),OpenAI公司將驗(yàn)證他們的系統(tǒng)可以自動(dòng)恢復(fù)并在影響客戶之前檢測(cè)問題。
3.應(yīng)急控制平臺(tái)訪問
“緊急訪問”(break-glass)機(jī)制將確保工程師即使在高負(fù)載下也能訪問Kubernetes API服務(wù)器。
4.解耦控制與數(shù)據(jù)平臺(tái)
為了減少依賴,OpenAI公司將Kubernetes數(shù)據(jù)平臺(tái)(處理工作負(fù)載)與控制平臺(tái)(負(fù)責(zé)編排)解耦,確保關(guān)鍵服務(wù)即使在控制平臺(tái)中斷時(shí)也能繼續(xù)運(yùn)行。
5.更快的恢復(fù)機(jī)制
新的緩存和速率限制策略將改進(jìn)集群?jiǎn)?dòng)時(shí)間,確保在故障期間更快地恢復(fù)。
示例代碼:分階段推出示例
下面是一個(gè)使用Helm和Prometheus實(shí)現(xiàn)Kubernetes分階段推出的示例。
分階段推出的Helm部署:
Shell
# Deploy the telemetry service to 10% of clusters
helm upgrade --install telemetry-service ./telemetry-chart \
--set replicaCount=10 \
--set deploymentStrategy=phased-rollout
用于監(jiān)控API服務(wù)器負(fù)載的Prometheus查詢:
YAML
# PromQL Query to monitor Kubernetes API server load
sum(rate(apiserver_request_duration_seconds_sum[1m])) by (cluster) /
sum(rate(apiserver_request_duration_seconds_count[1m])) by (cluster)
這一查詢有助于跟蹤API服務(wù)器請(qǐng)求的響應(yīng)時(shí)間,確保及早發(fā)現(xiàn)負(fù)載峰值。
故障注入示例
使用混沌網(wǎng)格,OpenAI可以模擬網(wǎng)絡(luò)中斷。
Shell
# Inject fault into Kubernetes API server to simulate downtime
kubectl create -f api-server-fault.yaml
api-server-fault.yaml:
YAML
apiVersion: chaos-mesh.org/v1alpha1
kind: PodChaos
metadata:
name: api-server-fault
spec:
action: pod-kill
mode: one
selector:
namespaces:
- kube-system
labelSelectors:
app: kube-apiserver
這一配置旨在通過故意終止API服務(wù)器Pod來驗(yàn)證系統(tǒng)的恢復(fù)能力。
這次事件的重要意義
這一事件凸顯了設(shè)計(jì)彈性系統(tǒng)和采用嚴(yán)格測(cè)試方法的重要性,無(wú)論是在大規(guī)模管理分布式系統(tǒng),還是在工作負(fù)載實(shí)施Kubernetes。以下是值得借鑒的幾個(gè)要點(diǎn):
- 定期模擬故障:使用混沌工程工具(如 Chaos Mesh)在真實(shí)環(huán)境下測(cè)試系統(tǒng)的魯棒性。
- 多層級(jí)監(jiān)視:確保可觀察性堆棧同時(shí)跟蹤服務(wù)級(jí)別指標(biāo)和集群健康指標(biāo)。
- 解耦關(guān)鍵依賴關(guān)系:減少對(duì)單點(diǎn)故障的依賴,例如基于DNS的服務(wù)發(fā)現(xiàn)。
結(jié)論
雖然并沒有任何系統(tǒng)能夠免受故障影響,但像這樣的事件再次提醒我們,透明度、快速補(bǔ)救和持續(xù)學(xué)習(xí)至關(guān)重要。OpenAI公司主動(dòng)分享這一事后分析的方法,為其他組織提供了改善其運(yùn)營(yíng)實(shí)踐和可靠性的藍(lán)圖。
通過優(yōu)先考慮穩(wěn)健的分階段部署、故障注入測(cè)試和彈性系統(tǒng)設(shè)計(jì),OpenAI公司為如何處理和從大規(guī)模中斷中學(xué)習(xí)樹立了一個(gè)典范。
對(duì)于管理分布式系統(tǒng)的團(tuán)隊(duì)來說,這個(gè)事件是一個(gè)很好的案例借鑒,可以用來研究如何進(jìn)行風(fēng)險(xiǎn)管理和最大限度地減少核心業(yè)務(wù)流程的停機(jī)時(shí)間。
希望我們以此為契機(jī),共同構(gòu)建更好、更有彈性的系統(tǒng)。
原文標(biāo)題:How OpenAI’s Downtime Incident Teaches Us to Build More Resilient Systems,作者:Vasanthi Govindaraj