HashiCorp Nomad中的高级节点排干
HashiCorp Nomad 0.8引入了高級(jí)節(jié)點(diǎn)排干,以簡(jiǎn)化Nomad客戶端節(jié)點(diǎn)的集群范圍升級(jí)。本文探討了如何使用HashiCorp Nomad改進(jìn)的排干特性在不需要停機(jī)的情況下將現(xiàn)有的工作負(fù)載從一組節(jié)點(diǎn)轉(zhuǎn)移到另一組新的節(jié)點(diǎn)。
傳統(tǒng)上,升級(jí)由調(diào)度器管理的生產(chǎn)集群對(duì)操作人員來說是一個(gè)挑戰(zhàn),因?yàn)榧嚎赡苷谶\(yùn)行實(shí)時(shí)工作負(fù)載,這些工作負(fù)載是為客戶端服務(wù)的,不能中斷。另一個(gè)困難是集群操作人員可能不是服務(wù)所有者,并且不知道所有生產(chǎn)服務(wù)的需求。
HashiCorp Nomad的核心目標(biāo)是使集群管理對(duì)操作人員來說是輕松的,并最小化服務(wù)停機(jī)時(shí)間。通過Nomad 0.8的高級(jí)節(jié)點(diǎn)排干功能,我們通過讓操作人員和開發(fā)人員控制遷移如何在集群范圍內(nèi)協(xié)調(diào)發(fā)生來努力實(shí)現(xiàn)以上這些特性。
新節(jié)點(diǎn)排干器
使用Nomad 0.8引入了一種新的節(jié)點(diǎn)排干器,可以安全地排出在Nomad客戶端節(jié)點(diǎn)上運(yùn)行的任務(wù)。新的節(jié)點(diǎn)排干器將檢查所有的排干節(jié)點(diǎn),并能夠檢測(cè)哪些作業(yè)受到排干操作的影響。然后,它將檢查migrate節(jié)中所有受影響的作業(yè),并通過遵守節(jié)中定義的max_parallel來減少服務(wù)的停機(jī)時(shí)間。max_parallel參數(shù)限制了在任何給定時(shí)間可以遷移的分配數(shù)。Nomad通過限制并行遷移不超過這個(gè)值來遵守這個(gè)字段的規(guī)定。由于應(yīng)用程序沒有立即準(zhǔn)備好為流量服務(wù),Nomad等待替換的分配變得健康,然后繼續(xù)遷移分配,這有助于減少服務(wù)停機(jī)時(shí)間。Nomad 0.8中的新節(jié)點(diǎn)排干器允許Nomad在排干節(jié)點(diǎn)時(shí)擁有一個(gè)集群范圍的視圖,并允許服務(wù)所有者定義使用migrate節(jié)在節(jié)點(diǎn)間遷移作業(yè)所需的所有必要參數(shù)。
Migrate節(jié)
使用Nomad 0.8,通過在任務(wù)組級(jí)別引入一個(gè)新的migrate節(jié),改進(jìn)了排干行為,它允許開發(fā)人員為他們的工作定義排干行為。下面是my-api作業(yè)的migrate節(jié)示例,它允許Nomad以每次一個(gè)分配的速度遷移作業(yè),并且要求在遷移到下一個(gè)作業(yè)之前至少10秒內(nèi)保持健康。
job "my-api" {datacenters = ["dc1"]type = "service"group "my-api" {count = 2migrate {# Perform one parallel migration at a time.max_parallel = 1# Ensure that the newly placed allocations are healthy for at least 10# seconds before moving on with the migration process.min_healthy_time = "10s"# Give the allocation at most 3 minutes to be marked healthy before # other migrations can continue.healthy_deadline = "3m"}restart { .....在排干節(jié)點(diǎn)時(shí),Nomad將使用group的migrate節(jié)在集群中的其他節(jié)點(diǎn)上創(chuàng)建新的分配。在上面的示例中,如果在運(yùn)行my-api作業(yè)的節(jié)點(diǎn)上發(fā)出一個(gè)節(jié)點(diǎn)排干命令,Nomad將通過在集群中的另一個(gè)節(jié)點(diǎn)上使用my-api服務(wù)的相同版本創(chuàng)建一個(gè)新分配來遷移作業(yè)。新創(chuàng)建的分配需要在Nomad繼續(xù)遷移作業(yè)中的分配之前的3分鐘內(nèi)通過健康檢查。這個(gè)過程幫助負(fù)責(zé)my-api服務(wù)的開發(fā)人員使用migrate節(jié)中定義的參數(shù)來定義在節(jié)點(diǎn)耗盡時(shí)如何遷移作業(yè)。這也有助于操作人員即使不知道這些細(xì)粒度設(shè)置,而將重點(diǎn)放在集群中的節(jié)點(diǎn)升級(jí)上。
Node Drain與Eligibility命令
新的node drain命令引入了節(jié)點(diǎn)資格的概念。每個(gè)Nomad客戶節(jié)點(diǎn)都可以是可調(diào)度的,也可以是不可調(diào)度的。當(dāng)排干節(jié)點(diǎn)時(shí),Nomad會(huì)將節(jié)點(diǎn)標(biāo)記為ineligible新位置。
Nomad 0.8還允許操作人員在排干節(jié)點(diǎn)時(shí)設(shè)定一個(gè)截止期限。設(shè)置后,Nomad將等待直到最后期限,在此期限內(nèi),所有的分配都必須從節(jié)點(diǎn)中移出,否則將被迫從節(jié)點(diǎn)中強(qiáng)行移除。設(shè)置最后期限為操作人員提供了最后的時(shí)間,在此期間,他們可以刪除資源,但允許作業(yè)有足夠的時(shí)間遷移到另一個(gè)節(jié)點(diǎn)。此外,Nomad允許batch作業(yè)繼續(xù)在一個(gè)排干節(jié)點(diǎn)上運(yùn)行,直到最后期限。這允許完成幾乎完整的batch作業(yè),有助于降低與運(yùn)行batch作業(yè)相關(guān)的成本。下面是一個(gè)使用-deadline命令行標(biāo)志和node drain命令的示例。
nomad node drain -enable -self -deadline 30m在上面的示例中,Nomad將等待30分鐘,然后強(qiáng)制將作業(yè)從節(jié)點(diǎn)中移除。
Nomad中的system作業(yè)允許日志傳輸器和指標(biāo)收集器等服務(wù)在所有Nomad客戶端節(jié)點(diǎn)上運(yùn)行。如果客戶端節(jié)點(diǎn)被排干,那么system作業(yè)是最后一個(gè)被遷移的,這允許在這些作業(yè)被排干之前,所有的指標(biāo)和日志被傳輸。
改進(jìn)以前的排干命令
在Nomad 0.8之前,當(dāng)發(fā)出一個(gè)節(jié)點(diǎn)排干命令時(shí),Nomad會(huì)用drain =true標(biāo)記一個(gè)節(jié)點(diǎn),這個(gè)節(jié)點(diǎn)不允許在本節(jié)點(diǎn)調(diào)度任何新的作業(yè)。然后,Nomad將為節(jié)點(diǎn)上運(yùn)行的所有作業(yè)創(chuàng)建新的評(píng)估,并將它們重新調(diào)度到集群中的其他節(jié)點(diǎn)。這種行為在某些情況下會(huì)導(dǎo)致服務(wù)停機(jī)。與節(jié)點(diǎn)排干行為相關(guān)的其他幾個(gè)問題如下:
- 在對(duì)客戶端執(zhí)行滾動(dòng)排干和重新啟動(dòng)時(shí),作業(yè)可以在節(jié)點(diǎn)之間重復(fù)移動(dòng),并可以放置在即將排干的節(jié)點(diǎn)上。
- 在一個(gè)場(chǎng)景中,某個(gè)特定服務(wù)的所有作業(yè)都在一個(gè)節(jié)點(diǎn)上運(yùn)行,排干該節(jié)點(diǎn)將導(dǎo)致該節(jié)點(diǎn)上運(yùn)行的所有作業(yè)同時(shí)停止,從而導(dǎo)致該服務(wù)的停機(jī)。
- 每次排干一個(gè)節(jié)點(diǎn)并等待新的部署位置是冗長乏味的,而且容易出錯(cuò)。
- 同時(shí)排干多個(gè)節(jié)點(diǎn)可能會(huì)導(dǎo)致停機(jī),原因是排干節(jié)點(diǎn)之間缺乏協(xié)調(diào)。
- 排干正在運(yùn)行batch作業(yè)的節(jié)點(diǎn)可能會(huì)導(dǎo)致作業(yè)在完成工作之前停止,這可能需要重新啟動(dòng)它們以重新執(zhí)行工作。
- 排干節(jié)點(diǎn)將導(dǎo)致在節(jié)點(diǎn)上運(yùn)行的system作業(yè)立即被排干。
綜上所述,在Nomad v0.8之前,協(xié)調(diào)零停機(jī)時(shí)間排干需要操作人員大量的手工監(jiān)督,因?yàn)樗麄儫o法控制單個(gè)任務(wù)的排干。
與Update節(jié)的區(qū)別
理解update和migrate節(jié)之間的區(qū)別是很重要的,因?yàn)樗鼈冇邢嗨频膮?shù),但在Nomad中用于不同的用例。
update節(jié)用于處理作業(yè)版本之間的轉(zhuǎn)換。它的目的是幫助協(xié)調(diào)諸如滾動(dòng)部署和canary部署之類的事情。開發(fā)人員可能對(duì)它更感興趣,因?yàn)樗麄兿胍刂迫绾螌⒆鳂I(yè)從一個(gè)版本升級(jí)到另一個(gè)版本。
migrate節(jié)定義了調(diào)度程序在集群更改現(xiàn)有作業(yè)時(shí)的行為。由于這些作業(yè)已經(jīng)在集群中運(yùn)行,操作人員可以使用migrate節(jié)來定義在以不影響作業(yè)服務(wù)質(zhì)量的方式排干節(jié)點(diǎn)時(shí)應(yīng)該如何重新調(diào)度作業(yè)。在節(jié)點(diǎn)排干的情況下,作業(yè)的相同版本在節(jié)點(diǎn)之間遷移,因此migrate節(jié)不提供auto_revert、canary和stagger等參數(shù)。
結(jié)論
使用Nomad 0.8,我們發(fā)布了高級(jí)節(jié)點(diǎn)排干功能,通過讓操作人員和開發(fā)人員控制集群范圍內(nèi)的、協(xié)調(diào)的遷移方式來幫助他們。這篇文章展示了高級(jí)節(jié)點(diǎn)排干如何推動(dòng)所有的智能安全地向Nomad進(jìn)行服務(wù)遷移,允許開發(fā)人員專注于構(gòu)建他們的服務(wù),而操作人員專注于確保運(yùn)行這些服務(wù)的基礎(chǔ)設(shè)施是穩(wěn)定的。
總結(jié)
以上是生活随笔為你收集整理的HashiCorp Nomad中的高级节点排干的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Nomad构建弹性基础架构: 容错和
- 下一篇: 使用Nomad和OpenFaaS提供Fa