Merge branch 'master' into 7454-azure-custom-data
[arvados.git] / doc / install / install-compute-node.html.textile.liquid
1 ---
2 layout: default
3 navsection: installguide
4 title: Install a compute node
5 ...
6
7 h2. Install dependencies
8
9 First, "add the appropriate package repository for your distribution":{{ site.baseurl }}/install/install-manual-prerequisites.html#repos.
10
11 On Debian-based systems:
12
13 <notextile>
14 <pre><code>~$ <span class="userinput">sudo apt-get install perl python-virtualenv fuse python-arvados-python-client python-arvados-fuse crunchstat arvados-docker-cleaner iptables ca-certificates</span>
15 </code></pre>
16 </notextile>
17
18 On Red Hat-based systems:
19
20 <notextile>
21 <pre><code>~$ <span class="userinput">sudo yum install perl python27-python-virtualenv fuse python27-python-arvados-python-client python27-python-arvados-fuse crunchstat arvados-docker-cleaner iptables ca-certificates</span>
22 </code></pre>
23 </notextile>
24
25 {% include 'note_python27_sc' %}
26
27 h2. Install Docker
28
29 Compute nodes must have Docker installed to run jobs inside containers.  This requires a relatively recent version of Linux (at least upstream version 3.10, or a distribution version with the appropriate patches backported).  Follow the "Docker Engine installation documentation":https://docs.docker.com/ for your distribution.
30
31 For Debian-based systems, the Arvados package repository includes a backported @docker.io@ package with a known-good version you can install.
32
33 h2. Configure Docker
34
35 Crunch runs jobs in Docker containers with relatively little configuration.  You may need to start the Docker daemon with specific options to make sure these jobs run smoothly in your environment.  This section highlights options that are useful to most installations.  Refer to the "Docker daemon reference":https://docs.docker.com/reference/commandline/daemon/ for complete information about all available options.
36
37 The best way to configure these options varies by distribution.
38
39 * If you're using our backported @docker.io@ package, you can list these options in the @DOCKER_OPTS@ setting in @/etc/default/docker.io@.
40 * If you're using another Debian-based package, you can list these options in the @DOCKER_OPTS@ setting in @/etc/default/docker@.
41 * On Red Hat-based distributions, you can list these options in the @other_args@ setting in @/etc/sysconfig/docker@.
42
43 h3. Default ulimits
44
45 Docker containers inherit ulimits from the Docker daemon.  However, the ulimits for a single Unix daemon may not accommodate a long-running Crunch job.  You may want to increase default limits for compute jobs by passing @--default-ulimit@ options to the Docker daemon.  For example, to allow jobs to open 10,000 files, set @--default-ulimit nofile=10000:10000@.
46
47 h3. DNS
48
49 Your containers must be able to resolve the hostname in the ARVADOS_API_HOST environment variable (provided by the Crunch dispatcher) and any hostnames returned in Keep service records.  If these names are not in public DNS records, you may need to set a DNS resolver for the containers by specifying the @--dns@ address with the IP address of an appropriate nameserver.  You may specify this option more than once to use multiple nameservers.
50
51 h2. Set up SLURM
52
53 Install SLURM following "the same process you used to install the Crunch dispatcher":install-crunch-dispatch.html#slurm.
54
55 h2. Copy configuration files from the dispatcher (API server)
56
57 The @/etc/slurm-llnl/slurm.conf@ and @/etc/munge/munge.key@ files need to be identicaly across the dispatcher and all compute nodes. Copy the files you created in the "Install the Crunch dispatcher":install-crunch-dispatch.html step to this compute node.
58
59 h2. Configure FUSE
60
61 Install this file as @/etc/fuse.conf@:
62
63 <notextile>
64 <pre>
65 # Set the maximum number of FUSE mounts allowed to non-root users.
66 # The default is 1000.
67 #
68 #mount_max = 1000
69
70 # Allow non-root users to specify the 'allow_other' or 'allow_root'
71 # mount options.
72 #
73 user_allow_other
74 </pre>
75 </notextile>
76
77 h2. Configure the Docker cleaner
78
79 The arvados-docker-cleaner program removes least recently used docker images as needed to keep disk usage below a configured limit.
80
81 {% include 'notebox_begin' %}
82 This also removes all containers as soon as they exit, as if they were run with `docker run --rm`. If you need to debug or inspect containers after they stop, temporarily stop arvados-docker-cleaner or run it with `--remove-stopped-containers never`.
83 {% include 'notebox_end' %}
84
85 On Debian-based systems, install runit:
86
87 <notextile>
88 <pre><code>~$ <span class="userinput">sudo apt-get install runit</span>
89 </code></pre>
90 </notextile>
91
92 On Red Hat-based systems, "install runit from source":http://smarden.org/runit/install.html or use an alternative daemon supervisor.
93
94 Configure runit to run the image cleaner using a suitable quota for your compute nodes and workload:
95
96 <notextile>
97 <pre><code>~$ <span class="userinput">cd /etc/sv</span>
98 /etc/sv$ <span class="userinput">sudo mkdir arvados-docker-cleaner; cd arvados-docker-cleaner</span>
99 /etc/sv/arvados-docker-cleaner$ <span class="userinput">sudo mkdir log log/main</span>
100 /etc/sv/arvados-docker-cleaner$ <span class="userinput">sudo sh -c 'cat &gt;log/run' &lt;&lt;'EOF'
101 #!/bin/sh
102 exec svlogd -tt main
103 EOF</span>
104 /etc/sv/arvados-docker-cleaner$ <span class="userinput">sudo sh -c 'cat &gt;run' &lt;&lt;'EOF'
105 #!/bin/sh
106 exec python3 -m arvados_docker.cleaner --quota <b>50G</b>
107 EOF</span>
108 /etc/sv/arvados-docker-cleaner$ <span class="userinput">sudo chmod +x run log/run</span>
109 </code></pre>
110 </notextile>
111
112 If you are using a different daemon supervisor, or if you want to test the daemon in a terminal window, an equivalent shell command to run arvados-docker-cleaner is:
113
114 <notextile>
115 <pre><code><span class="userinput">python3 -m arvados_docker.cleaner --quota <b>50G</b></span>
116 </code></pre>
117 </notextile>
118
119 h2. Add a Crunch user account
120
121 Create a Crunch user account, and add it to the @fuse@ and @docker@ groups so it can use those tools:
122
123 <notextile>
124 <pre><code>~$ <span class="userinput">sudo useradd --groups fuse,docker crunch</span>
125 </code></pre>
126 </notextile>
127
128 The crunch user should have the same UID, GID, and home directory across all compute nodes and the dispatcher (API server).
129
130 h2. Tell the API server about this compute node
131
132 Load your API superuser token on the compute node:
133
134 <notextile>
135 <pre><code>
136 ~$ <span class="userinput">HISTIGNORE=$HISTIGNORE:'export ARVADOS_API_TOKEN=*'</span>
137 ~$ <span class="userinput">export ARVADOS_API_TOKEN=@your-superuser-token@</span>
138 ~$ <span class="userinput">export ARVADOS_API_HOST=@uuid_prefix.your.domain@</span>
139 ~$ <span class="userinput">unset ARVADOS_API_HOST_INSECURE</span>
140 </code>
141 </pre>
142 </notextile>
143
144 Then execute this script to create a compute node object, and set up a cron job to have the compute node ping the API server every five minutes:
145
146 <notextile>
147 <pre><code>
148 #!/bin/bash
149 set -e
150 if ! test -f /root/node.json ; then
151     python - &lt;&lt;EOF
152 import arvados, json, socket
153 fqdn = socket.getfqdn()
154 hostname, _, domain = fqdn.partition('.')
155 ip_address = socket.gethostbyname(fqdn)
156 node = arvados.api('v1').nodes().create(body={'hostname': hostname, 'domain': domain, 'ip_address': ip_address}).execute()
157 with open('/root/node.json', 'w') as node_file:
158     json.dump(node, node_file, indent=2)
159 EOF
160
161     # Make sure /dev/fuse permissions are correct (the device appears after fuse is loaded)
162     chmod 1660 /dev/fuse && chgrp fuse /dev/fuse
163 fi
164
165 UUID=`grep \"uuid\" /root/node.json  |cut -f4 -d\"`
166 PING_SECRET=`grep \"ping_secret\" /root/node.json  |cut -f4 -d\"`
167
168 if ! test -f /etc/cron.d/node_ping ; then
169     echo "*/5 * * * * root /usr/bin/curl -k -d ping_secret=$PING_SECRET https://$ARVADOS_API_HOST/arvados/v1/nodes/$UUID/ping" > /etc/cron.d/node_ping
170 fi
171
172 /usr/bin/curl -k -d ping_secret=$PING_SECRET https://$ARVADOS_API_HOST/arvados/v1/nodes/$UUID/ping?ping_secret=$PING_SECRET
173 </code>
174 </pre>
175 </notextile>
176
177 And remove your token from the environment:
178
179 <notextile>
180 <pre><code>
181 ~$ <span class="userinput">unset ARVADOS_API_TOKEN</span>
182 ~$ <span class="userinput">unset ARVADOS_API_HOST</span>
183 </code>
184 </pre>
185 </notextile>
186