HashiCorp Nomad和遗留系统
容器看起來似乎無處不在。的確,它們使得將應用程序部署到開發、測試和生產環境中更加容易。然而,當容器不能工作時怎么辦?為了充分利用目前可用的容器編排平臺,必須對應用程序和部署流程進行大量更改。對于綠色領域應用程序來說,這不是問題,因為它們通常是在考慮容器的情況下構建的。但是如果您想要在遺留系統擁有類似容器的調度器優勢,該如何做呢?
進入?HashiCorp Nomad.
Nomad是一個集群調度引擎,它有幾種驅動類型,允許您在跨工作負載節點的分布式網絡調度應用程序工作負載。這些驅動程序允許調度運行工作負載的容器、虛擬機或任何其他可執行文件。
工作負載可能由一個應用程序進程或一組我們希望在Nomad節點上運行的進程組成。Nomad在運行時處理動態配置注入,以設置不同的服務依賴關系,如數據庫連接、http端口、服務憑證和注冊,并使用服務發現工具,如HashiCorp Consul。所有這些工作負載配置元素都可以由一個Nomad作業文件定義。
Nomad作業文件是Nomad集群在Nomad集群中調度、配置和執行所需作業的工具。使用此作業文件,您可以根據以下幾個因素定義如何跨集群調度工作負載:
- 操作系統和版本
- 硬件配置
- 標簽定義
- 數據中心位置
- 資源消耗因素
據此,Nomad確定工作負載的位置以及如何配置它以運行。
用于運行遺留系統的Nomad
對于一些遺留應用程序來說,運行它們的唯一方法是使用二進制文件或二進制文件組來執行工作負載。對于這些類型的應用程序,您可以使用Nomad的exec驅動程序。Nomad exec驅動程序允許對作業進行調度,并將其鏈接到已經存在于機器上或在運行時動態安裝的可執行文件上。讓我們來看一個例子。
遺留Tomcat應用程序
對于本例,我們將查看Tomcat應用程序。雖然這只是一個簡單的示例,卻包含了本文中涉及的許多概念,可以很容易地應用于其他可執行類型。
先決條件
要使這個示例工作起來,首先需要一個正在運行的Nomad集群。在這個示例中,我有一個集群,它由三個Nomad服務器節點和六個Nomad客戶端節點組成。在每個客戶端節點上,我都在/opt/ Tomcat目錄中安裝了Apache Tomcat。最佳實踐是不要使用包管理器在Nomad集群中安裝依賴項,而是使用本地安裝腳本或配置工具(如Chef或Puppet)單獨安裝它們。
這是有充分理由的。首先,發行版和各版本之間的安裝各不相同,您希望在Nomad集群之間保持互操作性。其次,相當多的安裝將二進制文件注冊為已經在運行的服務。Nomad希望在作業和本地安裝的服務之間保持一定程度的隔離,通常每臺機器只有一個配置。這使得使用相同的服務運行不同的作業配置變得困難。
一旦您安裝并運行了集群并配置了Tomcat,我們就可以使用LegacyApp.nomad將作業部署到集群中。
編寫 LegacyApp.nomad 作業文件
讓我們一步步瀏覽Nomad作業文件,這樣您就可以了解它的語法格式和如何工作的。與所有HashiCorp工具一樣,Nomad遵循HCL格式。這允許聲明式格式具有插入功能,就像HashiCorp Terraform一樣。
每個Nomad文件需要的第一件事就是作業名稱。對于這個作業,我們取名為“LegacyWebApp”:
job “LegacyWebApp” {在job下,您可以定義關于作業可以在何處運行的特定屬性。對于我們的應用程序示例,我們希望它在所有節點上運行。但是您可以使用特定屬性來確定位置、反親和性、藍色/綠色或其他許多節點。
region = “global”datacenters = [“dc1”]我們需要的下一個定義是將要運行的應用程序類型。您可以為Nomad定義三種?type?的工作負載:batch、system和service。batch就是在給定的時間間隔排隊運行的工作負載。然后可以使用Nomad作為分布式批處理程序。system作業告訴Nomad,無論你定義什么作業,你都希望它運行在集群中的每個節點上。我們將使用的是service。這適用于長時間運行的流程,該流程應該始終基于以下節中概述的作業規范運行。
type = “service”接下來我們要定義一個?group。Nomad中的一個group是一組任務的集合,它們都需要一起運行才能使工作負載正常工作。一個組中可以有一個任務,或者多個任務。位于group節中的任何任務都將在同一個Nomad節點上一起啟動。
group “tomcat” {在group 節下,您將定義工作負載的所有屬性。我們要確定的第一件事是需要運行多少相同的工作負載。這是由?count?屬性定義的。
count = 3要定義的第二件事是如何更新工作負載任務。這是在update節中完成的。在本節中,您可以精確地定義您希望如何升級。在這個例子中,我們想要模擬一個藍/綠部署,這樣在開始終止舊版本之前,我們將擁有與當前版本相同的canary部署數量,其健康狀態最低(min_healthy_time)為30s。健康的最后期限(healthy_deadline)規定,如果所有的canary部署在10分鐘內沒有啟動,就摧毀canary部署并保持穩定。
update {canary = 3min_healthy_time = “30s”healthy_deadline = “10m”auto_revert = truemax_parallel = “1”}Task 節
運行遺留二進制文件的真正技巧來自task節。第一部分是使用 artifact 節。此配置允許您指定要將哪些組件下載到節點提供的臨時存儲中,以及將它們放在何處。您可以從HTTP端點或VCS系統(如GitHub或GitLab)中提取文件。您甚至可以下載壓縮文件并將它們解壓到磁盤上。如果您需要下載一個由包裝器腳本啟動的二進制文件包,那么這將非常有用。您還可以下載不同的配置文件,并通過環境變量或使用模板通過Nomad的本地插值來填充它們。
對于我們的Tomcat示例,需要下載兩個文件。第一個是我們想要部署在上面的war文件。第二個是定制的servcer.xml。我們將用Nomad節點本身提供的環境變量填充。在artifact 節中,您必須有一個源位置(source)。目標(destination)是可選的,如果未聲明,則默認為節點上的本地 / 目錄。
task “WebApp” {artifact {source = “http://location.of.my.file/myfile.war" destination = “/local/webapps”}artifact {source = “http://location.of.my.file/server.xml”destination = “/local/tomcat/conf”}ENV 節
我們要使用的下一節是env調用。這允許您設置將在運行時填充的環境變量。對于我們的應用程序示例,我們將從命令中填充運行Tomcat所需的內容,比如JAVA_HOME、CATALINA_HOME,以及特定于應用程序的內容,比如數據庫憑證,以及要映射到Tomcat進程的http端口。這允許您使用不同的端口在同一個主機上運行多個Tomcat實例。您將把它與resources節一起使用,其中http端口將由節點動態分配。
env {DBHOST = “your.db.host”DBUSER = “dbuser”DBPASS = “password”DATABASE = “demodb”CATALINA_OPTS = -Dport.http=$NOMAD_PORT_http -Ddefault.context=$NOMAD_TASK_DIR”JAVA_HOME = “/location/to/java”CATALINA_HOME = “/opt/tomcat”}注意,我正在為http端口和Nomad任務目錄使用已填充的Nomad環境變量,以填充要注入到Tomcat服務啟動中的java命令行參數。這兩個位于CATALINA_OPTS環境變量中的參數被傳遞給server.xml用于建立監聽http端口以及從根目錄到war文件位置的位置。
<?xml version='1.0' encoding='utf-8'?> <Server port="-1" shutdown="SHUTDOWN"><Service name="Catalina"><Connector port="${port.http}" protocol="HTTP/1.1"connectionTimeout="20000" /><Engine name="Catalina" defaultHost="localhost"><Host name="localhost" appBase="${default.context}/webapps/"unpackWARs="true" autoDeploy="true"xmlValidation="false" xmlNamespaceAware="false"></Host></Engine></Service>EXEC 驅動
driver配置用于運行此工作負載的驅動程序類型。對于這個工作負載,我們使用exec驅動程序。這允許任何命令作為nomad進程運行的用戶執行。我們再次注入一個環境變量,以告訴tomcat server.xml配置文件在哪里,以便在啟動時使用。catalina.sh是一個包裝器腳本,用于構建和運行java命令以啟動tomcat。您可以使用java驅動程序來完成這項工作,但是構建所有選項可能會比較麻煩,而且tomcat已經有了運行tomcat的好方法。
大多數命令都有傳遞運行時參數的方法。config節允許您指定那些參數是什么。對于本例,我們希望將-config選項連同server.xml的位置一起傳遞。
需要注意的一點是,exec不能執行作為守護進程運行進程的命令。它必須在前臺運行,才能在進程結束時終止進程。為了在tomcat中實現這一點,我們傳遞了“run”參數,它將在前臺維持這個進程。
driver = “raw_exec”config {command = “/opt/tomcat/bin/catalina.sh” args = [“run”, “-config”, “$NOMAD_TASK_DIR/tomcat/conf/server.xml”]}因為我們需要使用動態http端口,所以需要像Consul這樣的服務發現工具來聲明這個應用程序的位置。Consul registration功能將允許我們的動態負載均衡器Fabio自動提取運行中的服務并將其映射到一個外部端口9999。為了做到這一點,我們使用service節,并將它注冊到Consul。
service {tags = ["urlprefix-/LegacyApp"]port = "http"check {name = "version_check"type = "http"path = "/LegacyApp/version/version.jsp"interval = "10s"timeout = "2s"}}我們要做的最后一件事是提供資源約束。這將告訴調度器我們的工作需要哪些資源。它還將定義將http映射到的端口。如果你看一下http屬性,我在它旁邊放了花括號。這告訴Nomad使用一個端口范圍為20000-40000來分配http端口。然后,在環境變量(用于傳遞給tomcat)中,對要綁定到的對象進行插值。
resources {cpu = 500 # MHzmemory = 128 # MBnetwork {mbits = 1port "http" {}}}把它們放在一起
一旦創建了這個作業文件,剩下要做的就是將其提交給Nomad進行調度。通過在命令行上執行的nomad run命令來實現。
(master) $: nomad run LegacyWebapp.nomad ==> Monitoring evaluation "c0dde6be"Evaluation triggered by job "LegacyWebApp"Evaluation within deployment: "a3e63ddd"Allocation "af427171" modified: node "c8288d23", group "tomcat"Allocation "d7af2ec8" modified: node "33cd403c", group "tomcat"Allocation "ea1c2194" modified: node "c56b21d7", group "tomcat"Evaluation status changed: "pending" -> "complete" ==> Evaluation "c0dde6be" finished with status “complete"運行此命令后,您可以通過運行job status命令查看作業的狀態。
(master) $: nomad job status LegacyWebApp ID = LegacyWebApp Name = LegacyWebApp Submit Date = 04/02/18 19:50:27 EDT Type = service Priority = 50 Datacenters = dc1 Status = running Periodic = false Parameterized = falseSummary Task Group Queued Starting Running Failed Complete Lost tomcat 0 0 3 2 55 0Latest Deployment ID = a3e63ddd Status = successful Description = Deployment completed successfullyDeployed Task Group Desired Placed Healthy Unhealthy tomcat 3 3 3 0Allocations ID Node ID Task Group Version Desired Status Created Modified af427171 c8288d23 tomcat 40 run running 4h31m ago 4h28m ago d7af2ec8 33cd403c tomcat 40 run running 4h31m ago 4h28m ago ea1c2194 c56b21d7 tomcat 40 run running 4h31m ago 4h28m agoConsul將顯示您的服務已經啟動并運行,注冊并通過所有健康檢查。
現在,如果您將瀏覽器指向URL,就應該得到您的應用程序。
如果您想要從1.0版本升級到2.0版本,只需對job文件進行修改即可。在這種情況下,只需將artifact 值由v.1的地址改為v.2的地址。重新提交作業,Nomad就會發現發生了什么變化。您可以首先執行plan命令,然后查看Nomad將如何處理更新后的工作。
(master) $: nomad plan LegacyWebapp.nomad +/- Job: "LegacyWebApp" +/- Task Group: "tomcat" (3 canary, 3 ignore)+/- Update {+/- AutoRevert: "false" => "true"+/- Canary: "0" => "3"HealthCheck: "checks"+/- HealthyDeadline: "300000000000" => "600000000000"MaxParallel: "2"+/- MinHealthyTime: "10000000000" => "30000000000"}+/- Task: "WebApp" (forces create/destroy update)+ Artifact {+ GetterMode: "any"+ GetterSource: "https://s3.us-east-2.amazonaws.com/nomad-demo-legacyapp/v.2/LegacyApp.war"+ RelativeDest: "/local/webapps/"}- Artifact {- GetterMode: "any"- GetterSource: "https://s3.us-east-2.amazonaws.com/nomad-demo-legacyapp/v.1/LegacyApp.war"- RelativeDest: "/local/webapps/"}重新提交作業,并查看Nomad將應用程序的三個新實例作為canary部署。
(master) $: nomad job status LegacyWebApp ID = LegacyWebApp Name = LegacyWebApp Submit Date = 04/03/18 00:26:38 EDT Type = service Priority = 50 Datacenters = dc1 Status = running Periodic = false Parameterized = falseSummary Task Group Queued Starting Running Failed Complete Lost tomcat 0 0 6 2 55 0Latest Deployment ID = ea1564a0 Status = running Description = Deployment is running but requires promotionDeployed Task Group Auto Revert Promoted Desired Canaries Placed Healthy Unhealthy tomcat true false 3 3 3 0 0Allocations ID Node ID Task Group Version Desired Status Created Modified 0b0ef2a4 206bfc4f tomcat 41 run running 9s ago 8s ago 916307f1 46102c23 tomcat 41 run running 9s ago 8s ago ca82eb52 89797ed9 tomcat 41 run running 9s ago 9s ago af427171 c8288d23 tomcat 40 run running 4h39m ago 4h35m ago d7af2ec8 33cd403c tomcat 40 run running 4h39m ago 4h36m ago ea1c2194 c56b21d7 tomcat 40 run running 4h39m ago 4h36m ago正如您所看到的,Nomad為我們的應用程序創建了三個新的canary實例,以確保所有的東西都能投入使用。
在我們測試以確保部署工作正常之后,我們現在可以升級新代碼并終止舊代碼。您可以通過執行deployment promote命令來實現這一點。
(master) $: nomad deployment promote ea1564a0 ==> Monitoring evaluation "58e44443"Evaluation triggered by job "LegacyWebApp"Evaluation within deployment: "ea1564a0"Evaluation status changed: "pending" -> "complete" ==> Evaluation "58e44443" finished with status “complete"現在,當您執行 job status時,您可以看到我們的三個舊版本已經結束,現在只運行新版本。
(master) $: nomad job status LegacyWebApp ID = LegacyWebApp Name = LegacyWebApp Submit Date = 04/03/18 00:26:38 EDT Type = service Priority = 50 Datacenters = dc1 Status = running Periodic = false Parameterized = falseSummary Task Group Queued Starting Running Failed Complete Lost tomcat 0 0 3 2 58 0Latest Deployment ID = ea1564a0 Status = successful Description = Deployment completed successfullyDeployed Task Group Auto Revert Promoted Desired Canaries Placed Healthy Unhealthy tomcat true true 3 3 3 3 0Allocations ID Node ID Task Group Version Desired Status Created Modified 0b0ef2a4 206bfc4f tomcat 41 run running 5m44s ago 5m9s ago 916307f1 46102c23 tomcat 41 run running 5m44s ago 5m7s ago ca82eb52 89797ed9 tomcat 41 run running 5m44s ago 5m8s ago af427171 c8288d23 tomcat 40 stop complete 4h45m ago 1m55s ago d7af2ec8 33cd403c tomcat 40 stop complete 4h45m ago 1m55s ago ea1c2194 c56b21d7 tomcat 40 stop complete 4h45m ago 1m55s ago結論
對于那些還沒有準備好進行容器化的遺留應用程序,Nomad是一個很好的選擇,它允許對那些還沒有準備好遷移到新部署框架中的工作負載類型靈活地進行動態作業調度
要了解更多關于Nomad的信息,請訪問?https://www.hashicorp.com/products/nomad.
總結
以上是生活随笔為你收集整理的HashiCorp Nomad和遗留系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 权限系统设计模型分析(DAC,MAC,R
- 下一篇: 关于如何在Nomad中保护工作部署的工作