Skip to content

Commit ce5d302

Browse files
manabuishiiuniqueg
andauthored
docs(admin): deploy TESK via microk8s (#11)
Co-authored-by: Alex Kanitz <[email protected]>
1 parent 46c9b5a commit ce5d302

File tree

1 file changed

+205
-0
lines changed

1 file changed

+205
-0
lines changed

docs/guides/guide-admin/index.md

Lines changed: 205 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,211 @@ important are:
179179
When creating a `.secrets.yaml` file, ensure that the file is never shared
180180
or committed to a code repository!
181181

182+
##### Notes for deployment with microk8s
183+
184+
This section outlines how to install TESK via [microk8s](https://microk8s.io/),
185+
as tested on an Ubuntu 22.04 machine.
186+
187+
First, install microk8s through the Snap Store and add yourself to the
188+
`microk8s` group::
189+
190+
```bash
191+
sudo snap install microk8s --classic
192+
sudo usermod -a -G microk8s $USER
193+
```
194+
195+
Now let's create a directory for the microk8s configuration and enable Helm:
196+
197+
```bash
198+
mkdir ~/.kube
199+
sudo chown -R $USER ~/.kube
200+
microk8s enable helm3
201+
```
202+
203+
Next, let's clone the TESK repository and move into it the Helm chart directory:
204+
205+
```bash
206+
git clone https://github.com/elixir-cloud-aai/TESK.git
207+
cd TESK/charts/tesk
208+
```
209+
210+
Follow the deployment instructions to create `secrets.yaml` and modify
211+
`values.yaml` as per your requirements.
212+
213+
> You **MUST** set `host_name`. To make the service available through the
214+
> internet, see further below on how to configure the `service` section.
215+
216+
Great - you are now ready to deploy TESK!
217+
218+
First, let's create a namespace:
219+
220+
```bash
221+
microk8s kubectl create namespace NAMESPACE
222+
```
223+
224+
where `NAMESPACE` is an arbitrary name for your resource group.
225+
226+
Now let's use Helm to install:
227+
228+
```bash
229+
microk8s helm3 install -n NAMESPACE RELEASE_NAME . -f secrets.yaml -f values.yaml
230+
```
231+
232+
where `RELEASE_NAME` is an arbitrary name for this particular TESK release.
233+
234+
Congratulations - TESK should now be successfully deployed!
235+
236+
To find out the IP address at which TESK is available, run the following
237+
command:
238+
239+
```bash
240+
microk8s kubectl get svc -n NAMESPACE
241+
```
242+
243+
The output could look something like this:
244+
245+
```console
246+
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
247+
tesk-api ClusterIP 123.123.123.123 <none> 8080/TCP 8s
248+
```
249+
250+
Use the `CLUSTER-IP` and the `PORT` with the following template to construct the
251+
URL at which the service is available (and make sure to replace the dummy URL
252+
when you want to try out the calls below):
253+
254+
```console
255+
http://CLUSTER-IP:PORT/ga4gh/tes/v1
256+
```
257+
258+
So, in this example case, we get the following URL:
259+
260+
```console
261+
http://123.123.123.123:8080/ga4gh/tes/v1
262+
```
263+
264+
You can now test the intallation with the following example call to get a list
265+
of tasks:
266+
267+
```bash
268+
curl http://123.123.123.123:8080/ga4gh/tes/v1/tasks
269+
```
270+
271+
If everything worked well, you should get an output like this:
272+
273+
```json
274+
{
275+
"tasks": []
276+
}
277+
```
278+
279+
Let's try to send a small task to TESK:
280+
281+
```console
282+
curl \
283+
-H "Accept: application/json" \
284+
-H "Content-Type: application/json" \
285+
-X POST \
286+
--data '{"executors": [ { "command": [ "echo", "TESK says: Hello World" ], "image": "alpine" } ]}' \
287+
"http://123.123.123.123:8080/ga4gh/tes/v1/tasks"
288+
```
289+
290+
That should give you a task ID:
291+
292+
```json
293+
{
294+
"id" : "task-123ab456"
295+
}
296+
```
297+
298+
You can run the task list command from before again. Now the response should not
299+
be an empty list anymore. Rather, you should see something like this:
300+
301+
```json
302+
{
303+
"tasks" : [ {
304+
"id" : "task-123ab456",
305+
"state" : "COMPLETE"
306+
} ]
307+
}
308+
```
309+
310+
To get more details on your task, use the task ID from before in a call like
311+
this:
312+
313+
```bash
314+
curl http://123.123.123.123:8080/ga4gh/tes/v1/tasks/TASK_ID?view=FULL
315+
```
316+
317+
We can use `jq` to parse the results. Let's say we want to see the logs of the
318+
first (only, in this case) TES executor, we could do something like this:
319+
320+
```console
321+
$curl -s http://123.123.123.123:8080/ga4gh/tes/v1/tasks/task-123ab456?view=FULL | jq '.logs[0].logs'
322+
```
323+
324+
Which would give us an output like this:
325+
326+
```json
327+
[
328+
{
329+
"start_time": "2023-11-01T14:54:20.000Z",
330+
"end_time": "2023-11-01T14:54:25.000Z",
331+
"stdout": "TESK says: Hello World\n",
332+
"exit_code": 0
333+
}
334+
]
335+
```
336+
337+
Note that in the example, the API is only accessible internally. To make it
338+
accessible publicly, we need to properly configure the `service` section in
339+
`values.yaml`.
340+
341+
In particular, we would like to set the type to `NodePort` and then set an open
342+
port on the host machine at which the API is exposed. For example, with
343+
344+
```yaml
345+
service:
346+
type: "NodePort"
347+
node_port: "31567"
348+
```
349+
350+
Kubernetes will route requests coming in to port `31567` on the host machine to
351+
port `8080` on the pod.
352+
353+
Let's confirm this by upgrading the Helm chart and again inspecting the services
354+
in our namespace with:
355+
356+
```bash
357+
microk8s helm3 upgrade -n NAMESPACE RELEASE_NAME . -f secrets.yaml -f values.yaml
358+
microk8s kubectl get svc -n NAMESPACE
359+
```
360+
361+
We should get an output like this:
362+
363+
```console
364+
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
365+
tesk-api NodePort 123.123.123.111 <none> 8080:31567/TCP 5s
366+
```
367+
368+
Indeed, the port section changed as expected. Now, note that the `CLUSTER-IP`
369+
_also_ changed. However, this is not a problem as Kubernetes will manage the
370+
routing, so we don't really need to know the `CLUSTER-IP`. Instead, now we can
371+
use the hostname (or IP) of the host machine, together with the port we set to
372+
call our TES API from anywhere:
373+
374+
```
375+
curl http://HOST_NAME_OR_IP:31567/ga4gh/tes/v1/tasks
376+
```
377+
378+
> Of course you need to make sure that the port you selected is opened for
379+
> public access. This will depend on your router/firewall settings.
380+
381+
If you would like to tear down the TESK service, simply run:
382+
383+
```bash
384+
microk8s helm uninstall RELEASE_NAME -n NAMESPACE
385+
```
386+
182387
#### Deploying Funnel
183388

184389
Follow these instructions if you wish to deploy a TES endpoint in front of your

0 commit comments

Comments
 (0)