Project

General

Profile

Dispatching containers to cloud VMs » History » Version 22

Tom Clegg, 10/16/2018 08:10 PM

1 1 Tom Clegg
h1. Dispatching containers to cloud VMs
2
3 6 Tom Clegg
(Draft)
4 1 Tom Clegg
5 11 Tom Clegg
{{>toc}}
6
7 7 Tom Clegg
h2. Component name / purpose
8 1 Tom Clegg
9 7 Tom Clegg
crunch-dispatch-cloud runs Arvados user containers on generic public cloud infrastructure by automatically creating and destroying VMs of various sizes according to demand, preparing the VMs' runtime environments, and running containers on them.
10 1 Tom Clegg
11 12 Tom Clegg
h2. Deployment
12
13 21 Tom Clegg
*Where to install:* The crunch-dispatch-cloud process can run anywhere, as long as it has network access to the Arvados controller, the cloud provider's API, and the worker VMs. Each Arvados cluster should run only one crunch-dispatch-cloud process (future versions will support multiple dispatchers).
14
15
*SSH key:* The installer must generate an SSH private key, with no passphrase, for the dispatcher to use when connecting to cloud VMs. The private key is stored in the cluster configuration file. It does not need to be saved in @~/.ssh/@.
16
17
*Cloud VM image:* The installer must provide a VM image with an SSH server on port 22, reachable by the dispatcher. The dispatcher's SSH public key must be listed in @/root/.ssh/authorized_keys@. The image should also include suitable versions of docker and crunch-run. _(Alternatively, it is possible to install these using a custom boot probe command, but pre-installing is more efficient.)_
18 22 Tom Clegg
* (Future) Configurable SSH port number.
19
* (Future) Automatically sync the crunch-run binary from the dispatcher host to each worker node.
20 12 Tom Clegg
21 9 Tom Clegg
h2. Overview of operation
22 1 Tom Clegg
23 9 Tom Clegg
The dispatcher waits for containers to appear in the queue, and runs them on appropriately sized cloud VMs. When there are no idle cloud VMs with the desired size, the dispatcher brings up more VMs using the cloud provider's API. The dispatcher also shuts down idle VMs that exceed the configured idle timer -- and sooner if the provider starts refusing to create new VMs.
24 1 Tom Clegg
25 6 Tom Clegg
h2. Interaction with other components
26 1 Tom Clegg
27 9 Tom Clegg
Controller (backed by RailsAPI and PostgreSQL) supplies the container queue: which containers the system should be trying to execute (or cancel) at any given time.
28 1 Tom Clegg
29 6 Tom Clegg
The cloud provider's API supplies a list of VMs that exist (or are being created) at a given time and their network addresses, accepts orders to create new VMs, updates instance tags, and (optionally, depending on the driver) obtains the VMs' SSH server public keys.
30 1 Tom Clegg
31 6 Tom Clegg
The SSH server on each cloud VM allows the dispatcher to authenticate with a private key and execute shell commands as root.
32 1 Tom Clegg
33 6 Tom Clegg
h2. Configuration
34 1 Tom Clegg
35 6 Tom Clegg
Arvados configuration (currently a file in /etc) supplies cloud provider credentials, allowed node types, spending limits/policies, etc.
36 1 Tom Clegg
37 6 Tom Clegg
<pre><code class="yaml">
38
    CloudVMs:
39 8 Tom Clegg
      BootProbeCommand: "docker ps -q"
40
      SyncInterval: 1m    # get list of 
41
      TimeoutIdle: 1m     # shutdown if idle longer than this
42
      TimeoutBooting: 10m # shutdown if exists longer than this without running BootProbeCommand successfully
43
      TimeoutProbe: 2m    # shutdown if (after booting) communication fails longer than this, even if ctrs are running
44
      TimeoutShutdown: 1m # shutdown again if node still exists this long after shutdown
45 6 Tom Clegg
      Driver: Amazon
46 8 Tom Clegg
      DriverParameters:   # following configs are driver dependent
47 6 Tom Clegg
        Region: us-east-1
48
        APITimeout: 20s
49
        EC2Key: abcdef
50
        EC2Secret: abcdefghijklmnopqrstuvwxyz
51
        StorageKey: abcdef
52
        StorageSecret: abcdefghijklmnopqrstuvwxyz
53
        ImageID: ami-0123456789abcdef0
54 1 Tom Clegg
        SubnetID: subnet-01234567
55
        SecurityGroups: sg-01234567
56 8 Tom Clegg
    Dispatch:
57
      StaleLockTimeout: 1m     # after restart, time to wait for workers to come up before abandoning locks from previous run
58
      PollInterval: 1m         # how often to get latest queue from arvados controller
59
      ProbeInterval: 10s       # how often to probe each instance for current status/vital signs
60
      MaxProbesPerSecond: 1000 # limit total probe rate for dispatch process (across all instances)
61
      PrivateKey: |            # SSH key able to log in as root@ worker VMs
62
        -----BEGIN RSA PRIVATE KEY-----
63
        MIIEowIBAAKCAQEAqYm4XsQHm8sBSZFwUX5VeW1OkGsfoNzcGPG2nzzYRhNhClYZ
64
        0ABHhUk82HkaC/8l6d/jpYTf42HrK42nNQ0r0Yzs7qw8yZMQioK4Yk+kFyVLF78E
65
        GRG4pGAWXFs6pUchs/lm8fo9zcda4R3XeqgI+NO+nEERXmdRJa1FhI+Za3/S/+CV
66
        mg+6O00wZz2+vKmDPptGN4MCKmQOCKsMJts7wSZGyVcTtdNv7jjfr6yPAIOIL8X7
67
        LtarBCFaK/pD7uWll/Uj7h7D8K48nIZUrvBJJjXL8Sm4LxCNoz3Z83k8J5ZzuDRD
68
        gRiQe/C085mhO6VL+2fypDLwcKt1tOL8fI81MwIDAQABAoIBACR3tEnmHsDbNOav
69
        Oxq8cwRQh9K2yDHg8BMJgz/TZa4FIx2HEbxVIw0/iLADtJ+Z/XzGJQCIiWQuvtg6
70
        exoFQESt7JUWRWkSkj9JCQJUoTY9Vl7APtBpqG7rIEQzd3TvzQcagZNRQZQO6rR7
71
        p8sBdBSZ72lK8cJ9tM3G7Kor/VNK7KgRZFNhEWnmvEa3qMd4hzDcQ4faOn7C9NZK
72
        dwJAuJVVfwOLlOORYcyEkvksLaDOK2DsB/p0AaCpfSmThRbBKN5fPXYaKgUdfp3w
73
        70Hpp27WWymb1cgjyqSH3DY+V/kvid+5QxgxCBRq865jPLn3FFT9bWEVS/0wvJRj
74
        iMIRrjECgYEA4Ffv9rBJXqVXonNQbbstd2PaprJDXMUy9/UmfHL6pkq1xdBeuM7v
75
        yf2ocXheA8AahHtIOhtgKqwv/aRhVK0ErYtiSvIk+tXG+dAtj/1ZAKbKiFyxjkZV
76
        X72BH7cTlR6As5SRRfWM/HaBGEgED391gKsI5PyMdqWWdczT5KfxAksCgYEAwXYE
77
        ewPmV1GaR5fbh2RupoPnUJPMj36gJCnwls7sGaXDQIpdlq56zfKgrLocGXGgj+8f
78
        QH7FHTJQO15YCYebtsXWwB3++iG43gVlJlecPAydsap2CCshqNWC5JU5pan0QzsP
79
        exzNzWqfUPSbTkR2SRaN+MenZo2Y/WqScOAth7kCgYBgVoLujW9EXH5QfXJpXLq+
80
        jTvE38I7oVcs0bJwOLPYGzcJtlwmwn6IYAwohgbhV2pLv+EZSs42JPEK278MLKxY
81
        lgVkp60npgunFTWroqDIvdc1TZDVxvA8h9VeODEJlSqxczgbMcIUXBM9yRctTI+5
82
        7DiKlMUA4kTFW2sWwuOlFwKBgGXvrYS0FVbFJKm8lmvMu5D5x5RpjEu/yNnFT4Pn
83
        G/iXoz4Kqi2PWh3STl804UF24cd1k94D7hDoReZCW9kJnz67F+C67XMW+bXi2d1O
84
        JIBvlVfcHb1IHMA9YG7ZQjrMRmx2Xj3ce4RVPgUGHh8ra7gvLjd72/Tpf0doNClN
85
        ti/hAoGBAMW5D3LhU05LXWmOqpeT4VDgqk4MrTBcstVe7KdVjwzHrVHCAmI927vI
86 1 Tom Clegg
        pjpphWzpC9m3x4OsTNf8m+g6H7f3IiQS0aiFNtduXYlcuT5FHS2fSATTzg5PBon9
87
        1E6BudOve+WyFyBs7hFWAqWFBdWujAl4Qk5Ek09U2ilFEPE7RTgJ
88
        -----END RSA PRIVATE KEY-----
89 9 Tom Clegg
    InstanceTypes:
90
    - Name: m4.large
91
      VCPUs: 2
92
      RAM: 7782000000
93
      Scratch: 32000000000
94
      Price: 0.1
95
    - Name: m4.large.spot
96
      Preemptible: true
97
      VCPUs: 2
98
      RAM: 7782000000
99
      Scratch: 32000000000
100
      Price: 0.1
101
    - Name: m4.xlarge
102
      VCPUs: 4
103
      RAM: 15564000000
104
      Scratch: 80000000000
105
      Price: 0.2
106
    - Name: m4.xlarge.spot
107
      Preemptible: true
108
      VCPUs: 4
109
      RAM: 15564000000
110
      Scratch: 80000000000
111
      Price: 0.2
112
    - Name: m4.2xlarge
113
      VCPUs: 8
114
      RAM: 31129000000
115
      Scratch: 160000000000
116
      Price: 0.4
117
    - Name: m4.2xlarge.spot
118
      Preemptible: true
119
      VCPUs: 8
120
      RAM: 31129000000
121
      Scratch: 160000000000
122
      Price: 0.4
123 6 Tom Clegg
</code></pre>
124 1 Tom Clegg
125 10 Tom Clegg
h2. Management API
126 1 Tom Clegg
127 10 Tom Clegg
APIs for monitoring/diagnostics/control are available via HTTP on a configurable address/port. Request headers must include "Authorization: Bearer {management token}".
128
129
Responses are JSON-encoded and resemble other Arvados APIs:
130
<pre><code class="json">
131
{
132
  "Items": [
133
    {
134
      "Name": "...",
135
      ...
136
    },
137
    ...
138
  ]
139
}
140
</code></pre>
141
142
@GET /arvados/v1/dispatch/instances@ lists cloud VMs. Each returned item includes:
143
* provider's instance ID
144
* hourly price (from configuration file)
145
* instance type (from configuration file)
146
* instance type (from provider's menu)
147
* UUID of the current / most recent container attempted (if known)
148
* time last container finished (or boot time, if nothing run yet)
149
150
@GET /arvados/v1/dispatch/containers@ lists queued/locked/running containers. Each returned item includes:
151
* container UUID
152
* container state (Queued/Locked/Running/Complete/Cancelled)
153
* desired instance type
154
* time appeared in queue
155
* time started (if started)
156
157
@POST /arvados/v1/dispatch/instances/:instance_id/drain@ puts an instance in "drain" state.
158
* if the instance is currently running a container, it is allowed to continue
159
* no further containers will be scheduled on the instance
160
* (TBD) the instance will not be shut down automatically
161
162
@POST /arvados/v1/dispatch/instances/:instance_id/shutdown@ puts an instance in "shutdown" state.
163
* if the instance is currently running a container, the instance is shut down when the container finishes
164
* otherwise, the instance is shut down immediately
165
166
h2. Metrics
167
168 13 Tom Clegg
Metrics are available via HTTP on a configurable address/port (conventionally :9005). Request headers must include "Authorization: Bearer {management token}".
169 10 Tom Clegg
170
Metrics include:
171 13 Tom Clegg
* [future] (summary) time elapsed between VM creation and first successful SSH connection to that VM
172
* [future] (summary) time elapsed between first successful SSH connection on a VM and ready to run a container on that VM
173 10 Tom Clegg
* (gauge) total hourly price of all existing VMs
174
* (gauge) total VCPUs and memory allocated to containers
175 1 Tom Clegg
* (gauge) number of containers running
176 10 Tom Clegg
* (gauge) number of containers allocated to VMs but not started yet (because VMs are pending/booting)
177
* (gauge) number of containers not allocated to VMs (because provider quota is reached)
178 13 Tom Clegg
179 14 Tom Clegg
h2. Logs
180
181 20 Tom Clegg
For purposes of troubleshooting, a JSON-formatted log entry is printed on stderr when...
182 16 Tom Clegg
183 20 Tom Clegg
|                                                              |...including timestamp and...|
184 16 Tom Clegg
|a new instance is created/ordered                             |instance type name|
185
|an instance appears on the provider's list of instances       |instance ID|
186
|an instance's boot probe succeeds                             |instance ID|
187
|an instance is shut down after boot timeout                   |instance ID, stdout/stderr/error from last boot probe attempt|
188
|an instance shutdown is requested                             |instance ID|
189
|an instance disappears from the provider's list of instances  |instance ID and previous state (booting/idle/shutdown)|
190
|a cloud provider API or driver error occurs                   |provider/driver's error message|
191
|a new container appears in the Arvados queue                  |container UUID, desired instance type name|
192
|a container is locked by the dispatcher                       |container UUID|
193
|a crunch-run process is started on an instance                |container UUID, instance ID, crunch-run PID|
194
|a crunch-run process fails to start on an instance            |container UUID, instance ID, stdout/stderr/exitcode|
195
|a crunch-run process ends                                     |container UUID, instance ID|
196
|an active container's state changes to Complete or Cancelled  |container UUID, new state|
197
|an active container is requeued after being locked            |container UUID|  
198
|an Arvados API error occurs                                   |error message|
199
200 14 Tom Clegg
201
(Example log entries should be shown here)
202
203
If the dispatcher starts with a non-empty ARVADOS_DEBUG environment variable, it also prints more detailed logs about other internal state changes, using level=debug.
204 10 Tom Clegg
205
h2. Internal details
206
207
h3. Scheduling policy
208
209 6 Tom Clegg
The container priority field determines the order in which resources are allocated.
210
* If container C1 has priority P1,
211
* ...and C2 has higher priority P2,
212
* ...and there is no pending/booting/idle VM suitable for running C2,
213
* ...then C1 will not be started.
214
215
However, containers that run on different VM types don't necessarily start in priority order.
216 1 Tom Clegg
* If container C1 has priority P1,
217
* ...and C2 has higher priority P2,
218 5 Peter Amstutz
* ...and there is no idle VM suitable for running C2,
219 6 Tom Clegg
* ...and there is a pending/booting VM that will be suitable for running C2 when it comes up,
220
* ...and there is an idle VM suitable for running C1,
221 1 Tom Clegg
* ...then C1 will start before C2.
222 6 Tom Clegg
223 10 Tom Clegg
h3. Special cases / synchronizing state
224 1 Tom Clegg
225 6 Tom Clegg
When first starting up, dispatcher inspects API server’s container queue and the cloud provider’s list of dispatcher-tagged cloud nodes, and restores internal state accordingly.
226
227 10 Tom Clegg
Some containers might have state=Locked at startup. The dispatcher can't be sure these have no corresponding crunch-run process anywhere until it establishes communication with all running instances. To avoid breaking priority order by guessing wrong, the dispatcher avoids scheduling any new containers until all such "stale-locked" containers are matched up with crunch-run processes on existing VMs (typically preparing a docker image) or all of the existing VMs have been probed successfully (meaning the locked containers aren't running anywhere and need to be rescheduled).
228 6 Tom Clegg
229 1 Tom Clegg
When a user cancels a container request with state=Locked or Running, the container priority changes to 0. On its next poll, the dispatcher notices this and kills any corresponding crunch-run processes (or, if there is no such process, just unlocks the container).
230 4 Peter Amstutz
231 6 Tom Clegg
When a crunch-run process ends without finalizing its container's state, the dispatcher notices this and sets state to Cancelled.
232
233 10 Tom Clegg
h3. SSH keys
234 5 Peter Amstutz
235 10 Tom Clegg
The operator must install a public key in /root/.ssh/authorized_keys on each worker node. Dispatcher has the corresponding private key.
236 5 Peter Amstutz
237 6 Tom Clegg
(Future) Dispatcher generates its own keys and installs its public key on new VMs using cloud provider bootstrapping/metadata features.
238 4 Peter Amstutz
239
h3. Probes
240 5 Peter Amstutz
241
Sometimes (on the happy path) the dispatcher knows the state of each worker, whether it's idle, and which container it's running. In general, it's necessary to probe the worker node itself.
242
243
Probe:
244
* Check whether the SSH connection is alive; reopen if needed.
245
* Run the configured "ready?" command (e.g., "grep /encrypted-tmp /etc/mtab"); if this fails, conclude the node is still booting.
246
* Run "crunch-run --list" to get a list of crunch-run supervisors (pid + container UUID)
247
248 6 Tom Clegg
h3. Detecting dead/lame nodes
249 5 Peter Amstutz
250 10 Tom Clegg
If a node has been up for N seconds without a successful probe, despite at least M attempts, it is shut down, even if it was running a container last time it was contacted successfully.
251 5 Peter Amstutz
252 6 Tom Clegg
h3. Multiple dispatchers
253 5 Peter Amstutz
254 6 Tom Clegg
Not supported in initial version.