22184: Add database access requirement to keep-web install docs.
[arvados.git] / doc / install / crunch2-cloud / install-compute-node.html.textile.liquid
1 ---
2 layout: default
3 navsection: installguide
4 title: Build a cloud compute node image
5 ...
6 {% comment %}
7 Copyright (C) The Arvados Authors. All rights reserved.
8
9 SPDX-License-Identifier: CC-BY-SA-3.0
10 {% endcomment %}
11
12 {% include 'notebox_begin_warning' %}
13 @arvados-dispatch-cloud@ is only relevant for cloud installations. Skip this section if you are installing an on premises cluster that will spool jobs to Slurm or LSF.
14 {% include 'notebox_end' %}
15
16 # "Introduction":#introduction
17 # "Install Packer":#install-packer
18 # "Create an SSH keypair":#sshkeypair
19 # "Compute image requirements":#requirements
20 # "The build script":#building
21 ## "DNS resolution":#dns-resolution
22 ## "NVIDIA GPU support":#nvidia
23 ## "Singularity mksquashfs configuration":#singularity_mksquashfs_configuration
24 ## "apt package version pins":#apt-pins
25 # "Build an AWS image":#aws
26 ## "Autoscaling compute node scratch space":#aws-ebs-autoscaler
27 # "Build an Azure image":#azure
28
29 h2(#introduction). Introduction
30
31 This page describes how to build a compute node image that can be used to run containers dispatched by Arvados in the cloud.
32
33 Packer templates for AWS and Azure are provided with Arvados. To use them, the following are needed:
34
35 * "Packer":https://www.packer.io/
36 * credentials for your cloud account
37 * configuration details for your cloud account
38
39 h2(#install-packer). Install Packer
40
41 "Download Packer here":https://developer.hashicorp.com/packer/downloads
42
43 h2(#sshkeypair). Create a SSH keypair
44
45 @arvados-dispatch-cloud@ communicates with the compute nodes via SSH. To do this securely, a SSH keypair is needed.
46
47 Generate a SSH keypair with no passphrase. The private key needs to be stored in the cluster configuration file (see @Containers/DispatchPrivateKey@) for use by @arvados-dispatch-cloud@, as described in the "next section":install-dispatch-cloud.html#update-config. The public key will be baked into the compute node images, see the cloud-specific documentation below.
48
49 <notextile>
50 <pre><code>~$ <span class="userinput">ssh-keygen -N '' -f ~/.ssh/id_dispatcher</span>
51 Generating public/private rsa key pair.
52 Your identification has been saved in /home/user/.ssh/id_dispatcher.
53 Your public key has been saved in /home/user/.ssh/id_dispatcher.pub.
54 The key fingerprint is:
55 [...]
56 ~$ <span class="userinput">cat ~/.ssh/id_dispatcher</span>
57 -----BEGIN RSA PRIVATE KEY-----
58 MIIEpQIBAAKCAQEAqXoCzcOBkFQ7w4dvXf9B++1ctgZRqEbgRYL3SstuMV4oawks
59 ttUuxJycDdsPmeYcHsKo8vsEZpN6iYsX6ZZzhkO5nEayUTU8sBjmg1ZCTo4QqKXr
60 ...
61 oFyAjVoexx0RBcH6BveTfQtJKbktP1qBO4mXo2dP0cacuZEtlAqW9Eb06Pvaw/D9
62 foktmqOY8MyctzFgXBpGTxPliGjqo8OkrOyQP2g+FL7v+Km31Xs61P8=
63 -----END RSA PRIVATE KEY-----
64 </code></pre>
65 </notextile>
66
67 h2(#requirements). Compute image requirements
68
69 Arvados comes with a build script to automate the creation of a suitable compute node image (see "The build script":#building below). It is provided as a convenience. It is also possible to create a compute node image via other means. These are the requirements:
70
71 * for AWS: the SSH public key for @arvados-dispatch-cloud@ (the one that corresponds with @Containers.DispatchPrivateKey@ in the Arvados config file) needs to go into ~/.ssh/authorized_keys for the SSH user you want @arvados-dispatch-cloud@ to use (cf. @CloudVMs.DriverParameters.AdminUsername@ in the Arvados config file) and that user needs to be able to sudo without password prompt, unless you use `root` in which case sudo is not used.
72 * for Azure: @arvados-dispatch-cloud@ automatically extracts the SSH public key from the value of @Containers.DispatchPrivateKey@ and uses an API call to create the user specified in @CloudVMs.DriverParameters.AdminUsername@ with that SSH public key and password-less sudo enabled.
73 * SSH needs to be running and reachable by @arvados-dispatch-cloud@ on port 22 (or a custom port, see @CloudVMS.SSHPort@ to in the Arvados config file)
74 * the @python3-arvados-fuse@ package needs to be installed
75 * @Docker@ or @Singularity@ needs to be installed (cf. @Containers.RuntimeEngine@ in the Arvados config file).
76 * all available scratch space should be made available under `/tmp`.
77
78 h2(#building). The build script
79
80 The necessary files are located in the @arvados/tools/compute-images@ directory in the source tree. A build script is provided to generate the image. The @--help@ argument lists all available options:
81
82 <notextile><pre><code>~$ <span class="userinput">./build.sh --help</span>
83 build.sh: Build cloud images for arvados-dispatch-cloud
84
85 Syntax:
86         build.sh [options]
87
88 Options:
89
90   --json-file &lt;path&gt;
91       Path to the packer json file (required)
92   --arvados-cluster-id &lt;xxxxx&gt;
93       The ID of the Arvados cluster, e.g. zzzzz(required)
94   --aws-profile &lt;profile&gt;
95       AWS profile to use (valid profile from ~/.aws/config (optional)
96   --aws-secrets-file &lt;path&gt;
97       AWS secrets file which will be sourced from this script (optional)
98       When building for AWS, either an AWS profile or an AWS secrets file
99       must be provided.
100   --aws-source-ami &lt;ami-xxxxxxxxxxxxxxxxx&gt;
101       The AMI to use as base for building the images (required if building for AWS)
102   --aws-region &lt;region&gt; (default: us-east-1)
103       The AWS region to use for building the images
104   --aws-vpc-id &lt;vpc-id&gt;
105       VPC id for AWS, if not specified packer will derive from the subnet id or pick the default one.
106   --aws-subnet-id &lt;subnet-xxxxxxxxxxxxxxxxx&gt;
107       Subnet id for AWS, if not specified packer will pick the default one for the VPC.
108   --aws-ebs-autoscale
109       Install the AWS EBS autoscaler daemon (default: do not install the AWS EBS autoscaler).
110   --aws-associate-public-ip &lt;true|false&gt;
111       Associate a public IP address with the node used for building the compute image.
112       Required when the machine running packer can not reach the node used for building
113       the compute image via its private IP. (default: true if building for AWS)
114       Note: if the subnet has "Auto-assign public IPv4 address" enabled, disabling this
115       flag will have no effect.
116   --aws-ena-support &lt;true|false&gt;
117       Enable enhanced networking (default: true if building for AWS)
118   --gcp-project-id &lt;project-id&gt;
119       GCP project id (required if building for GCP)
120   --gcp-account-file &lt;path&gt;
121       GCP account file (required if building for GCP)
122   --gcp-zone &lt;zone&gt; (default: us-central1-f)
123       GCP zone
124   --azure-secrets-file &lt;patch&gt;
125       Azure secrets file which will be sourced from this script (required if building for Azure)
126   --azure-resource-group &lt;resouce-group&gt;
127       Azure resource group (required if building for Azure)
128   --azure-location &lt;location&gt;
129       Azure location, e.g. centralus, eastus, westeurope (required if building for Azure)
130   --azure-sku &lt;sku&gt; (required if building for Azure, e.g. 16.04-LTS)
131       Azure SKU image to use
132   --ssh_user &lt;user&gt; (default: packer)
133       The user packer will use to log into the image
134   --workdir &lt;path&gt; (default: /tmp)
135       The directory where data files are staged and setup scripts are run
136   --resolver &lt;resolver_IP&gt;
137       The dns resolver for the machine (default: host's network provided)
138   --reposuffix &lt;suffix&gt;
139       Set this to "-dev" to track the unstable/dev Arvados repositories
140   --pin-packages, --no-pin-packages
141       These flags determine whether or not to configure apt pins for Arvados
142       and third-party packages it depends on. By default packages are pinned
143       unless you set `--reposuffix -dev`.
144   --public-key-file &lt;path&gt;
145       Path to the public key file that a-d-c will use to log into the compute node (required)
146   --mksquashfs-mem (default: 256M)
147       Only relevant when using Singularity. This is the amount of memory mksquashfs is allowed to use.
148   --nvidia-gpu-support
149       Install all the necessary tooling for Nvidia GPU support (default: do not install Nvidia GPU support)
150   --debug
151       Output debug information (default: no debug output is printed)
152 </code></pre></notextile>
153
154 The following sections highlight common configuration settings with more information.
155
156 h3(#dns-resolution). DNS resolution
157
158 Compute nodes must be able to resolve the hostnames of the API server and any keepstore servers to your internal IP addresses.  If you are on AWS and using Route 53 for your DNS, the default resolver configuration can be used with no extra options.
159
160 You can also run your own internal DNS resolver. In that case, the IP address of the resolver should be passed as the value for the @--resolver@ argument to "the build script":#building.
161
162 As a third option, the services could be hardcoded into an @/etc/hosts@ file. For example:
163
164 <notextile><pre><code>10.20.30.40     <span class="userinput">ClusterID.example.com</span>
165 10.20.30.41     <span class="userinput">keep1.ClusterID.example.com</span>
166 10.20.30.42     <span class="userinput">keep2.ClusterID.example.com</span>
167 </code></pre></notextile>
168
169 Adding these lines to the @/etc/hosts@ file in the compute node image could be done with a small change to the Packer template and the @scripts/base.sh@ script, which will be left as an exercise for the reader.
170
171 h3(#nvidia). NVIDIA GPU support
172
173 If you plan on using instance types with NVIDIA GPUs, add @--nvidia-gpu-support@ to the build command line.  Arvados uses the same compute image for both GPU and non-GPU instance types.  The GPU tooling is ignored when using the image with a non-GPU instance type.
174
175 {% assign mksquashfs_header = "h3" %}
176 {% assign show_docker_warning = true %}
177 {% include 'singularity_mksquashfs_configuration' %}
178
179 The desired amount of memory to make available for @mksquashfs@ can be configured in an argument to "the build script":#building. It defaults to @256M@.
180
181 h3(#apt-pins). apt package version pins
182
183 By default, unless your image uses development packages with @--reposuffix -dev@, the build script configures apt with version pins for Arvados and third-party packages it depends on. This ensures that everything apt installs has been tested and is known to work with your version of Arvados. The version pins have some flexibility to allow apt to install security updates and other changes that are unlikely to interfere with Arvados.
184
185 You can explicitly control whether or not these version pins are configured with the @--pin-packages@ and @--no-pin-packages@ flags. You should only need to use these flags if you are doing development work on the compute image and specifically want to test compatibility with different versions.
186
187 h2(#aws). Build an AWS image
188
189 For @ClusterID@, fill in your cluster ID.
190
191 @AWSProfile@ is the name of an AWS profile in your "credentials file":https://docs.aws.amazon.com/sdk-for-go/v1/developer-guide/configuring-sdk.html#shared-credentials-file (@~/.aws/credentials@) listing the @aws_access_key_id@ and @aws_secret_access_key@ to use.
192
193 The @AMI@ is the identifier for the base image to be used. Current AMIs are maintained by "Debian":https://wiki.debian.org/Cloud/AmazonEC2Image/Buster and "Ubuntu":https://cloud-images.ubuntu.com/locator/ec2/.
194
195 The @VPC@ and @Subnet@ should be configured for where you want the compute image to be generated and stored.
196
197 @ArvadosDispatchCloudPublicKeyPath@ should be replaced with the path to the ssh *public* key file generated in "Create an SSH keypair":#sshkeypair, above.
198
199 <notextile><pre><code>~$ <span class="userinput">./build.sh --json-file arvados-images-aws.json \
200            --arvados-cluster-id ClusterID \
201            --aws-profile AWSProfile \
202            --aws-source-ami AMI \
203            --aws-vpc-id VPC \
204            --aws-subnet-id Subnet \
205            --ssh_user admin \
206            --public-key-file ArvadosDispatchCloudPublicKeyPath
207 </span></code></pre></notextile>
208
209 h3(#aws-ebs-autoscaler). Autoscaling compute node scratch space
210
211 Arvados supports "AWS EBS autoscaler":https://github.com/awslabs/amazon-ebs-autoscale.  This feature automatically expands the scratch space on the compute node on demand by 200 GB at a time, up to 5 TB.
212
213 If you want to add the daemon in your images, add the @--aws-ebs-autoscale@ flag to the "the build script":#building.
214
215 The AWS EBS autoscaler daemon will be installed with this configuration:
216
217 <notextile><pre><code>{
218     "mountpoint": "/tmp",
219     "filesystem": "lvm.ext4",
220     "lvm": {
221       "volume_group": "autoscale_vg",
222       "logical_volume": "autoscale_lv"
223     },
224     "volume": {
225         "type": "gp3",
226         "iops": 3000,
227         "encrypted": 1
228     },
229     "detection_interval": 2,
230     "limits": {
231         "max_ebs_volume_size": 1500,
232         "max_logical_volume_size": 8000,
233         "max_ebs_volume_count": 16
234     },
235     "logging": {
236         "log_file": "/var/log/ebs-autoscale.log",
237         "log_interval": 300
238     }
239 }
240 </code></pre></notextile>
241
242 Changing the ebs-autoscale configuration is left as an exercise for the reader.
243
244 This feature also requires a few Arvados configuration changes, described in "EBS Autoscale configuration":install-dispatch-cloud.html#aws-ebs-autoscaler.
245
246 h2(#azure). Build an Azure image
247
248 <notextile><pre><code>~$ <span class="userinput">./build.sh --json-file arvados-images-azure.json \
249            --arvados-cluster-id ClusterID \
250            --azure-resource-group ResourceGroup \
251            --azure-location AzureRegion \
252            --azure-sku AzureSKU \
253            --azure-secrets-file AzureSecretsFilePath \
254            --resolver ResolverIP \
255            --public-key-file ArvadosDispatchCloudPublicKeyPath
256 </span></code></pre></notextile>
257
258 For @ClusterID@, fill in your cluster ID. The @ResourceGroup@ and @AzureRegion@ (e.g. 'eastus2') should be configured for where you want the compute image to be generated and stored. The @AzureSKU@ is the SKU of the base image to be used, e.g. '18.04-LTS' for Ubuntu 18.04.
259
260 @AzureSecretsFilePath@ should be replaced with the path to a shell script that loads the Azure secrets with sufficient permissions to create the image. The file would look like this:
261
262 <notextile><pre><code>export ARM_CLIENT_ID=...
263 export ARM_CLIENT_SECRET=...
264 export ARM_SUBSCRIPTION_ID=...
265 export ARM_TENANT_ID=...
266 </code></pre></notextile>
267
268 These secrets can be generated from the Azure portal, or with the cli using a command like this:
269
270 <notextile><pre><code>~$ <span class="userinput">az ad sp create-for-rbac --name Packer --password ...</span>
271 </code></pre></notextile>
272
273 @ArvadosDispatchCloudPublicKeyPath@ should be replaced with the path to the ssh *public* key file generated in "Create an SSH keypair":#sshkeypair, above.