21700: Install Bundler system-wide in Rails postinst
[arvados.git] / doc / install / crunch2-cloud / install-dispatch-cloud.html.textile.liquid
1 ---
2 layout: default
3 navsection: installguide
4 title: Install the cloud dispatcher
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 # "Create compute node VM image":#create-image
18 # "Update config.yml":#update-config
19 # "Install arvados-dispatch-cloud":#install-packages
20 # "Start the service":#start-service
21 # "Restart the API server and controller":#restart-api
22 # "Confirm working installation":#confirm-working
23
24 h2(#introduction). Introduction
25
26 The cloud dispatch service is for running containers on cloud VMs. It works with Microsoft Azure and Amazon EC2; future versions will also support Google Compute Engine.
27
28 The cloud dispatch service can run on any node that can connect to the Arvados API service, the cloud provider's API, and the SSH service on cloud VMs.  It is not resource-intensive, so you can run it on the API server node.
29
30 More detail about the internal operation of the dispatcher can be found in the "architecture section":{{site.baseurl}}/architecture/dispatchcloud.html.
31
32 h2(#update-config). Update config.yml
33
34 h3. Configure CloudVMs
35
36 Add or update the following portions of your cluster configuration file, @config.yml@. Refer to "config.defaults.yml":{{site.baseurl}}/admin/config.html for information about additional configuration options. The @DispatchPrivateKey@ should be the *private* key generated in "Create a SSH keypair":install-compute-node.html#sshkeypair .
37
38 <notextile>
39 <pre><code>    Services:
40       DispatchCloud:
41         InternalURLs:
42           "http://localhost:9006": {}
43     Containers:
44       CloudVMs:
45         # BootProbeCommand is a shell command that succeeds when an instance is ready for service
46         BootProbeCommand: "sudo systemctl status docker"
47
48         <b># --- driver-specific configuration goes here --- see Amazon and Azure examples below ---</b>
49
50       DispatchPrivateKey: |
51         -----BEGIN RSA PRIVATE KEY-----
52         MIIEpQIBAAKCAQEAqXoCzcOBkFQ7w4dvXf9B++1ctgZRqEbgRYL3SstuMV4oawks
53         ttUuxJycDdsPmeYcHsKo8vsEZpN6iYsX6ZZzhkO5nEayUTU8sBjmg1ZCTo4QqKXr
54         FJ+amZ7oYMDof6QEdwl6KNDfIddL+NfBCLQTVInOAaNss7GRrxLTuTV7HcRaIUUI
55         jYg0Ibg8ZZTzQxCvFXXnjseTgmOcTv7CuuGdt91OVdoq8czG/w8TwOhymEb7mQlt
56         lXuucwQvYgfoUgcnTgpJr7j+hafp75g2wlPozp8gJ6WQ2yBWcfqL2aw7m7Ll88Nd
57         [...]
58         oFyAjVoexx0RBcH6BveTfQtJKbktP1qBO4mXo2dP0cacuZEtlAqW9Eb06Pvaw/D9
59         foktmqOY8MyctzFgXBpGTxPliGjqo8OkrOyQP2g+FL7v+Km31Xs61P8=
60         -----END RSA PRIVATE KEY-----
61     InstanceTypes:
62       x1md:
63         ProviderType: x1.medium
64         VCPUs: 8
65         RAM: 64GiB
66         IncludedScratch: 64GB
67         Price: 0.62
68       x1lg:
69         ProviderType: x1.large
70         VCPUs: 16
71         RAM: 128GiB
72         IncludedScratch: 128GB
73         Price: 1.23
74 </code></pre>
75 </notextile>
76
77 h3(#GPUsupport). NVIDIA GPU support
78
79 To specify instance types with NVIDIA GPUs, "the compute image must be built with CUDA support":install-compute-node.html#nvidia , and you must include an additional @CUDA@ section:
80
81 <notextile>
82 <pre><code>    InstanceTypes:
83       g4dn:
84         ProviderType: g4dn.xlarge
85         VCPUs: 4
86         RAM: 16GiB
87         IncludedScratch: 125GB
88         Price: 0.56
89         CUDA:
90           DriverVersion: "11.4"
91           HardwareCapability: "7.5"
92           DeviceCount: 1
93 </code></pre>
94 </notextile>
95
96 The @DriverVersion@ is the version of the CUDA toolkit installed in your compute image (in X.Y format, do not include the patchlevel).  The @HardwareCapability@ is the "CUDA compute capability of the GPUs available for this instance type":https://developer.nvidia.com/cuda-gpus.  The @DeviceCount@ is the number of GPU cores available for this instance type.
97
98 h3(#aws-ebs-autoscaler). EBS Autoscale configuration
99
100 See "Autoscaling compute node scratch space":install-compute-node.html#aws-ebs-autoscaler for details about compute image configuration.
101
102 The @Containers.InstanceTypes@ list should be modified so that all @AddedScratch@ lines are removed, and the @IncludedScratch@ value should be set to 5 TB. This way, the scratch space requirements will be met by all the defined instance type. For example:
103
104 <notextile><pre><code>    InstanceTypes:
105       c5large:
106         ProviderType: c5.large
107         VCPUs: 2
108         RAM: 4GiB
109         IncludedScratch: 5TB
110         Price: 0.085
111       m5large:
112         ProviderType: m5.large
113         VCPUs: 2
114         RAM: 8GiB
115         IncludedScratch: 5TB
116         Price: 0.096
117 ...
118 </code></pre></notextile>
119
120 You will also need to create an IAM role in AWS with these permissions:
121
122 <notextile><pre><code>{
123     "Statement": [
124         {
125             "Effect": "Allow",
126             "Action": [
127                 "ec2:AttachVolume",
128                 "ec2:DescribeVolumeStatus",
129                 "ec2:DescribeVolumes",
130                 "ec2:DescribeTags",
131                 "ec2:ModifyInstanceAttribute",
132                 "ec2:DescribeVolumeAttribute",
133                 "ec2:CreateVolume",
134                 "ec2:DeleteVolume",
135                 "ec2:CreateTags"
136             ],
137             "Resource": "*"
138         }
139     ]
140 }
141 </code></pre></notextile>
142
143 Then set @Containers.CloudVMs.DriverParameters.IAMInstanceProfile@ to the name of the IAM role. This will make @arvados-dispatch-cloud@ pass an IAM instance profile to the compute nodes when they start up, giving them sufficient permissions to attach and grow EBS volumes.
144
145 h3. AWS Credentials for Local Keepstore on Compute node
146
147 When @Containers.LocalKeepBlobBuffersPerVCPU@ is non-zero, the compute node will spin up a local Keepstore service for direct storage access. If Keep is backed by S3, the compute node will need to be able to access the S3 bucket.
148
149 If the AWS credentials for S3 access are configured in @config.yml@ (i.e. @Volumes.DriverParameters.AccessKeyID@ and @Volumes.DriverParameters.SecretAccessKey@), these credentials will be made available to the local Keepstore on the compute node to access S3 directly and no further configuration is necessary.
150
151 Alternatively, if an IAM role is configured in @config.yml@ (i.e. @Volumes.DriverParameters.IAMRole@), the name of an instance profile that corresponds to this role ("often identical to the name of the IAM role":https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#ec2-instance-profile) must be configured in the @CloudVMs.DriverParameters.IAMInstanceProfile@ parameter.
152
153 *If you are also using EBS Autoscale feature, the role in IAMInstanceProfile must have both ec2 and s3 permissions.*
154
155 Finally, if @config.yml@ does not have @Volumes.DriverParameters.AccessKeyID@, @Volumes.DriverParameters.SecretAccessKey@ or @Volumes.DriverParameters.IAMRole@ defined, Keepstore uses the IAM role attached to the node, whatever it may be called. The @CloudVMs.DriverParameters.IAMInstanceProfile@ parameter must then still be configured with the name of a profile whose IAM role has permission to access the S3 bucket(s). That way, @arvados-dispatch-cloud@ can attach the IAM role to the compute node as it is created.
156
157 h3. Minimal configuration example for Amazon EC2
158
159 The <span class="userinput">ImageID</span> value is the compute node image that was built in "the previous section":install-compute-node.html#aws.
160
161 <notextile>
162 <pre><code>    Containers:
163       CloudVMs:
164         ImageID: <span class="userinput">ami-01234567890abcdef</span>
165         Driver: ec2
166         DriverParameters:
167           # If you are not using an IAM role for authentication, specify access
168           # credentials here. Otherwise, omit or set AccessKeyID and
169           # SecretAccessKey to an empty value.
170           AccessKeyID: XXXXXXXXXXXXXXXXXXXX
171           SecretAccessKey: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
172
173           SecurityGroupIDs:
174           - sg-0123abcd
175           SubnetID: subnet-0123abcd
176           Region: us-east-1
177           EBSVolumeType: gp2
178           AdminUsername: arvados
179 </code></pre>
180 </notextile>
181
182 h3(#IAM). Example IAM policy for cloud dispatcher
183
184 Example policy for the IAM role used by the cloud dispatcher:
185
186 <notextile>
187 <pre>
188 {
189     "Id": "arvados-dispatch-cloud policy",
190     "Statement": [
191         {
192             "Effect": "Allow",
193             "Action": [
194                   "ec2:CreateTags",
195                   "ec2:Describe*",
196                   "ec2:CreateImage",
197                   "ec2:CreateKeyPair",
198                   "ec2:ImportKeyPair",
199                   "ec2:DeleteKeyPair",
200                   "ec2:RunInstances",
201                   "ec2:StopInstances",
202                   "ec2:TerminateInstances",
203                   "ec2:ModifyInstanceAttribute",
204                   "ec2:CreateSecurityGroup",
205                   "ec2:DeleteSecurityGroup",
206                   "iam:PassRole"
207             ],
208             "Resource": "*"
209         }
210     ]
211 }
212 </pre>
213 </notextile>
214
215 h3. Minimal configuration example for Azure
216
217 Using managed disks:
218
219 The <span class="userinput">ImageID</span> value is the compute node image that was built in "the previous section":install-compute-node.html#azure.
220
221 <notextile>
222 <pre><code>    Containers:
223       CloudVMs:
224         ImageID: <span class="userinput">"zzzzz-compute-v1597349873"</span>
225         Driver: azure
226         # (azure) managed disks: set MaxConcurrentInstanceCreateOps to 20 to avoid timeouts, cf
227         # https://docs.microsoft.com/en-us/azure/virtual-machines/linux/capture-image
228         MaxConcurrentInstanceCreateOps: 20
229         DriverParameters:
230           # Credentials.
231           SubscriptionID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
232           ClientID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
233           ClientSecret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
234           TenantID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
235
236           # Data center where VMs will be allocated
237           Location: centralus
238
239           # The resource group where the VM and virtual NIC will be
240           # created.
241           ResourceGroup: zzzzz
242           NetworkResourceGroup: yyyyy   # only if different from ResourceGroup
243           Network: xxxxx
244           Subnet: xxxxx-subnet-private
245
246           # The resource group where the disk image is stored, only needs to
247           # be specified if it is different from ResourceGroup
248           ImageResourceGroup: aaaaa
249
250 </code></pre>
251 </notextile>
252
253 Azure recommends using managed images. If you plan to start more than 20 VMs simultaneously, Azure recommends using a shared image gallery instead to avoid slowdowns and timeouts during the creation of the VMs.
254
255 Using an image from a shared image gallery:
256
257 <notextile>
258 <pre><code>    Containers:
259       CloudVMs:
260         ImageID: <span class="userinput">"shared_image_gallery_image_definition_name"</span>
261         Driver: azure
262         DriverParameters:
263           # Credentials.
264           SubscriptionID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
265           ClientID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
266           ClientSecret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
267           TenantID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
268
269           # Data center where VMs will be allocated
270           Location: centralus
271
272           # The resource group where the VM and virtual NIC will be
273           # created.
274           ResourceGroup: zzzzz
275           NetworkResourceGroup: yyyyy   # only if different from ResourceGroup
276           Network: xxxxx
277           Subnet: xxxxx-subnet-private
278
279           # The resource group where the disk image is stored, only needs to
280           # be specified if it is different from ResourceGroup
281           ImageResourceGroup: aaaaa
282
283           # (azure) shared image gallery: the name of the gallery
284           SharedImageGalleryName: "shared_image_gallery_1"
285           # (azure) shared image gallery: the version of the image definition
286           SharedImageGalleryImageVersion: "0.0.1"
287
288 </code></pre>
289 </notextile>
290
291 Using unmanaged disks (deprecated):
292
293 The <span class="userinput">ImageID</span> value is the compute node image that was built in "the previous section":install-compute-node.html#azure.
294
295 <notextile>
296 <pre><code>    Containers:
297       CloudVMs:
298         ImageID: <span class="userinput">"https://zzzzzzzz.blob.core.windows.net/system/Microsoft.Compute/Images/images/zzzzz-compute-osDisk.55555555-5555-5555-5555-555555555555.vhd"</span>
299         Driver: azure
300         DriverParameters:
301           # Credentials.
302           SubscriptionID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
303           ClientID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
304           ClientSecret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
305           TenantID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
306
307           # Data center where VMs will be allocated
308           Location: centralus
309
310           # The resource group where the VM and virtual NIC will be
311           # created.
312           ResourceGroup: zzzzz
313           NetworkResourceGroup: yyyyy   # only if different from ResourceGroup
314           Network: xxxxx
315           Subnet: xxxxx-subnet-private
316
317           # Where to store the VM VHD blobs
318           StorageAccount: example
319           BlobContainer: vhds
320
321 </code></pre>
322 </notextile>
323
324 Get the @SubscriptionID@ and @TenantID@:
325
326 <pre>
327 $ az account list
328 [
329   {
330     "cloudName": "AzureCloud",
331     "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX",
332     "isDefault": true,
333     "name": "Your Subscription",
334     "state": "Enabled",
335     "tenantId": "YYYYYYYY-YYYY-YYYY-YYYYYYYY",
336     "user": {
337       "name": "you@example.com",
338       "type": "user"
339     }
340   }
341 ]
342 </pre>
343
344 You will need to create a "service principal" to use as a delegated authority for API access.
345
346 <notextile><pre><code>$ az ad app create --display-name "Arvados Dispatch Cloud (<span class="userinput">ClusterID</span>)" --homepage "https://arvados.org" --identifier-uris "https://<span class="userinput">ClusterID.example.com</span>" --end-date 2299-12-31 --password <span class="userinput">Your_Password</span>
347 $ az ad sp create "<span class="userinput">appId</span>"
348 (appId is part of the response of the previous command)
349 $ az role assignment create --assignee "<span class="userinput">objectId</span>" --role Owner --scope /subscriptions/{subscriptionId}/
350 (objectId is part of the response of the previous command)
351 </code></pre></notextile>
352
353 Now update your @config.yml@ file:
354
355 @ClientID@ is the 'appId' value.
356
357 @ClientSecret@ is what was provided as <span class="userinput">Your_Password</span>.
358
359 h3. Test your configuration
360
361 Run the @cloudtest@ tool to verify that your configuration works. This creates a new cloud VM, confirms that it boots correctly and accepts your configured SSH private key, and shuts it down.
362
363 <notextile>
364 <pre><code>~$ <span class="userinput">arvados-server cloudtest && echo "OK!"</span>
365 </code></pre>
366 </notextile>
367
368 Refer to the "cloudtest tool documentation":../../admin/cloudtest.html for more information.
369
370 {% assign arvados_component = 'arvados-dispatch-cloud' %}
371
372 {% include 'install_packages' %}
373
374 {% include 'start_service' %}
375
376 {% include 'restart_api' %}
377
378 h2(#confirm-working). Confirm working installation
379
380 On the dispatch node, start monitoring the arvados-dispatch-cloud logs:
381
382 <notextile>
383 <pre><code># <span class="userinput">journalctl -o cat -fu arvados-dispatch-cloud.service</span>
384 </code></pre>
385 </notextile>
386
387 In another terminal window, use the diagnostics tool to run a simple container.
388
389 <notextile>
390 <pre><code># <span class="userinput">arvados-client sudo diagnostics</span>
391 INFO       5: running health check (same as `arvados-server check`)
392 INFO      10: getting discovery document from https://zzzzz.arvadosapi.com/discovery/v1/apis/arvados/v1/rest
393 ...
394 INFO     160: running a container
395 INFO      ... container request submitted, waiting up to 10m for container to run
396 </code></pre>
397 </notextile>
398
399 After performing a number of other quick tests, this will submit a new container request and wait for it to finish.
400
401 While the diagnostics tool is waiting, the @arvados-dispatch-cloud@ logs will show details about creating a cloud instance, waiting for it to be ready, and scheduling the new container on it.
402
403 You can also use the "arvados-dispatch-cloud API":{{site.baseurl}}/api/dispatch.html to get a list of queued and running jobs and cloud instances. Use your @ManagementToken@ to test the dispatcher's endpoint. For example, when one container is running:
404
405 <notextile>
406 <pre><code>~$ <span class="userinput">curl -sH "Authorization: Bearer $token" http://localhost:9006/arvados/v1/dispatch/containers</span>
407 {
408   "items": [
409     {
410       "container": {
411         "uuid": "zzzzz-dz642-hdp2vpu9nq14tx0",
412         ...
413         "state": "Running",
414         "scheduling_parameters": {
415           "partitions": null,
416           "preemptible": false,
417           "max_run_time": 0
418         },
419         "exit_code": 0,
420         "runtime_status": null,
421         "started_at": null,
422         "finished_at": null
423       },
424       "instance_type": {
425         "Name": "Standard_D2s_v3",
426         "ProviderType": "Standard_D2s_v3",
427         "VCPUs": 2,
428         "RAM": 8589934592,
429         "Scratch": 16000000000,
430         "IncludedScratch": 16000000000,
431         "AddedScratch": 0,
432         "Price": 0.11,
433         "Preemptible": false
434       }
435     }
436   ]
437 }
438 </code></pre>
439 </notextile>
440
441 A similar request can be made to the @http://localhost:9006/arvados/v1/dispatch/instances@ endpoint.
442
443 After the container finishes, you can get the container record by UUID *from a shell server* to see its results:
444
445 <notextile>
446 <pre><code>shell:~$ <span class="userinput">arv get <b>zzzzz-dz642-hdp2vpu9nq14tx0</b></span>
447 {
448  ...
449  "exit_code":0,
450  "log":"a01df2f7e5bc1c2ad59c60a837e90dc6+166",
451  "output":"d41d8cd98f00b204e9800998ecf8427e+0",
452  "state":"Complete",
453  ...
454 }
455 </code></pre>
456 </notextile>
457
458 You can use standard Keep tools to view the container's output and logs from their corresponding fields.  For example, to see the logs from the collection referenced in the @log@ field:
459
460 <notextile>
461 <pre><code>~$ <span class="userinput">arv keep ls <b>a01df2f7e5bc1c2ad59c60a837e90dc6+166</b></span>
462 ./crunch-run.txt
463 ./stderr.txt
464 ./stdout.txt
465 ~$ <span class="userinput">arv-get <b>a01df2f7e5bc1c2ad59c60a837e90dc6+166</b>/stdout.txt</span>
466 2016-08-05T13:53:06.201011Z Hello, Crunch!
467 </code></pre>
468 </notextile>
469
470 If the container does not dispatch successfully, refer to the @arvados-dispatch-cloud@ logs for information about why it failed.