Cloudflare:如何使用HashiCorp Nomad

來源: Cloudflare
作者:Cloudflare
時(shí)間:2021-04-13
18829
在此博客文章中,我們將向您介紹在全球200多個(gè)邊緣城市中運(yùn)行的服務(wù)的可靠性模型。然后,我們將探討如何部署新的動(dòng)態(tài)任務(wù)調(diào)度系統(tǒng)HashiCorp Nomad,幫助我們改善每個(gè)數(shù)據(jù)中心的服務(wù)可用性,涵蓋了我們?nèi)绾尾渴餘omad以及克服的挑戰(zhàn)。最后,我們將向您展示我們目前如何使用Nomad以及將來如何計(jì)劃使用Nomad。

在此博客文章中,我們將向您介紹在全球200多個(gè)邊緣城市中運(yùn)行的服務(wù)的可靠性模型。然后,我們將探討如何部署新的動(dòng)態(tài)任務(wù)調(diào)度系統(tǒng)HashiCorp Nomad,幫助我們改善每個(gè)數(shù)據(jù)中心的服務(wù)可用性,涵蓋了我們?nèi)绾尾渴餘omad以及克服的挑戰(zhàn)。最后,我們將向您展示我們目前如何使用Nomad以及將來如何計(jì)劃使用Nomad。

每個(gè)數(shù)據(jù)中心中運(yùn)行的服務(wù)的可靠性模型

對(duì)于此博客文章,我們將區(qū)分每個(gè)數(shù)據(jù)中心中運(yùn)行的兩種不同類別的服務(wù):

  • 面向客戶的服務(wù):客戶使用的所有產(chǎn)品堆棧,例如緩存,WAF,DDoS保護(hù),速率限制,負(fù)載平衡等。

  • 管理服務(wù):操作數(shù)據(jù)中心所需的軟件,該軟件不在客戶流量的直接請(qǐng)求路徑中。

面向客戶的服務(wù)

我們面向客戶的服務(wù)的可靠性模型是在每個(gè)數(shù)據(jù)中心的所有計(jì)算機(jī)上運(yùn)行它們。這非常有效,因?yàn)樗试S通過添加更多計(jì)算機(jī)來動(dòng)態(tài)擴(kuò)展每個(gè)數(shù)據(jù)中心的容量。

多虧了我們?cè)诿颗_(tái)機(jī)器上運(yùn)行的動(dòng)態(tài)負(fù)載平衡系統(tǒng)Unimog,使擴(kuò)展變得特別容易。它的作用是根據(jù)當(dāng)前資源的使用情況不斷地重新平衡流量,并檢查服務(wù)的運(yùn)行狀況。這有助于為單個(gè)計(jì)算機(jī)故障提供彈性,并確保所有計(jì)算機(jī)上的資源使用率幾乎相同。

例如,這是我們一個(gè)數(shù)據(jù)中心一天中的CPU使用情況,其中每個(gè)時(shí)間序列代表一臺(tái)機(jī)器,不同的顏色代表不同代的硬件。Unimog使所有計(jì)算機(jī)處理流量并保持大致相同的CPU利用率。

管理服務(wù)

我們的一些大型數(shù)據(jù)中心擁有大量計(jì)算機(jī),但有時(shí)我們需要在每個(gè)位置僅可靠地運(yùn)行一個(gè)或幾個(gè)管理服務(wù)實(shí)例。

當(dāng)前有兩種方法可以做到這一點(diǎn),每種方法各有利弊:

  1. 將服務(wù)部署到數(shù)據(jù)中心中的所有計(jì)算機(jī):

    • 專業(yè)版:確保服務(wù)的可靠性

    • 缺點(diǎn):它不必要地使用了本可以用于服務(wù)客戶流量且不具有成本效益的資源

  2. 將服務(wù)部署到每個(gè)數(shù)據(jù)中心中的少數(shù)幾臺(tái)機(jī)器上:

    • 優(yōu)點(diǎn):更少浪費(fèi)資源,更具成本效益

    • 缺點(diǎn):當(dāng)少數(shù)機(jī)器意外故障時(shí),它冒著服務(wù)不可用的風(fēng)險(xiǎn)

第三種更可行的選擇是使用動(dòng)態(tài)任務(wù)調(diào)度,以便在確??煽啃缘耐瑫r(shí)僅使用適當(dāng)數(shù)量的資源。

需要更動(dòng)態(tài)的任務(wù)調(diào)度

對(duì)于我們希望在每個(gè)數(shù)據(jù)中心中運(yùn)行的管理服務(wù),必須在兩個(gè)次優(yōu)的可靠性模型選項(xiàng)之間進(jìn)行選擇,這并不理想。

確實(shí),其中一些服務(wù)即使不在請(qǐng)求路徑中,也需要繼續(xù)運(yùn)行數(shù)據(jù)中心。如果運(yùn)行這些服務(wù)的計(jì)算機(jī)不可用,在某些情況下,我們必須在恢復(fù)它們時(shí)臨時(shí)禁用數(shù)據(jù)中心。這樣做會(huì)自動(dòng)將用戶重新路由到下一個(gè)可用的數(shù)據(jù)中心,并且不會(huì)造成中斷。實(shí)際上,整個(gè)Cloudflare網(wǎng)絡(luò)都設(shè)計(jì)為在禁用數(shù)據(jù)中心并自動(dòng)恢復(fù)的狀態(tài)下運(yùn)行。但是最好將最終用戶路由到他們附近的數(shù)據(jù)中心,以便我們希望最大程度地減少任何數(shù)據(jù)中心級(jí)別的停機(jī)時(shí)間。

這使我們意識(shí)到,我們需要一個(gè)系統(tǒng)來確保每個(gè)數(shù)據(jù)中心中正在運(yùn)行一定數(shù)量的服務(wù)實(shí)例,而不管最終由哪個(gè)物理機(jī)運(yùn)行該服務(wù)。

面向客戶的服務(wù)在每個(gè)數(shù)據(jù)中心的所有計(jì)算機(jī)上運(yùn)行,并且不需要加入該新系統(tǒng)。另一方面,當(dāng)前在固定子集的機(jī)器上運(yùn)行的服務(wù)具有次優(yōu)的可靠性保證,不需要在所有機(jī)器上運(yùn)行的服務(wù)都是上線的理想選擇。

我們的選擇:HashiCorp Nomad

根據(jù)我們的一系列要求,我們對(duì)候選解決方案進(jìn)行了一些研究。

雖然Kubernetes是另一個(gè)選擇,但出于以下原因,我們決定使用HashiCorp的Nomad:

  • 滿足我們的最初要求,該要求是可靠地運(yùn)行每個(gè)數(shù)據(jù)中心中資源隔離的二進(jìn)制實(shí)例。

  • 幾乎沒有依賴關(guān)系,并且可以直接與Consul集成。Consul是我們已經(jīng)在每個(gè)數(shù)據(jù)中心中部署的另一套HashiCorp軟件。它提供了分布式鍵值存儲(chǔ)和服務(wù)發(fā)現(xiàn)功能。

  • 輕量級(jí)(單個(gè)Go二進(jìn)制文件),易于部署和配置新集群,這在部署與我們數(shù)據(jù)中心一樣多的集群時(shí)是一個(gè)加號(hào)。

  • 具有模塊化的任務(wù)驅(qū)動(dòng)程序(負(fù)責(zé)執(zhí)行任務(wù)和提供資源隔離的部分)體系結(jié)構(gòu),不僅支持容器,而且還支持二進(jìn)制文件和任何自定義任務(wù)驅(qū)動(dòng)程序。

  • 是開源的,用Go編寫。我們?cè)趫F(tuán)隊(duì)中擁有Go語言方面的經(jīng)驗(yàn),Nomad在GitHub上擁有一個(gè)響應(yīng)迅速的維護(hù)者社區(qū)。

部署架構(gòu)

游牧民族分為兩個(gè)不同的部分:

  1. Nomad Server:組成負(fù)責(zé)調(diào)度的群集的實(shí)例,每個(gè)數(shù)據(jù)中心五個(gè)實(shí)例以提供足夠的容錯(cuò)能力

  2. Nomad Client:執(zhí)行實(shí)際任務(wù)的實(shí)例,在每個(gè)數(shù)據(jù)中心的所有計(jì)算機(jī)上運(yùn)行

為了保證Nomad Server群集的可靠性,我們?cè)趯儆诓煌收嫌虻挠?jì)算機(jī)上部署了實(shí)例:

  • 在不同的相互連接的物理數(shù)據(jù)中心中形成一個(gè)位置

  • 在不同的機(jī)架中,連接到不同的交換機(jī)

  • 在不同的多節(jié)點(diǎn)機(jī)箱中(我們大多數(shù)的邊緣硬件以多節(jié)點(diǎn)機(jī)箱的形式出現(xiàn),一個(gè)機(jī)箱包含四個(gè)單獨(dú)的服務(wù)器)

我們還向配置管理工具中添加了邏輯,以確保無論每天發(fā)生的服務(wù)器擴(kuò)展和停用情況如何,我們始終保持一致數(shù)量的Nomad Server實(shí)例。

邏輯很簡單,隨著服務(wù)器的擴(kuò)展和停用,Nomad Server角色將重新分配到新的計(jì)算機(jī)列表中。然后,我們的配置管理工具可確保Nomad Server在新計(jì)算機(jī)上運(yùn)行,然后再關(guān)閉舊計(jì)算機(jī)。

此外,由于服務(wù)器的擴(kuò)展和退役會(huì)一次影響一部分機(jī)架,而Nomad Server角色分配邏輯可提供機(jī)架多樣性保證,因此群集始終保持仲裁狀態(tài),因此可以保持健康。

作業(yè)文件

Nomad作業(yè)文件被模板化并檢入git存儲(chǔ)庫。然后,我們的配置管理工具可確保在每個(gè)數(shù)據(jù)中心中安排作業(yè)。從那里開始,Nomad接管并確保作業(yè)始終在每個(gè)數(shù)據(jù)中心中運(yùn)行。

通過向每個(gè)Nomad Client公開機(jī)架元數(shù)據(jù),我們可以確保特定服務(wù)的每個(gè)實(shí)例在不同的機(jī)架中運(yùn)行并綁定到不同的故障域。這樣,我們可以確保一個(gè)服務(wù)器機(jī)架的故障不會(huì)影響服務(wù)運(yùn)行狀況,因?yàn)樵摲?wù)也在另一個(gè)機(jī)架中運(yùn)行,不受故障影響。

我們通過以下作業(yè)文件約束來實(shí)現(xiàn)這一目標(biāo):

constraint {
  attribute = "${meta.rack}"
  operator  = "distinct_property"}

服務(wù)發(fā)現(xiàn)

我們利用Nomad與Consul的集成來將Nomad作業(yè)動(dòng)態(tài)添加到Consul服務(wù)目錄中。這使我們可以通過查詢Consul來發(fā)現(xiàn)每個(gè)數(shù)據(jù)中心中當(dāng)前正在運(yùn)行特定服務(wù)的位置。此外,啟用Consul DNS接口后,我們還可以使用基于DNS的查找來定位Nomad上運(yùn)行的服務(wù)。

可觀察性

為了能夠正常運(yùn)行與我們數(shù)據(jù)中心一樣多的Nomad群集,對(duì)Nomad群集和在這些群集上運(yùn)行的服務(wù)的良好可觀察性至關(guān)重要。

我們使用Prometheus來抓取在每個(gè)數(shù)據(jù)中心中運(yùn)行的Nomad Server和Client實(shí)例,并使用Alertmanager來提醒關(guān)鍵指標(biāo)。使用Prometheus指標(biāo),我們構(gòu)建了Grafana儀表板以提供每個(gè)集群的可見性。

我們通過查詢領(lǐng)事服務(wù)目錄并使用以下Prometheus配置定期抓取其指標(biāo)來設(shè)置Prometheus實(shí)例以發(fā)現(xiàn)在Nomad上運(yùn)行的服務(wù):

- consul_sd_configs:
  - server: localhost:8500
  job_name: management_service_via_consul
  relabel_configs:
  - action: keep
    regex: management-service
    source_labels:
    - __meta_consul_service

然后,我們使用這些指標(biāo)來創(chuàng)建Grafana儀表板并為在Nomad上運(yùn)行的服務(wù)設(shè)置警報(bào)。

為了限制對(duì)Nomad API端點(diǎn)的訪問,我們啟用了雙向TLS身份驗(yàn)證,并正在為與Nomad進(jìn)行交互的每個(gè)實(shí)體生成客戶端證書。這樣,只有具有有效客戶端證書的實(shí)體才能與Nomad API端點(diǎn)進(jìn)行交互,以便安排作業(yè)或執(zhí)行任何CLI操作。

挑戰(zhàn)性

部署新組件總是伴隨著一系列挑戰(zhàn)。這是我們?cè)诖诉^程中必須克服的一些障礙的列表。

Initramfs rootfs和ivot_root

當(dāng)開始使用exec驅(qū)動(dòng)程序運(yùn)行在chroot環(huán)境中隔離的二進(jìn)制文件時(shí),我們注意到不支持在initramfs上運(yùn)行的無狀態(tài)根分區(qū),因?yàn)樵撊蝿?wù)無法啟動(dòng),并且在日志中顯示了此錯(cuò)誤消息:

Feb 12 19:49:03 machine nomad-client[258433]: 2020-02-12T19:49:03.332Z [ERROR] client.alloc_runner.task_runner: running driver failed: alloc_id=fa202-63b-33f-924-42cbd5 task=server error="failed to launch command with executor: rpc error: code = Unknown desc = container_linux.go:346: starting container process caused "process_linux.go:449: container init caused \"rootfs_linux.go:109: jailing process inside rootfs caused \\\"pivot_root invalid argument\\\"\"""

我們提交了一個(gè)GitHub問題,并提交了一個(gè)變通解決方案拉取請(qǐng)求,該請(qǐng)求被迅速審查并合并到上游。

同時(shí),為了獲得最大的隔離安全性,我們pivot_root通過修改啟動(dòng)過程來啟用設(shè)置,并且其他團(tuán)隊(duì)成員開發(fā)并提出了內(nèi)核郵件列表的補(bǔ)丁程序,以使其在將來變得更容易。

資源使用情況遏制

一個(gè)非常重要的方面是確保在Nomad上運(yùn)行的任務(wù)的資源使用不會(huì)破壞同一臺(tái)計(jì)算機(jī)上共存的其他服務(wù)。

磁盤空間是每臺(tái)計(jì)算機(jī)上的共享資源,必須為Nomad設(shè)置配額。我們通過將Nomad數(shù)據(jù)目錄隔離到每臺(tái)計(jì)算機(jī)上的專用固定大小的安裝點(diǎn)來實(shí)現(xiàn)此目的。但是,Nomad目前不支持限制磁盤帶寬和IOPS。

Nomad作業(yè)文件的資源部分可以限制內(nèi)存和CPU的使用(內(nèi)存以MB為單位,cpu以MHz為單位):

resources {
  memory = 2000
  cpu = 500}

這在后臺(tái)使用了cgroups,我們的測(cè)試表明,雖然可以像預(yù)期那樣強(qiáng)制執(zhí)行內(nèi)存限制,但是只要主機(jī)上有可用的CPU,CPU限制就是軟限制并且不強(qiáng)制執(zhí)行。

工作量(不可預(yù)測(cè))

如上所述,所有計(jì)算機(jī)當(dāng)前都運(yùn)行相同的面向客戶的工作負(fù)載。動(dòng)態(tài)調(diào)度各個(gè)作業(yè)與游牧到單機(jī)器上運(yùn)行挑戰(zhàn)假設(shè)。

雖然我們的動(dòng)態(tài)負(fù)載平衡系統(tǒng)Unimog會(huì)根據(jù)資源使用情況來平衡請(qǐng)求,以確保所有計(jì)算機(jī)上的請(qǐng)求都幾乎相同,但是具有大量資源使用情況的批處理類型作業(yè)可能會(huì)帶來挑戰(zhàn)。

隨著我們提供更多服務(wù),我們將對(duì)此予以關(guān)注:

  • 嘗試通過上述限制限制游牧民族工作的資源利用率

  • 確保Unimog適應(yīng)此批處理類型的工作量,并且不會(huì)出現(xiàn)正反饋循環(huán)

我們?cè)贜omad上運(yùn)行的是什么

現(xiàn)在,Nomad已部署在每個(gè)數(shù)據(jù)中心,我們能夠通過逐步啟用這些服務(wù)來提高對(duì)運(yùn)營必不可少的管理服務(wù)的可靠性。我們邁出了第一步,加入了重啟和維護(hù)管理服務(wù)。

重新啟動(dòng)和維護(hù)管理服務(wù)

在每個(gè)數(shù)據(jù)中心,我們都運(yùn)行一項(xiàng)服務(wù),該服務(wù)可促進(jìn)在線無人值守的滾動(dòng)重啟和機(jī)器維護(hù)。該服務(wù)曾經(jīng)在每個(gè)數(shù)據(jù)中心的一臺(tái)知名機(jī)器上運(yùn)行。這使其容易受到單機(jī)故障的影響,并且在停機(jī)時(shí)阻止了計(jì)算機(jī)在重新啟動(dòng)后自動(dòng)啟用。因此,有人將onboarded游牧,以提高其可靠性,良好的第一服務(wù)。

現(xiàn)在,我們保證此服務(wù)始終在每個(gè)數(shù)據(jù)中心中運(yùn)行,而不管單個(gè)計(jì)算機(jī)是否發(fā)生故障。他們現(xiàn)在不再查詢依賴于知名地址的其他機(jī)器來定位此服務(wù),而是查詢Consul DNS并動(dòng)態(tài)確定服務(wù)在何處與之交互。

立即登錄,閱讀全文
版權(quán)說明:
本文內(nèi)容來自于Cloudflare,本站不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。文章內(nèi)容系作者個(gè)人觀點(diǎn),不代表快出海對(duì)觀點(diǎn)贊同或支持。如有侵權(quán),請(qǐng)聯(lián)系管理員(zzx@kchuhai.com)刪除!
掃碼登錄
打開掃一掃, 關(guān)注公眾號(hào)后即可登錄/注冊(cè)
加載中
二維碼已失效 請(qǐng)重試
刷新
賬號(hào)登錄/注冊(cè)
個(gè)人VIP
小程序
快出海小程序
公眾號(hào)
快出海公眾號(hào)
商務(wù)合作
商務(wù)合作
投稿采訪
投稿采訪
出海管家
出海管家