Set up a Nomad Cluster on Azure
This tutorial will guide you through deploying a Nomad cluster with access control lists (ACLs) enabled on Azure. Consider checking out the cluster setup overview first as it covers the contents of the code repository used in this tutorial.
Prerequisites
For this tutorial, you will need:
- Packer 1.7.7 or later installed locally
- Terraform 1.2.0 or later installed locally
- Nomad 1.3.3 or later installed locally
- An Azure account and the
az
CLI tool installed locally
Note
This tutorial creates Azure resources that may not qualify as part of the Azure free tier. Be sure to follow the Cleanup process at the end of this tutorial so you don't incur any additional unnecessary charges.
Clone the code repository
The cluster setup code repository contains configuration files for creating a Nomad cluster on Azure. It uses Consul for the initial setup of the Nomad servers and clients and enables ACLs for both Consul and Nomad.
Clone the code repository.
Navigate to the cloned repository folder.
Check out the v0.2
tag of the repository as a local branch named nomad-cluster
.
Navigate to the azure
folder.
Set up your local environment
Before you begin, you will need to set up your environment. This includes a variables file with configurations for Packer and Terraform as well as the az
CLI.
Rename variables.hcl.example
to variables.hcl
. You will update the variables in the file with values from the az
commands that follow.
Warning
The .gitignore
file in the example repo is set to ignore variables.hcl
so your configurations will not get pushed to your source code repository if you choose to do so. Do not commit sensitive data like credentials to your source code repository.
Open your terminal, log in to Azure with az
, and follow the prompts to complete the login process.
Copy the values for id
and tenantId
and paste them into the variables.hcl
file as values for subscription_id
and tenant_id
. For this example, the value for subscription_id
would be 0e3e2e88-47a3-4107-a2b2-f325314dfb67
and tenant_id
would be 1e472a2a-7ab3-9bd1-2016-a32fd04dfb29
.
Next, create an Azure service principal with the value of subscription_id
in the --scopes
argument.
Copy the values for appId
and password
and paste them into the variables.hcl
file as values for client_id
and client_secret
. For this example, the value for client_id
would be ab3cb7b2-c932-4eb7-89ce-a369de998a37
and client_secret
would be UVq8Q~7VPT9hIVYQ6QCtmCfUyNOTLoaIsze8IdwS
.
Update the location
variable with your Azure location preference.
Update the retry_join
variable with the values for subscription_id
, tenant_id
, client_id
, and client_secret
.
Tip
Newlines have been added to the code snippet below for readability - you do not need to add newlines to the retry_join
variable.
Create a resource group with your same Azure location preference as above. In this example, the resource group name is nomad-cluster-rg
.
Then, create a storage account for the Packer image in the resource group. In this example, the storage account name is nomadvms
.
Update the resource_group_name
and storage_account
variables with the names you chose for them in the above commands. In this example, resource_group_name
is nomad-cluster-rg
and storage_account
is nomadvms
.
The variables.hcl
file now contains values for each of the variables except for image_name
, which will come from the Packer build in the next section.
Create the Nomad cluster
There are two main steps to creating the cluster: building a virtual machine image with Packer and provisioning the cluster infrastructure with Terraform.
Build the VM image
Initialize Packer to download the required plugins.
Tip
packer init
returns no output when it finishes successfully.
Then, build the image and provide the variables file with the -var-file
flag.
Tip
Packer will print out a Warning: Undefined variable
message notifying you that some variables were set in variables.hcl
but not used, this is only a warning. The build will still complete sucessfully.
Update the variables file for Terraform
Open variables.hcl
in your text editor and update image_name
with the value output for ManagedImageName
from the Packer build. In this example, the value would be hashistack.20221202190723
.
Then, open your terminal and use the built-in uuid()
function of the Terraform console to generate two new UUIDs for the token's credentials.
Copy these UUIDs and update the nomad_consul_token_id
and nomad_consul_token_secret
variables with the UUID values. Save the file.
In this example, the value for nomad_consul_token_id
would be a90a52ae-bcb7-e38a-5fe9-6ac084b37078
and the value for nomad_consul_token_secret
would be d14d6a73-a0f1-508d-6d64-6b0f79e5cb44
.
The remaining variables in variables.hcl
are optional.
- Â
allowlist_ip
is a CIDR range specifying which IP addresses are allowed to access the Consul and Nomad UIs on ports8500
and4646
as well as SSH on port22
. The default value of0.0.0.0/0
will allow traffic from everywhere.
Note
We recommend that you update allowlist_ip
to your machine's IP address or a range of trusted IPs.
- Â
admin_password
is the password for theubuntu
account on the server and client machines and can be used to access the machines over SSH.
Warning
We recommend that you update admin_password
to a different value.
- Â
name
is a prefix for naming the Azure resources. - Â
server_instance_type
andclient_instance_type
are the virtual machine instance types for the cluster server and client nodes, respectively. - Â
server_count
andclient_count
are the number of nodes to create for the servers and clients, respectively.
Deploy the Nomad cluster
Initialize Terraform to download required plugins and set up the workspace.
Provision the resources and provide the variables file with the -var-file
flag. Respond yes
to the prompt to confirm the operation. The provisioning takes several minutes. Once complete, the Consul and Nomad web interfaces will become available.
Verify the services are in a healthy state. Navigate to the Consul UI in your web browser with the link in the Terraform output.
Click on the Log in button and use the bootstrap token secret consul_bootstrap_token_secret
from the Terraform output to log in.
Click on the Nodes page from the sidebar navigation. There are six healthy nodes, including three Consul servers and three Consul clients created with Terraform.
Set up access to Nomad
Run the post-setup.sh
script.
Warning
If the nomad.token
file already exists from a previous run, the script won't work until the token file has been deleted. Delete the file manually and re-run the script or use rm nomad.token && ./post-script.sh
.
Note
It may take some time for the setup scripts to complete and for the Nomad user token to become available in the Consul KV store. If the post-setup.sh
script doesn't work the first time, wait a couple of minutes and try again.
Apply the export
commands from the output.
Finally, verify connectivity to the cluster with nomad node status
You can navigate to the Nomad UI in your web browser with the link in the post-setup.sh
script output. From there, log in with the bootstrap token saved in the NOMAD_TOKEN
environment variable by setting the Secret ID to the token's value and clicking on the Clients page from the sidebar navigation.
Cleanup
Use terraform destroy
to remove the provisioned infrastructure. Respond yes
to the prompt to confirm removal.
Next Steps
In this tutorial you created a Nomad cluster on Azure with Consul and ACLs enabled. From here, you may want to:
- Run a job with a Nomad spec file or with Nomad Pack
- Test out native service discovery in Nomad
For more information, check out the following resources.
- Learn more about managing your Nomad cluster
- Read more about the ACL stanza and using ACLs