18326: Whitespace fixes
[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 "the previous section":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 h4. NVIDIA GPU support
78
79 To specify instance types with NVIDIA GPUs, 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.  The @DeviceCount@ is the number of GPU cores available for this instance type.
97
98 h4. Minimal configuration example for Amazon EC2
99
100 The <span class="userinput">ImageID</span> value is the compute node image that was built in "the previous section":install-compute-node.html#aws.
101
102 <notextile>
103 <pre><code>    Containers:
104       CloudVMs:
105         ImageID: <span class="userinput">ami-01234567890abcdef</span>
106         Driver: ec2
107         DriverParameters:
108           # If you are not using an IAM role for authentication, specify access
109           # credentials here. Otherwise, omit or set AccessKeyID and
110           # SecretAccessKey to an empty value.
111           AccessKeyID: XXXXXXXXXXXXXXXXXXXX
112           SecretAccessKey: YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
113
114           SecurityGroupIDs:
115           - sg-0123abcd
116           SubnetID: subnet-0123abcd
117           Region: us-east-1
118           EBSVolumeType: gp2
119           AdminUsername: arvados
120 </code></pre>
121 </notextile>
122
123 h4. Minimal configuration example for Azure
124
125 Using managed disks:
126
127 The <span class="userinput">ImageID</span> value is the compute node image that was built in "the previous section":install-compute-node.html#azure.
128
129 <notextile>
130 <pre><code>    Containers:
131       CloudVMs:
132         ImageID: <span class="userinput">"zzzzz-compute-v1597349873"</span>
133         Driver: azure
134         # (azure) managed disks: set MaxConcurrentInstanceCreateOps to 20 to avoid timeouts, cf
135         # https://docs.microsoft.com/en-us/azure/virtual-machines/linux/capture-image
136         MaxConcurrentInstanceCreateOps: 20
137         DriverParameters:
138           # Credentials.
139           SubscriptionID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
140           ClientID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
141           ClientSecret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
142           TenantID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
143
144           # Data center where VMs will be allocated
145           Location: centralus
146
147           # The resource group where the VM and virtual NIC will be
148           # created.
149           ResourceGroup: zzzzz
150           NetworkResourceGroup: yyyyy   # only if different from ResourceGroup
151           Network: xxxxx
152           Subnet: xxxxx-subnet-private
153
154           # The resource group where the disk image is stored, only needs to
155           # be specified if it is different from ResourceGroup
156           ImageResourceGroup: aaaaa
157
158 </code></pre>
159 </notextile>
160
161 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.
162
163 Using an image from a shared image gallery:
164
165 <notextile>
166 <pre><code>    Containers:
167       CloudVMs:
168         ImageID: <span class="userinput">"shared_image_gallery_image_definition_name"</span>
169         Driver: azure
170         DriverParameters:
171           # Credentials.
172           SubscriptionID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
173           ClientID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
174           ClientSecret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
175           TenantID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
176
177           # Data center where VMs will be allocated
178           Location: centralus
179
180           # The resource group where the VM and virtual NIC will be
181           # created.
182           ResourceGroup: zzzzz
183           NetworkResourceGroup: yyyyy   # only if different from ResourceGroup
184           Network: xxxxx
185           Subnet: xxxxx-subnet-private
186
187           # The resource group where the disk image is stored, only needs to
188           # be specified if it is different from ResourceGroup
189           ImageResourceGroup: aaaaa
190
191           # (azure) shared image gallery: the name of the gallery
192           SharedImageGalleryName: "shared_image_gallery_1"
193           # (azure) shared image gallery: the version of the image definition
194           SharedImageGalleryImageVersion: "0.0.1"
195
196 </code></pre>
197 </notextile>
198
199 Using unmanaged disks (deprecated):
200
201 The <span class="userinput">ImageID</span> value is the compute node image that was built in "the previous section":install-compute-node.html#azure.
202
203 <notextile>
204 <pre><code>    Containers:
205       CloudVMs:
206         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>
207         Driver: azure
208         DriverParameters:
209           # Credentials.
210           SubscriptionID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
211           ClientID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
212           ClientSecret: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
213           TenantID: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX
214
215           # Data center where VMs will be allocated
216           Location: centralus
217
218           # The resource group where the VM and virtual NIC will be
219           # created.
220           ResourceGroup: zzzzz
221           NetworkResourceGroup: yyyyy   # only if different from ResourceGroup
222           Network: xxxxx
223           Subnet: xxxxx-subnet-private
224
225           # Where to store the VM VHD blobs
226           StorageAccount: example
227           BlobContainer: vhds
228
229 </code></pre>
230 </notextile>
231
232 Get the @SubscriptionID@ and @TenantID@:
233
234 <pre>
235 $ az account list
236 [
237   {
238     "cloudName": "AzureCloud",
239     "id": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX",
240     "isDefault": true,
241     "name": "Your Subscription",
242     "state": "Enabled",
243     "tenantId": "YYYYYYYY-YYYY-YYYY-YYYYYYYY",
244     "user": {
245       "name": "you@example.com",
246       "type": "user"
247     }
248   }
249 ]
250 </pre>
251
252 You will need to create a "service principal" to use as a delegated authority for API access.
253
254 <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>
255 $ az ad sp create "<span class="userinput">appId</span>"
256 (appId is part of the response of the previous command)
257 $ az role assignment create --assignee "<span class="userinput">objectId</span>" --role Owner --scope /subscriptions/{subscriptionId}/
258 (objectId is part of the response of the previous command)
259 </code></pre></notextile>
260
261 Now update your @config.yml@ file:
262
263 @ClientID@ is the 'appId' value.
264
265 @ClientSecret@ is what was provided as <span class="userinput">Your_Password</span>.
266
267 h3. Test your configuration
268
269 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.
270
271 <notextile>
272 <pre><code>~$ <span class="userinput">arvados-server cloudtest && echo "OK!"</span>
273 </code></pre>
274 </notextile>
275
276 Refer to the "cloudtest tool documentation":../../admin/cloudtest.html for more information.
277
278 {% assign arvados_component = 'arvados-dispatch-cloud' %}
279
280 {% include 'install_packages' %}
281
282 {% include 'start_service' %}
283
284 {% include 'restart_api' %}
285
286 h2(#confirm-working). Confirm working installation
287
288 On the dispatch node, start monitoring the arvados-dispatch-cloud logs:
289
290 <notextile>
291 <pre><code>~$ <span class="userinput">sudo journalctl -o cat -fu arvados-dispatch-cloud.service</span>
292 </code></pre>
293 </notextile>
294
295 "Make sure to install the arvados/jobs image.":../install-jobs-image.html
296
297 Submit a simple container request:
298
299 <notextile>
300 <pre><code>shell:~$ <span class="userinput">arv container_request create --container-request '{
301   "name":            "test",
302   "state":           "Committed",
303   "priority":        1,
304   "container_image": "arvados/jobs:latest",
305   "command":         ["echo", "Hello, Crunch!"],
306   "output_path":     "/out",
307   "mounts": {
308     "/out": {
309       "kind":        "tmp",
310       "capacity":    1000
311     }
312   },
313   "runtime_constraints": {
314     "vcpus": 1,
315     "ram": 1048576
316   }
317 }'</span>
318 </code></pre>
319 </notextile>
320
321 This command should return a record with a @container_uuid@ field.  Once @arvados-dispatch-cloud@ polls the API server for new containers to run, you should see it dispatch that same container.
322
323 The @arvados-dispatch-cloud@ API provides 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:
324
325 <notextile>
326 <pre><code>~$ <span class="userinput">curl -sH "Authorization: Bearer $token" http://localhost:9006/arvados/v1/dispatch/containers</span>
327 {
328   "items": [
329     {
330       "container": {
331         "uuid": "zzzzz-dz642-hdp2vpu9nq14tx0",
332         ...
333         "state": "Running",
334         "scheduling_parameters": {
335           "partitions": null,
336           "preemptible": false,
337           "max_run_time": 0
338         },
339         "exit_code": 0,
340         "runtime_status": null,
341         "started_at": null,
342         "finished_at": null
343       },
344       "instance_type": {
345         "Name": "Standard_D2s_v3",
346         "ProviderType": "Standard_D2s_v3",
347         "VCPUs": 2,
348         "RAM": 8589934592,
349         "Scratch": 16000000000,
350         "IncludedScratch": 16000000000,
351         "AddedScratch": 0,
352         "Price": 0.11,
353         "Preemptible": false
354       }
355     }
356   ]
357 }
358 </code></pre>
359 </notextile>
360
361 A similar request can be made to the @http://localhost:9006/arvados/v1/dispatch/instances@ endpoint.
362
363 When the container finishes, the dispatcher will log it.
364
365 After the container finishes, you can get the container record by UUID *from a shell server* to see its results:
366
367 <notextile>
368 <pre><code>shell:~$ <span class="userinput">arv get <b>zzzzz-dz642-hdp2vpu9nq14tx0</b></span>
369 {
370  ...
371  "exit_code":0,
372  "log":"a01df2f7e5bc1c2ad59c60a837e90dc6+166",
373  "output":"d41d8cd98f00b204e9800998ecf8427e+0",
374  "state":"Complete",
375  ...
376 }
377 </code></pre>
378 </notextile>
379
380 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:
381
382 <notextile>
383 <pre><code>~$ <span class="userinput">arv keep ls <b>a01df2f7e5bc1c2ad59c60a837e90dc6+166</b></span>
384 ./crunch-run.txt
385 ./stderr.txt
386 ./stdout.txt
387 ~$ <span class="userinput">arv-get <b>a01df2f7e5bc1c2ad59c60a837e90dc6+166</b>/stdout.txt</span>
388 2016-08-05T13:53:06.201011Z Hello, Crunch!
389 </code></pre>
390 </notextile>
391
392 If the container does not dispatch successfully, refer to the @arvados-dispatch-cloud@ logs for information about why it failed.