引言
最近,Kubernetes的普及迅速增长-越来越多的项目正在国内实施它。 我想谈谈像Nomad这样的协调器:它非常适合已经使用HashiCorp的其他解决方案的项目,例如Vault和Consul,并且项目本身在基础架构方面并不复杂。 本文将提供有关安装Nomad,将两个节点组合到群集中以及将Nomad与Gitlab集成的说明。

试验台
关于测试平台的一点点:使用了三个虚拟服务器,它们具有2个CPU,4个RAM,50 Gb SSD的特征,并结合在一个通用的本地网络中。 它们的名称和IP地址:
- nomad-livelinux-01 :172.30.0.5
- nomad-livelinux-02 :172.30.0.10
- consul-livelinux-01 :172.30.0.15
游牧民的安装,领事。 创建游牧集群
让我们继续基本安装。 尽管安装很容易,但为了保证文章的完整性,我将对其进行描述:实际上,它是根据草稿和注释创建的,以便在必要时进行快速访问。
在开始练习之前,我们将讨论理论部分,因为在此阶段,了解未来的结构很重要。
我们有两个Nomad节点,我们希望将它们组合成一个集群,并且在将来,我们将需要自动缩放集群-为此,我们需要Consul。 使用此工具,群集和添加新节点变得非常简单:创建的Nomad节点连接到Consul代理,然后连接到现有的Nomad群集。 因此,一开始我们将安装Consul服务器,为Web面板配置基本的http授权(默认情况下未经授权即可访问,并且可以通过外部地址访问),以及在Nomad服务器上的Consul代理本身,之后我们就可以启动Nomad。
安装HashiCorp工具非常简单:实际上,我们只需将二进制文件移至bin目录,配置工具的配置文件并创建其服务文件。
下载Consul二进制文件并将其解压缩到用户的主目录中:
root@consul-livelinux-01:~
现在我们有一个现成的二进制领事文件,用于进一步的配置。
要使用Consul,我们需要使用keygen命令创建一个唯一密钥:
root@consul-livelinux-01:~
让我们继续配置Consul,使用以下结构创建/etc/consul.d/目录:
/etc/consul.d/ ├── bootstrap │ └── config.json
bootstrap目录将包含config.json配置文件-在其中,我们将设置Consul设置。 其内容:
{ "bootstrap": true, "server": true, "datacenter": "dc1", "data_dir": "/var/consul", "encrypt": "your-key", "log_level": "INFO", "enable_syslog": true, "start_join": ["172.30.0.15"] }
让我们分别检查主要指令及其含义:
- bootstrap :是的。 如果新节点已连接,我们将打开它们的自动添加功能。 我注意到我们在这里没有指出预期节点的确切数目。
- 服务器 :是的。 打开服务器模式。 目前,此虚拟机上的Consul将是唯一的服务器和主服务器,VM Nomad将是客户端。
- 数据中心 :dc1。 指定数据中心的名称以创建集群。 在客户端和服务器上,它必须相同。
- 加密 :您的密钥。 密钥也必须唯一,并且在所有客户端和服务器上都必须匹配。 使用consul keygen命令生成。
- start_join 。 在此列表中,我们指示将建立连接的IP地址列表。 目前,我们只留下我们自己的地址。
在这一点上,我们可以使用命令行启动领事:
root@consul-livelinux-01:~
这是现在进行调试的好方法,但是,由于显而易见的原因,使用该方法将一直无法使用。 创建用于通过systemd管理Consul的服务文件:
root@consul-livelinux-01:~
consul.service文件的内容:
[Unit] Description=Consul Startup process After=network.target [Service] Type=simple ExecStart=/bin/bash -c '/usr/local/bin/consul agent -config-dir /etc/consul.d/bootstrap -ui' TimeoutStartSec=0 [Install] WantedBy=default.target
通过systemctl运行Consul:
root@consul-livelinux-01:~
我们检查:应该启动我们的服务,并且通过执行consul Members命令,我们应该看到我们的服务器:
root@consul-livelinux:/etc/consul.d
下一步:安装Nginx并设置代理,http授权。 通过程序包管理器安装nginx并在/ etc / nginx / sites-enabled目录中创建配置文件consul.conf,其内容如下:
upstream consul-auth { server localhost:8500; } server { server_name consul.doman.name; location / { proxy_pass http://consul-auth; proxy_set_header Host $host; auth_basic_user_file /etc/nginx/.htpasswd; auth_basic "Password-protected Area"; } }
不要忘记创建.htpasswd文件并为其生成用户名和密码。 此项是必填项,因此认识我们域的每个人都无法访问Web面板。 但是,在配置Gitlab时,我们将不得不放弃这一点-否则我们将无法将应用程序部署到Nomad。 在我的项目中,Gitlab和Nomad都仅位于灰色网络上,因此没有此类问题。
在其他两台服务器上,根据以下说明安装Consul代理。 对二进制文件重复上述步骤:
root@nomad-livelinux-01:~
与先前的服务器类似,我们使用以下结构为配置文件/etc/consul.d创建目录:
/etc/consul.d/ ├── client │ └── config.json
config.json文件的内容:
{ "datacenter": "dc1", "data_dir": "/opt/consul", "log_level": "DEBUG", "node_name": "nomad-livelinux-01", "server": false, "encrypt": "your-private-key", "domain": "livelinux", "addresses": { "dns": "127.0.0.1", "https": "0.0.0.0", "grpc": "127.0.0.1", "http": "127.0.0.1" }, "bind_addr": "172.30.0.5", # "start_join": ["172.30.0.15"], # "ports": { "dns": 53 } }
我们保存更改并继续配置服务文件,其内容如下:
/etc/systemd/system/consul.service:
[Unit] Description="HashiCorp Consul - A service mesh solution" Documentation=https://www.consul.io/ Requires=network-online.target After=network-online.target [Service] User=root Group=root ExecStart=/usr/local/bin/consul agent -config-dir=/etc/consul.d/client ExecReload=/usr/local/bin/consul reload KillMode=process Restart=on-failure [Install] WantedBy=multi-user.target
我们在服务器上启动领事。 现在,在启动之后,我们应该在nsul成员中看到已配置的服务。 这将意味着他以客户端身份成功连接到集群。 在第二台服务器上重复同样的操作,然后我们将能够开始安装和配置Nomad。
Nomad的正式文档中有更详细的安装说明。 传统的安装方法有两种:下载二进制文件和从源代码进行编译。 我将选择第一种方法。
注意 :项目发展非常快,经常会出现新的更新。 也许到本文完成时,将发布一个新版本。 因此,我建议阅读之前先检查Nomad的当前版本并下载。
root@nomad-livelinux-01:~
解压缩后,我们将得到一个Nomad'a二进制文件,其大小为65 MB-必须将其移动到/ usr / local / bin。
为Nomad创建数据目录并编辑其服务文件(很可能在一开始就不存在):
root@nomad-livelinux-01:~
在其中插入以下行:
[Unit] Description=Nomad Documentation=https://nomadproject.io/docs/ Wants=network-online.target After=network-online.target [Service] ExecReload=/bin/kill -HUP $MAINPID ExecStart=/usr/local/bin/nomad agent -config /etc/nomad.d KillMode=process KillSignal=SIGINT LimitNOFILE=infinity LimitNPROC=infinity Restart=on-failure RestartSec=2 StartLimitBurst=3 StartLimitIntervalSec=10 TasksMax=infinity [Install] WantedBy=multi-user.target
但是,我们不急于运行nomad-我们尚未创建其配置文件:
root@nomad-livelinux-01:~
最终目录结构如下:
/etc/nomad.d/ ├── nomad.hcl └── server.hcl
nomad.hcl文件应包含以下配置:
datacenter = "dc1" data_dir = "/opt/nomad"
server.hcl文件的内容:
server { enabled = true bootstrap_expect = 1 } consul { address = "127.0.0.1:8500" server_service_name = "nomad" client_service_name = "nomad-client" auto_advertise = true server_auto_join = true client_auto_join = true } bind_addr = "127.0.0.1" advertise { http = "172.30.0.5" } client { enabled = true }
不要忘记在第二台服务器上更改配置文件-在那您将需要更改http指令的值。
此阶段的最后一个是Nginx的配置,用于代理和设置http授权。 nomad.conf文件的内容:
upstream nomad-auth { server 172.30.0.5:4646; } server { server_name nomad.domain.name; location / { proxy_pass http://nomad-auth; proxy_set_header Host $host; auth_basic_user_file /etc/nginx/.htpasswd; auth_basic "Password-protected Area"; } }
现在,我们可以通过外部网络访问Web面板。 我们连接并转到服务器页面:
图1. Nomad群集中的服务器列表
两台服务器均成功显示在面板中,这与nomad node status命令的输出相同:
图2. nomad node status命令的输出
那领事呢? 让我们看看。 转到领事控制面板,到节点页面:
图3. Consul集群中的节点列表
现在,我们准备了与领事一起工作的Nomad。 在最后阶段,我们将开始最有趣的部分:我们将配置Docker容器从Gitlab到Nomad的交付,并讨论其其他一些独特功能。
创建Gitlab Runner
为了将Docker映像部署到Nomad,我们将使用内部带有Nomad二进制文件的单独运行程序(在此,顺便说一下,Hashicorp应用程序的另一个功能-分别是唯一的二进制文件)。 将其下载到运行程序目录。 对他来说,创建具有以下内容的最简单的Dockerfile:
FROM alpine:3.9 RUN apk add --update --no-cache libc6-compat gettext COPY nomad /usr/local/bin/nomad
在同一项目中,创建.gitlab-ci.yml:
variables: DOCKER_IMAGE: nomad/nomad-deploy DOCKER_REGISTRY: registry.domain.name stages: - build build: stage: build image: ${DOCKER_REGISTRY}/nomad/alpine:3 script: - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:latest - docker build --pull -t ${tag} -f Dockerfile . - docker push ${tag}
结果,我们将在Gitlab注册表中获得Nomad运行器的可访问图像,现在我们可以直接转到项目存储库,创建管道并配置Nomad作业Nomad。
项目设置
让我们从Nomad的工作文件开始。 我在本文中的项目将非常原始:它将包含一项任务。 .gitlab-ci的内容如下:
variables: NOMAD_ADDR: http://nomad.address.service:4646 DOCKER_REGISTRY: registry.domain.name DOCKER_IMAGE: example/project stages: - build - deploy build: stage: build image: ${DOCKER_REGISTRY}/nomad-runner/alpine:3 script: - tag=${DOCKER_REGISTRY}/${DOCKER_IMAGE}:${CI_COMMIT_SHORT_SHA} - docker build --pull -t ${tag} -f Dockerfile . - docker push ${tag} deploy: stage: deploy image: registry.example.com/nomad/nomad-runner:latest script: - envsubst '${CI_COMMIT_SHORT_SHA}' < project.nomad > job.nomad - cat job.nomad - nomad validate job.nomad - nomad plan job.nomad || if [ $? -eq 255 ]; then exit 255; else echo "success"; fi - nomad run job.nomad environment: name: production allow_failure: false when: manual
此处,部署以手动模式进行,但是您可以对其进行配置以更改项目目录的内容。 管道包括两个阶段:从图像的组装,部署到游牧。 在第一阶段,我们收集docker映像并将其推送到注册表中;在第二阶段,我们在Nomad中启动工作。
job "monitoring-status" { datacenters = ["dc1"] migrate { max_parallel = 3 health_check = "checks" min_healthy_time = "15s" healthy_deadline = "5m" } group "zhadan.ltd" { count = 1 update { max_parallel = 1 min_healthy_time = "30s" healthy_deadline = "5m" progress_deadline = "10m" auto_revert = true } task "service-monitoring" { driver = "docker" config { image = "registry.domain.name/example/project:${CI_COMMIT_SHORT_SHA}" force_pull = true auth { username = "gitlab_user" password = "gitlab_password" } port_map { http = 8000 } } resources { network { port "http" {} } } } } }
请注意,我有一个私有注册表,要成功使用docker镜像池,我需要登录。 在这种情况下,最好的解决方案是在Vault中输入登录名和密码,然后再与Nomad集成。 Nomad本机支持Vault。 但是首先,在Vault本身中,我们将为Nomad安装必要的策略,您可以下载它们:
现在,已经创建了必要的策略,我们将在job.nomad文件的任务块中添加与Vault的集成:
vault { enabled = true address = "https://vault.domain.name:8200" token = "token" }
我使用令牌授权,并将其直接写入此处,在运行漫游代理程序时,还可以选择将令牌指定为变量:
$ VAULT_TOKEN=<token> nomad agent -config /path/to/config
现在我们可以在Vault中使用密钥了。 操作原理很简单:我们在Nomad作业中创建一个文件,该文件将存储变量的值,例如:
template { data = <<EOH {{with secret "secrets/pipeline-keys"}} REGISTRY_LOGIN="{{ .Data.REGISTRY_LOGIN }}" REGISTRY_PASSWORD="{{ .Data.REGISTRY_LOGIN }}{{ end }}" EOH destination = "secrets/service-name.env" env = true }
通过这种简单的方法,您可以配置将容器交付到Nomad群集并在将来使用它。 我要说的是,我在某种程度上对Nomad表示同情-它更适合于Kubernetes可能会带来更多困难并且最终无法发挥潜力的小型项目。 此外,Nomad非常适合初学者-易于安装和配置。 但是,在某些项目上进行测试时,我遇到了其较早版本的问题-许多基本功能根本不存在或它们无法正常工作。 尽管如此,我相信Nomad将继续发展,将来将拥有所有必要的功能。
由Ilya Andreev发表,由Alexei Zhadan和Live Linux Team编辑