Dispatching containers to cloud VMs » History » Version 65
Tom Clegg, 03/26/2019 03:19 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 | 53 | Tom Clegg | arvados-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 | 49 | Tom Clegg | h2. Overview of operation |
12 | |||
13 | 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. |
||
14 | |||
15 | h2. Interaction with other components |
||
16 | |||
17 | 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. |
||
18 | |||
19 | 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. |
||
20 | |||
21 | 57 | Tom Clegg | The SSH server on each cloud VM allows the dispatcher to authenticate with a private key and execute shell commands as root (either directly or via sudo). |
22 | 49 | Tom Clegg | |
23 | h2. Instance tags |
||
24 | |||
25 | The dispatcher relies on the cloud provider's tagging feature to persist state across server restarts. |
||
26 | * {"InstanceType": "foo"} indicates that the instance was created with the specs from the instance type named "foo" in the cluster configuration file. |
||
27 | 50 | Tom Clegg | * {"IdleBehavior": "hold"} indicates that the management API has been used to put the instance in "hold" state. |
28 | 58 | Tom Clegg | * {"InstanceSecret": "ad23b6a8912f2b75d8a5e6887fbcb82f8024daea"} is a random string used to verify the instance's SSH host key. |
29 | 49 | Tom Clegg | |
30 | Provider-specific drivers (Amazon, Google, Azure) determine exactly how these tags are encoded in the cloud API, and can use tags to persist their own internal state as well. For example, a driver might save tags named "Arvados-DispatchCloud-InstanceType" rather than just "InstanceType". |
||
31 | |||
32 | 23 | Tom Clegg | h2. Deployment |
33 | 24 | Tom Clegg | |
34 | 53 | Tom Clegg | *Where to install:* The arvados-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 arvados-dispatch-cloud process. |
35 | 9 | Tom Clegg | * Future versions will support multiple dispatchers. |
36 | 1 | Tom Clegg | |
37 | 9 | Tom Clegg | *Dispatcher's SSH key:* The operator must generate an SSH key pair for the dispatcher to use when connecting to cloud VMs. The private key is stored (without a passphrase) in the cluster configuration file. It does not need to be saved in @~/.ssh/@. |
38 | 1 | Tom Clegg | |
39 | 56 | Tom Clegg | *Cloud VM image:* The operator must provide a VM image with an SSH server on a port reachable by the dispatcher (default 22, configurable per cluster). The dispatcher's SSH public key must be listed in @/root/.ssh/authorized_keys@. The image should also include systemd-cat (part of systemd) and suitable versions of docker and crunch-run. The @/var/lock@ directory must be available for lockfiles with names matching "@crunch-run-*.*@". |
40 | 1 | Tom Clegg | * It is possible to install docker and crunch-run using a custom boot probe command, but pre-installing is more efficient. |
41 | * Future versions will automatically sync the crunch-run binary from the dispatcher host to each worker node. |
||
42 | 56 | Tom Clegg | * The Azure driver creates a new admin user account and installs the SSH public key by itself so @/root/.ssh/authorized_keys@ is not needed. The VM image must include @sudo@. |
43 | 1 | Tom Clegg | |
44 | 6 | Tom Clegg | *Cloud provider account:* The dispatcher uses cloud provider credentials to create and delete VMs and other cloud resources. An Arvados user can create an arbitrary number of long-running containers, and the dispatcher will try to run all of them. Currently the dispatcher does not enforce any resource limits of its own, so the operator must ensure the cloud provider itself is enforcing a suitable quota. |
45 | 53 | Tom Clegg | |
46 | 52 | Tom Clegg | *Migrating from nodemanager/SLURM:* When VM images, SSH keys, and configuration files are ready, disable nodemanager and crunch-dispatch-slurm. Install arvados-dispatch-cloud deb/rpm package. Confirm success with @systemctl status arvados-dispatch-cloud@ and @journalctl -fu arvados-dispatch-cloud@. See [[Migrating from arvados-node-manager to arvados-dispatch-cloud]]. |
47 | 1 | Tom Clegg | |
48 | 6 | Tom Clegg | h2. Configuration |
49 | 1 | Tom Clegg | |
50 | 42 | Tom Clegg | Arvados [[Cluster configuration]] (currently a file in /etc) supplies cloud provider credentials, allowed node types, spending limits/policies, etc. |
51 | 1 | Tom Clegg | |
52 | 6 | Tom Clegg | <pre><code class="yaml"> |
53 | CloudVMs: |
||
54 | 1 | Tom Clegg | BootProbeCommand: "docker ps -q" |
55 | 42 | Tom Clegg | SSHPort: 22 |
56 | 27 | Tom Clegg | SyncInterval: 1m # how often to get list of active instances from cloud provider |
57 | 8 | Tom Clegg | TimeoutIdle: 1m # shutdown if idle longer than this |
58 | TimeoutBooting: 10m # shutdown if exists longer than this without running BootProbeCommand successfully |
||
59 | TimeoutProbe: 2m # shutdown if (after booting) communication fails longer than this, even if ctrs are running |
||
60 | TimeoutShutdown: 1m # shutdown again if node still exists this long after shutdown |
||
61 | 6 | Tom Clegg | Driver: Amazon |
62 | 8 | Tom Clegg | DriverParameters: # following configs are driver dependent |
63 | 6 | Tom Clegg | Region: us-east-1 |
64 | 59 | Tom Clegg | AccessKeyID: abcdef |
65 | SecretAccessKey: abcdefghijklmnopqrstuvwxyz |
||
66 | 39 | Tom Clegg | SubnetID: subnet-01234567 |
67 | 59 | Tom Clegg | SecurityGroupIDs: sg-01234567 |
68 | AdminUsername: ubuntu |
||
69 | EBSVolumeType: gp2 |
||
70 | 8 | Tom Clegg | Dispatch: |
71 | StaleLockTimeout: 1m # after restart, time to wait for workers to come up before abandoning locks from previous run |
||
72 | PollInterval: 1m # how often to get latest queue from arvados controller |
||
73 | ProbeInterval: 10s # how often to probe each instance for current status/vital signs |
||
74 | MaxProbesPerSecond: 1000 # limit total probe rate for dispatch process (across all instances) |
||
75 | PrivateKey: | # SSH key able to log in as root@ worker VMs |
||
76 | -----BEGIN RSA PRIVATE KEY----- |
||
77 | MIIEowIBAAKCAQEAqYm4XsQHm8sBSZFwUX5VeW1OkGsfoNzcGPG2nzzYRhNhClYZ |
||
78 | 0ABHhUk82HkaC/8l6d/jpYTf42HrK42nNQ0r0Yzs7qw8yZMQioK4Yk+kFyVLF78E |
||
79 | GRG4pGAWXFs6pUchs/lm8fo9zcda4R3XeqgI+NO+nEERXmdRJa1FhI+Za3/S/+CV |
||
80 | mg+6O00wZz2+vKmDPptGN4MCKmQOCKsMJts7wSZGyVcTtdNv7jjfr6yPAIOIL8X7 |
||
81 | LtarBCFaK/pD7uWll/Uj7h7D8K48nIZUrvBJJjXL8Sm4LxCNoz3Z83k8J5ZzuDRD |
||
82 | gRiQe/C085mhO6VL+2fypDLwcKt1tOL8fI81MwIDAQABAoIBACR3tEnmHsDbNOav |
||
83 | Oxq8cwRQh9K2yDHg8BMJgz/TZa4FIx2HEbxVIw0/iLADtJ+Z/XzGJQCIiWQuvtg6 |
||
84 | exoFQESt7JUWRWkSkj9JCQJUoTY9Vl7APtBpqG7rIEQzd3TvzQcagZNRQZQO6rR7 |
||
85 | p8sBdBSZ72lK8cJ9tM3G7Kor/VNK7KgRZFNhEWnmvEa3qMd4hzDcQ4faOn7C9NZK |
||
86 | dwJAuJVVfwOLlOORYcyEkvksLaDOK2DsB/p0AaCpfSmThRbBKN5fPXYaKgUdfp3w |
||
87 | 70Hpp27WWymb1cgjyqSH3DY+V/kvid+5QxgxCBRq865jPLn3FFT9bWEVS/0wvJRj |
||
88 | iMIRrjECgYEA4Ffv9rBJXqVXonNQbbstd2PaprJDXMUy9/UmfHL6pkq1xdBeuM7v |
||
89 | yf2ocXheA8AahHtIOhtgKqwv/aRhVK0ErYtiSvIk+tXG+dAtj/1ZAKbKiFyxjkZV |
||
90 | X72BH7cTlR6As5SRRfWM/HaBGEgED391gKsI5PyMdqWWdczT5KfxAksCgYEAwXYE |
||
91 | ewPmV1GaR5fbh2RupoPnUJPMj36gJCnwls7sGaXDQIpdlq56zfKgrLocGXGgj+8f |
||
92 | QH7FHTJQO15YCYebtsXWwB3++iG43gVlJlecPAydsap2CCshqNWC5JU5pan0QzsP |
||
93 | exzNzWqfUPSbTkR2SRaN+MenZo2Y/WqScOAth7kCgYBgVoLujW9EXH5QfXJpXLq+ |
||
94 | jTvE38I7oVcs0bJwOLPYGzcJtlwmwn6IYAwohgbhV2pLv+EZSs42JPEK278MLKxY |
||
95 | lgVkp60npgunFTWroqDIvdc1TZDVxvA8h9VeODEJlSqxczgbMcIUXBM9yRctTI+5 |
||
96 | 7DiKlMUA4kTFW2sWwuOlFwKBgGXvrYS0FVbFJKm8lmvMu5D5x5RpjEu/yNnFT4Pn |
||
97 | G/iXoz4Kqi2PWh3STl804UF24cd1k94D7hDoReZCW9kJnz67F+C67XMW+bXi2d1O |
||
98 | JIBvlVfcHb1IHMA9YG7ZQjrMRmx2Xj3ce4RVPgUGHh8ra7gvLjd72/Tpf0doNClN |
||
99 | ti/hAoGBAMW5D3LhU05LXWmOqpeT4VDgqk4MrTBcstVe7KdVjwzHrVHCAmI927vI |
||
100 | 1 | Tom Clegg | pjpphWzpC9m3x4OsTNf8m+g6H7f3IiQS0aiFNtduXYlcuT5FHS2fSATTzg5PBon9 |
101 | 1E6BudOve+WyFyBs7hFWAqWFBdWujAl4Qk5Ek09U2ilFEPE7RTgJ |
||
102 | -----END RSA PRIVATE KEY----- |
||
103 | 9 | Tom Clegg | InstanceTypes: |
104 | - Name: m4.large |
||
105 | VCPUs: 2 |
||
106 | RAM: 7782000000 |
||
107 | 59 | Tom Clegg | IncludedScratch: 32000000000 |
108 | 9 | Tom Clegg | Price: 0.1 |
109 | - Name: m4.large.spot |
||
110 | Preemptible: true |
||
111 | VCPUs: 2 |
||
112 | RAM: 7782000000 |
||
113 | 59 | Tom Clegg | IncludedScratch: 32000000000 |
114 | 9 | Tom Clegg | Price: 0.1 |
115 | - Name: m4.xlarge |
||
116 | VCPUs: 4 |
||
117 | RAM: 15564000000 |
||
118 | 59 | Tom Clegg | IncludedScratch: 80000000000 |
119 | 9 | Tom Clegg | Price: 0.2 |
120 | - Name: m4.xlarge.spot |
||
121 | Preemptible: true |
||
122 | VCPUs: 4 |
||
123 | RAM: 15564000000 |
||
124 | 59 | Tom Clegg | IncludedScratch: 80000000000 |
125 | 9 | Tom Clegg | Price: 0.2 |
126 | - Name: m4.2xlarge |
||
127 | VCPUs: 8 |
||
128 | RAM: 31129000000 |
||
129 | 59 | Tom Clegg | IncludedScratch: 160000000000 |
130 | 9 | Tom Clegg | Price: 0.4 |
131 | - Name: m4.2xlarge.spot |
||
132 | Preemptible: true |
||
133 | VCPUs: 8 |
||
134 | RAM: 31129000000 |
||
135 | 59 | Tom Clegg | IncludedScratch: 160000000000 |
136 | 9 | Tom Clegg | Price: 0.4 |
137 | 6 | Tom Clegg | </code></pre> |
138 | 1 | Tom Clegg | |
139 | 10 | Tom Clegg | h2. Management API |
140 | 1 | Tom Clegg | |
141 | 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}". |
142 | |||
143 | Responses are JSON-encoded and resemble other Arvados APIs: |
||
144 | <pre><code class="json"> |
||
145 | { |
||
146 | 43 | Tom Clegg | "items": [ |
147 | 10 | Tom Clegg | { |
148 | 43 | Tom Clegg | "name": "...", |
149 | 10 | Tom Clegg | ... |
150 | }, |
||
151 | ... |
||
152 | ] |
||
153 | } |
||
154 | </code></pre> |
||
155 | |||
156 | @GET /arvados/v1/dispatch/instances@ lists cloud VMs. Each returned item includes: |
||
157 | * provider's instance ID |
||
158 | * hourly price (from configuration file) |
||
159 | * instance type (from configuration file) |
||
160 | * instance type (from provider's menu) |
||
161 | * UUID of the current / most recent container attempted (if known) |
||
162 | * time last container finished (or boot time, if nothing run yet) |
||
163 | |||
164 | @GET /arvados/v1/dispatch/containers@ lists queued/locked/running containers. Each returned item includes: |
||
165 | * container UUID |
||
166 | * container state (Queued/Locked/Running/Complete/Cancelled) |
||
167 | * desired instance type |
||
168 | * time appeared in queue |
||
169 | * time started (if started) |
||
170 | |||
171 | 54 | Tom Clegg | @POST /arvados/v1/dispatch/instances/hold?instance_id=X@ puts an instance in "hold" state. |
172 | 34 | Tom Clegg | * if the instance is currently running a container, it is allowed to continue |
173 | * no further containers will be scheduled on the instance |
||
174 | * the instance will not be shut down automatically |
||
175 | |||
176 | 54 | Tom Clegg | @POST /arvados/v1/dispatch/instances/drain?instance_id=X@ puts an instance in "drain" state. |
177 | 1 | Tom Clegg | * if the instance is currently running a container, it is allowed to continue |
178 | * no further containers will be scheduled on the instance |
||
179 | 34 | Tom Clegg | * the instance will be shut down automatically when all containers finish |
180 | 1 | Tom Clegg | |
181 | 55 | Tom Clegg | @POST /arvados/v1/dispatch/instances/run?instance_id=X@ puts an instance in the default "run" state. |
182 | * if the instance is currently running a container, it is allowed to continue |
||
183 | * more containers will be scheduled on the instance when it becomes available |
||
184 | * the instance will be shut down automatically when it exceeds the configured idle timeout |
||
185 | |||
186 | 61 | Tom Clegg | @POST /arvados/v1/dispatch/instances/kill?instance_id=X@ shuts down an instance immediately. |
187 | 1 | Tom Clegg | * the instance is terminated immediately via cloud API |
188 | 34 | Tom Clegg | * SIGTERM is sent to the container if one is running, but no effort is made to give it time to end gracefully before terminating the instance |
189 | 54 | Tom Clegg | |
190 | †@POST /arvados/v1/dispatch/loglevel?level=debug@ sets the logging threshold to "debug" or "info". |
||
191 | * @.../loglevel?level=debug@ enables debug logs |
||
192 | * @.../loglevel?level=info@ disables debug logs |
||
193 | 47 | Tom Clegg | |
194 | 10 | Tom Clegg | h2. Metrics |
195 | 13 | Tom Clegg | |
196 | 63 | Tom Clegg | Metrics are available via HTTP on a configurable address/port (conventionally :9006). Request headers must include "Authorization: Bearer {management token}". |
197 | 10 | Tom Clegg | |
198 | 13 | Tom Clegg | Metrics include: |
199 | 1 | Tom Clegg | * (gauge) number of existing VMs |
200 | 35 | Tom Clegg | * (gauge) total hourly price of all existing VMs |
201 | 46 | Tom Clegg | * (gauge) total VCPUs and memory in all existing VMs |
202 | 1 | Tom Clegg | * (gauge) total VCPUs and memory allocated to containers |
203 | * (gauge) number of containers running |
||
204 | 46 | Tom Clegg | * †(gauge) number of containers allocated to VMs but not started yet (because VMs are pending/booting) |
205 | * †(gauge) number of containers not allocated to VMs (because provider quota is reached) |
||
206 | 62 | Tom Clegg | * (gauge) total hourly price of VMs, partitioned by allocation state (booting, running, idle, shutdown) |
207 | 46 | Tom Clegg | * †(summary) time elapsed between VM creation and first successful SSH connection to that VM |
208 | * †(summary) time elapsed between first successful SSH connection on a VM and ready to run a container on that VM |
||
209 | * †(summary) time elapsed between first shutdown attempt on a VM and its disappearance from the provider listing |
||
210 | 60 | Tom Clegg | * †(summary) wait times (between seeing a container in the queue or requeueing, and starting its crunch-run process on a worker) across previous starts |
211 | * †(gauge) longest wait time of any unstarted container |
||
212 | 46 | Tom Clegg | |
213 | † not yet implemented |
||
214 | |||
215 | 14 | Tom Clegg | h2. Logs |
216 | 20 | Tom Clegg | |
217 | 16 | Tom Clegg | For purposes of troubleshooting, a JSON-formatted log entry is printed on stderr when... |
218 | 20 | Tom Clegg | |
219 | 44 | Tom Clegg | | |... if loglevel ≥ ...|...including timestamp and...| |
220 | |a new instance is created/ordered |info |instance type name| |
||
221 | |an instance appears on the provider's list of instances |info |instance ID| |
||
222 | |an instance's boot probe succeeds |info |instance ID| |
||
223 | |an instance is shut down after boot timeout |warn |instance ID, †stdout/stderr/error from last boot probe attempt| |
||
224 | |an instance shutdown is requested |info |instance ID| |
||
225 | |an instance disappears from the provider's list of instances |info |instance ID and previous state (booting/idle/shutdown)| |
||
226 | |a cloud provider API or driver error occurs |error |provider/driver's error message| |
||
227 | 64 | Tom Clegg | |a new container appears in the Arvados queue |info |container UUID, desired instance type name| |
228 | 45 | Tom Clegg | |a container is locked by the dispatcher |debug |container UUID| |
229 | 44 | Tom Clegg | |a crunch-run process is started on an instance |info |container UUID, instance ID, crunch-run PID| |
230 | |a crunch-run process fails to start on an instance |info |container UUID, instance ID, stdout/stderr/exitcode| |
||
231 | |a crunch-run process ends |info |container UUID, instance ID| |
||
232 | |an active container's state changes to Complete or Cancelled |info |container UUID, new state| |
||
233 | |an active container is requeued after being locked |info |container UUID| |
||
234 | |an Arvados API error occurs |warn |error message| |
||
235 | 16 | Tom Clegg | |
236 | 44 | Tom Clegg | † not yet implemented |
237 | 1 | Tom Clegg | |
238 | 51 | Tom Clegg | Example log entries from test suite (note test suite uses text formatting, production logging uses JSON formatting): |
239 | <pre> |
||
240 | INFO[0000] creating new instance ContainerUUID=zzzzz-dz642-000000000000160 InstanceType=type8 |
||
241 | INFO[0000] instance appeared in cloud IdleBehavior=run Instance=stub-providertype8-6ec34c367674cb74 InstanceType=type8 State=booting |
||
242 | INFO[0000] boot probe succeeded Command=true Instance=stub-providertype8-6ec34c367674cb74 InstanceType=type8 stderr= stdout= |
||
243 | INFO[0000] instance booted; will try probeRunning Instance=stub-providertype8-6ec34c367674cb74 InstanceType=type8 ProbeStart="2019-02-05 15:49:49.183431341 -0500 EST m=+0.126074285" |
||
244 | INFO[0000] probes succeeded, instance is in service Instance=stub-providertype8-6ec34c367674cb74 InstanceType=type8 ProbeStart="2019-02-05 15:49:49.183431341 -0500 EST m=+0.126074285" RunningContainers=0 State=idle |
||
245 | INFO[0000] crunch-run process started ContainerUUID=zzzzz-dz642-000000000000160 Instance=stub-providertype8-6ec34c367674cb74 InstanceType=type8 Priority=20 |
||
246 | INFO[0000] container finished ContainerUUID=zzzzz-dz642-000000000000160 State=Complete |
||
247 | ... |
||
248 | INFO[0002] shutdown idle worker Age=151.615512ms IdleBehavior=run Instance=stub-providertype8-6ec34c367674cb74 InstanceType=type8 State=idle |
||
249 | INFO[0002] instance disappeared in cloud Instance=stub-providertype8-6ec34c367674cb74 WorkerState=shutdown |
||
250 | </pre> |
||
251 | 14 | Tom Clegg | |
252 | 10 | Tom Clegg | 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. |
253 | |||
254 | h2. Internal details |
||
255 | |||
256 | 38 | Tom Clegg | h3. Worker lifecycle |
257 | |||
258 | <pre> |
||
259 | 41 | Tom Clegg | |
260 | ┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ |
||
261 | │ │ |
||
262 | │ create() returns ID │ want=drain |
||
263 | │ ┌───────────────────────────────────────────────────────────────────────────┐ ┌────────────────────────────┼─────────────────────────────────────────┐ |
||
264 | │ │ ∨ │ │ ∨ |
||
265 | │ ┌─────────────┐ appears in cloud list ┌─────────┐ create() returns ID ┌─────────┐ boot+run probes succeed ┌──────┐ container starts ┌─────────┐ container ends, want=drain ┌──────────┐ instance disappears from cloud ┌──────┐ |
||
266 | │ │ Nonexistent │ ───────────────────────> │ Unknown │ ─────────────────────> │ Booting │ ─────────────────────────> │ │ ──────────────────> │ Running │ ────────────────────────────> │ │ ────────────────────────────────> │ Gone │ |
||
267 | │ └─────────────┘ └─────────┘ └─────────┘ │ │ └─────────┘ │ │ └──────┘ |
||
268 | │ │ │ │ idle timeout │ │ |
||
269 | │ │ │ Idle │ ────────────────────────────────────────────────────────────> │ Shutdown │ |
||
270 | │ │ │ │ │ │ |
||
271 | │ │ │ │ probe timeout │ │ |
||
272 | │ │ │ │ ────────────────────────────────────────────────────────────> │ │ |
||
273 | │ │ └──────┘ └──────────┘ |
||
274 | │ │ ∧ boot timeout ∧ |
||
275 | │ └─────────────────────────────────────────────────────────────────────────┼──────────────────────────────────────────────────────────────────────┘ |
||
276 | │ │ |
||
277 | │ container ends │ |
||
278 | └───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘</pre> |
||
279 | 38 | Tom Clegg | |
280 | 10 | Tom Clegg | h3. Scheduling policy |
281 | 6 | Tom Clegg | |
282 | The container priority field determines the order in which resources are allocated. |
||
283 | * If container C1 has priority P1, |
||
284 | * ...and C2 has higher priority P2, |
||
285 | * ...and there is no pending/booting/idle VM suitable for running C2, |
||
286 | * ...then C1 will not be started. |
||
287 | |||
288 | 1 | Tom Clegg | However, containers that run on different VM types don't necessarily start in priority order. |
289 | * If container C1 has priority P1, |
||
290 | 5 | Peter Amstutz | * ...and C2 has higher priority P2, |
291 | 6 | Tom Clegg | * ...and there is no idle VM suitable for running C2, |
292 | * ...and there is a pending/booting VM that will be suitable for running C2 when it comes up, |
||
293 | 1 | Tom Clegg | * ...and there is an idle VM suitable for running C1, |
294 | 6 | Tom Clegg | * ...then C1 will start before C2. |
295 | 10 | Tom Clegg | |
296 | 1 | Tom Clegg | h3. Special cases / synchronizing state |
297 | 6 | Tom Clegg | |
298 | 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. |
||
299 | 10 | Tom Clegg | |
300 | 36 | Tom Clegg | At startup, some containers might have state=Locked. 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). |
301 | |||
302 | 37 | Tom Clegg | At startup, some instances might still be running containers that were started by a prior invocation, even though the (new) boot probe command fails. Such instances are left alive at least until the containers finish. After that, the usual rules apply: if boot probe succeeds before boot timeout, start scheduling containers; otherwise, shut down. This allows the operator to configure a new image along with a new boot probe command that only works on the new image, without disrupting users' work. |
303 | 1 | Tom Clegg | |
304 | 4 | Peter Amstutz | 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). |
305 | 6 | Tom Clegg | |
306 | When a crunch-run process ends without finalizing its container's state, the dispatcher notices this and sets state to Cancelled. |
||
307 | 4 | Peter Amstutz | |
308 | 5 | Peter Amstutz | h3. Probes |
309 | |||
310 | 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. |
||
311 | |||
312 | Probe: |
||
313 | * Check whether the SSH connection is alive; reopen if needed. |
||
314 | * Run the configured "ready?" command (e.g., "grep /encrypted-tmp /etc/mtab"); if this fails, conclude the node is still booting. |
||
315 | * Run "crunch-run --list" to get a list of crunch-run supervisors (pid + container UUID) |
||
316 | 6 | Tom Clegg | |
317 | 5 | Peter Amstutz | h3. Detecting dead/lame nodes |
318 | 10 | Tom Clegg | |
319 | 65 | Tom Clegg | If a node has been up for N seconds without a successful probe, it is shut down, even if it was running a container last time it was contacted successfully. |
320 | 28 | Tom Clegg | |
321 | h1. Future plans / features |
||
322 | |||
323 | Per-instance-type VM images: It can be useful to run differently configured/tuned kernels/systems on different instance types, use different ops/monitoring systems on preemptible instances, etc. In addition to a system-wide default, each instance type could optionally specify an image. |
||
324 | |||
325 | 1 | Tom Clegg | Selectable VM images: When upgrading a production system, it can be useful to run a few trial containers on a new VM image before making it the default. |