Hashicopy之nomad应用编排方案03(运行一个job)
一 Nomad术语
1.1 Nomad cluster
- Agent:Nomad代理是以服务器或客户端模式运行的Nomad进程。代理是Nomad集群的基本构建块。
- Dev Agent:Nomad开发代理是一种特殊的配置,它为使用Nomad运行实验提供了有用的缺省值。它以服务器和客户端模式运行,不会将其群集状态持久化到磁盘,这允许代理从可重复的清洁状态启动,而不必在运行之间删除基于磁盘的状态。Nomad开发代理只用于开发和实验使用。若要了解production Nomad部署,请参阅企业参考体系结构和部署指南集合。
- Server:在服务器模式下运行的Nomad代理。游牧服务器是集群的大脑。每个区域都有一个服务器集群,它们管理所有作业和客户端,运行评估,并创建任务分配。服务器之间相互复制数据,并执行领导者选举,以确保高可用性。服务器跨区域联合,使Nomad在全球范围内都能感知到。一个地区的所有服务器都是同一个八卦域和共识组的成员。
- Leader:leader是一个Nomad服务器,它执行大部分集群管理。它负责应用计划,为工作负载派生Vault令牌,并维护集群状态。
- Follower:非leader Nomad服务器。追随者创建调度计划并将其提交给领导者,以便为集群提供更多的调度能力。
- Client:以客户端模式运行的Nomad代理。客户端代理负责向服务器注册自己,监视要分配的任何工作,并执行任务。客户端创建到服务器的多路连接。这将启用需要NAT穿透的拓扑。一旦连接,服务器将使用此连接在必要时将RPC调用转发给客户端。
1.2 Nomad对象
- Job:作业定义一个或多个包含一个或多个任务的任务组。
- job specification:Nomad作业规范(或简称“JobSpec”)定义了Nomad作业的模式。它描述作业的类型、作业运行所需的任务和资源,还包括其他作业信息(如约束、扩展、自动缩放策略、咨询服务信息等)
- task group:任务组是一组必须一起运行的任务。例如,web服务器可能要求日志传送协同进程也始终在运行。任务组是调度的单位,这意味着整个组必须在同一个客户端节点上运行,并且不能被拆分。任务组的运行实例是分配。
- task driver:任务驱动程序表示执行任务的基本方法。Nomad提供了几个内置的任务驱动程序:Docker、QEMU、Java和静态二进制文件。Nomad还允许第三方任务驱动程序通过其可插入的架构。
- task:任务是Nomad中最小的工作单元。任务由任务驱动程序执行,这使得Nomad能够灵活地处理其支持的任务类型。任务指定其所需的任务驱动程序、驱动程序的配置、约束和所需的资源。
- Allocation:分配是作业中的任务组与客户端节点之间的映射。单个作业可能有数百或数千个任务组,这意味着必须存在等价数量的分配才能将工作映射到客户端机器。分配是由Nomad服务器创建的,作为评估期间做出的调度决策的一部分。
- Evaluation:评估是Nomad做出调度决策的机制。当所需状态(作业)或实际状态(客户机)发生变化时,Nomad会创建一个新的评估来确定是否必须采取任何操作。如果有必要,评估可能会导致拨款的改变。
1.3 Scheduling
- Bin packing:装箱是一种算法,其名称来源于现实世界中将大小不规则的对象排列到箱子或箱子中的练习。装箱算法试图创建最密集的对象排列,从而使用最少的箱子。在Nomad的情况下,这些对象是部署的分配。Bin打包通过整合利用率和突出显示可减少的资源调配,使使用计量计费平台的人受益。
- Spread scheduling:排列计划与装箱相反。分散调度的目标是在机队中尽可能地分配a级负载。这种调度算法最适合那些已经投资了本地数据中心或承诺节点的用户。
二 启动Nomad
Nomad依赖于集群中每台机器上的一个长时间运行的代理。代理既可以在服务器模式下运行,也可以在客户端模式下运行。群集服务器负责管理群集。集群中的所有其他代理都应处于客户端模式。Nomad客户机是一个非常轻量级的进程,它注册主机,执行心跳,并运行服务器分配给它的任务。代理必须在集群的每个节点上运行,以便服务器可以将工作分配给这些机器。
以开发模式(也称为开发代理)启动Nomad代理。Nomad开发代理快速启动一个代理,该代理充当客户机和服务器,以测试作业配置或原型交互。您还可以使用nomad命令行工具来发现代理的状态和服务器成员身份。最后,使用nomad job init和nomad job run命令创建并启动示例作业。
2.1 启动agent
现在,使用sudo命令在开发模式下用Nomad agent命令启动一个Nomad代理。通常,客户端模式下的任何代理都必须以根级别权限启动。Nomad使用操作系统原语进行资源隔离,这需要更高的权限。代理作为非根用户运行,但某些任务驱动程序不可用。
添加-bind标志并将该值设置为0.0.0.0。此外,使用-log level标志并将输出日志级别设置为INFO。默认情况下,Nomad dev代理绑定到127.0.0.1,这会导致Vagrant端口转发问题。Nomad开发代理也默认为调试级日志记录,这可能会有点嘈杂。
nomad agent -dev -bind 0.0.0.0 -log-level INFO
输出指示代理已在服务器和客户端模式下启动。等待继续下一节,直到您看到代理获得了领导地位。
在启动期间,您甚至可能会看到一个日志行,它告诉您有一个新版本的Nomad可用。
此日志行提供信息,对当前运行的代理没有任何影响。
2.2 发现node
[root@VM-16-30-centos ~]# nomad node status
ID DC Name Class Drain Eligibility Status
47275a3d dc1 VM-16-30-centos <none> false eligible ready
输出显示您的节点ID、其数据中心、节点名称、节点类、排放模式和当前状态。节点ID是随机生成的UUID。
代理也处于服务器模式,这意味着它是用于将所有服务器实例连接在一起的gossip协议的一部分。您可以使用server members命令查看八卦圈的成员。
由于您只有一个本地代理,所以您的输出应该只包括一个节点。
[root@VM-16-30-centos ~]# nomad server members
Name Address Port Status Leader Raft Version Build Datacenter Region
VM-16-30-centos.global 172.16.16.30 4648 alive true 3 1.3.1 dc1 global
输出显示您的代理、它运行的地址、运行状况、一些版本信息以及数据中心和区域。通过提供-detailed标志可以查看其他元数据。
[root@VM-16-30-centos ~]# nomad server members -detailed
Name Address Port Status Leader Protocol Raft Version Build Datacenter Region Tags
VM-16-30-centos.global 172.16.16.30 4648 alive true 2 3 1.3.1 dc1 global expect=1,dc=dc1,id=30a29a3f-17bc-2287-157a-011b6b16a15e,region=global,raft_vsn=3,vsn=1,rpc_addr=172.16.16.30,build=1.3.1,bootstrap=1,role=nomad,port=4647
三 运行第一个Job
作业是用户在使用Nomad时与之交互的主要配置。作业是Nomad应该运行的任务的声明性规范。作业具有全局唯一的名称和一个或多个任务组,这些任务组本身就是一个或多个任务的集合。
作业的格式记录在作业规范中。它们既可以在HashiCorp配置语言中指定,也可以在JSON中指定;但是,您应该只在机器生成配置时使用JSON。
3.1 生成一个简单job
nomad job init
您可以通过运行cat example.nomad查看该文件的内容。这个示例作业文件声明了一个名为redis的任务,它使用Docker驱动程序运行redis容器。
与Nomad交互的主要方式是使用Nomad job run命令。run命令获取一个作业文件并将其注册到Nomad。这用于注册新作业和更新现有作业。
现在通过使用nomad job run命令运行作业来注册示例作业。
这里,输出表明评估作业提交的结果是创建了一个现在正在本地节点上运行的分配。
如果nomad作业run example.nomad命令的输出包含以下消息,请验证Docker是否安装在nomad客户端节点或-dev代理节点上。流浪环境自动为你提供了这一点。
nomad job run example.nomad
此消息表示没有运行Docker任务驱动程序的Nomad客户端可用。这通常是因为Docker已停止或未安装。
无论何时更新作业,Nomad都会创建一个评估,以确定需要执行哪些操作。因为这是一个新作业,Nomad决定应该创建一个分配,并在您的本地代理上安排了它。
使用nomad job status命令检查作业的状态:
nomad job status example
Nomad运行作业时,会根据作业中的任务组创建分配。要检查分配,请使用nomad alloc status命令。将命令中的分配ID替换为在上一步中运行nomad作业状态示例时收到的分配ID。
但是目前条件不允许,需要在node节点安装Docke/Consul并启动,环境符合条件后,再次运行。
再次查看job状态。
nomad alloc status ea93421c
当Nomad运行作业时,它根据作业中的任务组创建分配。要检查分配,请使用nomad alloc status命令。将命令中的分配ID替换为在上一步中运行nomad job status示例时收到的分配ID。
3.2 获取job日志
对于作业规范中定义的每个任务,Nomad都会自动捕获写入stdout和stderr的日志文件中的信息。可以使用nomad alloc logs命令获取这些日志。要查看stderr日志,必须在命令中的分配ID和任务名称之前提供-stderr标志。
运行nomad alloc logs命令从分配中的redis任务获取日志,再次将分配ID替换到命令中的适当位置。
nomad alloc logs 635a981a redis
其他命令包括对job的执行命令,例如
至此就启动启动来一个redis的job。
其他
- 需要提前安装consul并启动。
- 需要提前安装docker并启动。
参考链接
- 点赞
- 收藏
- 关注作者
评论(0)