Cloudflare Argo Tunnel accessible gratuitement aux développeurs : mise en oeuvre avec k3s …
Tags: openstack, docker, kubernetes, azure
Published: 2019-08-24 18:18:10

---
title: Cloudflare Argo Tunnel accessible gratuitement aux développeurs : mise en oeuvre avec k3s …
published: true
tags: openstack,docker,kubernetes,azure
canonical_url: https://medium.com/@abenahmed1/cloudflare-argo-tunnel-accessible-gratuitement-mise-en-oeuvre-avec-k3s-1d0c415a150d
---

### Cloudflare Argo Tunnel accessible gratuitement aux développeurs : mise en oeuvre avec k3s …

![](https://cdn-images-1.medium.com/max/1024/1*u-t6ughQV6ANuAyVPsW-Rg.png)

Je pars pour cette expérience d’un Scale Set dans Azure avec une instance Ubuntu 18.04 LTS de type Ev3 qui autorise la virtualisation imbriquée :

![](https://cdn-images-1.medium.com/max/1024/1*U1ZLQhh-meoyqhw2oq-JEg.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*bOqIiSJ7s7c_28iiuGQlqg.jpeg)

et je vais déployer DevStack via ce fichier de paramètres local.conf :

{% gist https://gist.github.com/deep75/ff0201f0bcf29906881ebce3f106e173 %}

et ces étapes :

```
$ sudo apt install libvirt-bin bridge-utils
$ sudo service libvirtd start
$ sudo update-rc.d libvirtd enable

$ sudo useradd -s /bin/bash -d /opt/stack -m stack
$ echo "stack ALL=(ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/stack
$ sudo su - stack
$ git clone [https://git.openstack.org/openstack-dev/devstack](https://git.openstack.org/openstack-dev/devstack) -b stable/stein
$ cd devstack
$ wget -c [https://gist.githubusercontent.com/deep75/ff0201f0bcf29906881ebce3f106e173/raw/18874bf7291f97687af3990e8c1dc517ac29706a/local.conf](https://gist.githubusercontent.com/deep75/ff0201f0bcf29906881ebce3f106e173/raw/18874bf7291f97687af3990e8c1dc517ac29706a/local.conf)

$ ./stack.sh
```

Le cluster OpenStack est accessible depuis cette instance Azure dans ce Scale Set avec l’adresse IP publique :

![](https://cdn-images-1.medium.com/max/1024/1*XzHj5kXh5t_TSclUvA-t7w.jpeg)

![](https://cdn-images-1.medium.com/max/724/1*fNZXEpnpQ7_-PhVEPQbysQ.jpeg)

![](https://cdn-images-1.medium.com/max/461/0*mwSO17e0F1GCN9KB.jpg)

Après import d’une image Ubuntu dans Glance :

```
$ . openrc
$ wget -c [https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img](https://cloud-images.ubuntu.com/bionic/current/bionic-server-cloudimg-amd64.img)
$ glance --os-image-api-version 2 image-create --name 'Ubuntu 18.04 LTS 64 Bits' --disk-format qcow2 --container-format bare --file ./bionic-server-cloudimg-amd64.img --progress
```

Je lance 4 instances :

![](https://cdn-images-1.medium.com/max/1024/1*PjfY-4liPR2R9bv9gUiVEA.jpeg)

à l’aide de ce fichier cloud-init simple :

```
#!/bin/sh

curl -fsSL [https://get.docker.com](https://get.docker.com) -o get-docker.sh
sh get-docker.sh
sudo usermod -aG docker ubuntu
```

et je peux créer mon petit cluster K8S avec K3S :

- [rancher/k3s](https://github.com/rancher/k3s)
- [k3s: Lightweight Kubernetes](https://k3s.io/)

avec la particularité d’utiliser Docker en lieu et place de Containerd et sans agent ni Traefik sur le noeud maître :

```
$ nohup sudo k3s server --disable-agent --no-deploy traefik --docker &
```

![](https://cdn-images-1.medium.com/max/1024/1*jfLD7_TaMlObBhhUAUGXGg.jpeg)

Je raccorde deux noeuds worker à ce cluster :

```
$ nohup sudo k3s agent --server [https://11.14.15.146:6443](https://11.14.15.146:6443) --token K10a452672c09f560d734d4565ea32093e75d17ba1c31ab7c05bbe74780b346c2b7::node:7b3a469d8e5b5c3c6b8948302d718281 --docker &
```

![](https://cdn-images-1.medium.com/max/1024/1*_bDSK16JSMRiumyqpUd5yw.jpeg)

Le cluster est disponible avec ces noeuds :

![](https://cdn-images-1.medium.com/max/1024/1*AYbwI-STGIJy3THH7xspdw.jpeg)

Je lance une instance avec Rancher Server et j’importe ce nouveau cluster :

![](https://cdn-images-1.medium.com/max/1024/1*AMxkfeAD3RRklR1TaBrj6A.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*5xRexFIFXnUM6a-ru5IzSg.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*c7qtOIkzwzgG7gUWY98eKw.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*oMk-YYQ2owGuRtEE38kqrg.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*XBWdw9JTPmuyMjmRLTChOw.jpeg)

Je lance le désormais célèbre démonstrateur FC avec Rancher avec NodePort :

```
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
 name: fcdemo-agent-app
 annotations:
 flux.weave.works/automated: 'true'
spec:
 replicas: 4
 template:
 metadata:
 labels:
 app: fcdemo-agent-app
 spec:
 containers:
 - name: fcdemo-agent-app
 image: mcas/franceconnect-agent-demo:latest
 ports:
 - containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
 name: fcdemo-agent-service
 labels:
 app: fcdemo-agent-service
spec:
 type: **NodePort**
 ports:
 # the port that this service should serve on Kubernetes
 - port: 80
 targetPort: 8000
 protocol: TCP
 selector:
 app: fcdemo-agent-app
```

![](https://cdn-images-1.medium.com/max/1024/1*78p0rQDA9FveUNg2dElKgw.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*nY6Aj3fZ5W1DzKFOpwSnbg.jpeg)

Ceci émet sur port TCP 32302 sur tous les noeuds du Cluster. Je lance alors un Load Balancer avec Octavia :

![](https://cdn-images-1.medium.com/max/1024/0*4qg_fMZbK_a2eP5l.png)

![](https://cdn-images-1.medium.com/max/1024/1*flcAQgxj9yYOadH9sG1oqw.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*_wgOR4Yo8BrAblE33ksOhA.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*P8d7dvSDQyk9MhKdhbIxUg.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*5tBzyXfhjxLfvn8kGhc8WQ.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*NJvgqEmsfCumMc5rcj5FCQ.jpeg)

J’ai donc une Floating IP qui pointe vers ce pool de noeuds du cluster K3S sur le port 80. Je vais utiliser Cloudflare Argo Tunnel pour exposer publiquement le démonstrateur FC. En effet, Cloudflare a rendu accessible sa solution de tunneling pour les développeurs :

![](https://cdn-images-1.medium.com/max/1020/1*Ztrh9L2Tt9SjbuhPrMwG5w.jpeg)

- [A free Argo Tunnel for your next project](https://blog.cloudflare.com/a-free-argo-tunnel-for-your-next-project/)
- [TryCloudflare - Argo Tunnel](https://developers.cloudflare.com/argo-tunnel/trycloudflare/)

```
$ wget -c [https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-amd64.deb](https://bin.equinox.io/c/VdrWdbjqyF/cloudflared-stable-linux-amd64.deb)

$ sudo dpkg -i cloudflared-stable-linux-amd64.deb
$ curl [http://192.168.122.234](http://192.168.122.234) 
$ nohup sudo cloudflared tunnel --url [http://192.168.122.234](http://192.168.122.234) &
```

![](https://cdn-images-1.medium.com/max/1024/1*kn5lRc_mm1TdOzryhyeS8Q.jpeg)

J’obtiens un lien URL qui me permet d’accéder publiquement au démonstrateur FC :

![](https://cdn-images-1.medium.com/max/1024/1*AFzGW2FElGBkDRNS8rh0ew.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*lnwiDE0avedFX_MGhFllEA.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*z0DG2ooML_-5TvLdtWxRJw.jpeg)

Par le biais du stockage objet avec Swift, je peux avoir accès publiquement à divers fichiers comme une vidéo :

![](https://cdn-images-1.medium.com/max/672/0*uM9vIVOKHTw7jnSb.png)

![](https://cdn-images-1.medium.com/max/1024/1*Pqz3ymuBUc1loCKwG4rwdQ.jpeg)

![](https://cdn-images-1.medium.com/max/1010/1*CYaAs3yTAJq0fGumrdbSvw.jpeg)

Pour finir, toujours en test, je peux lancer un petit clone de Youtube open source sans prétention via cette image Docker :

- [QuantumObject/docker-cumulusclips](https://github.com/QuantumObject/docker-cumulusclips)
- [Docker Hub](https://hub.docker.com/r/quantumobject/docker-cumulusclips)

Toujours via Argo Tunnel, je peux le rendre accessible publiquement :

![](https://cdn-images-1.medium.com/max/1024/1*NrH-LqSPtyXf70A9glt1aw.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*CnlrRKPmzd_xDUrClddf0A.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*hsuzyEOOYp7z-m6qwtLwrA.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*ncKECwZxO4eKmAIMxi_ZKA.jpeg)

Il est possible d’utiliser Argo tunnel comme Ingress Controller dans un cluster Kubernetes (mais avec abonnement) :

[Kubernetes Ingress Controller - Argo Tunnel](https://developers.cloudflare.com/argo-tunnel/reference/kubernetes/)

```
$ helm repo add cloudflare https://cloudflare.github.io/helm-charts
$ helm repo update

$ helm install --name anydomain --namespace default \
 --set rbac.create=true \
 --set controller.ingressClass=argo-tunnel \
 --set controller.logLevel=6 \
 cloudflare/argo-tunnel
```

et ce type de définition pour le manifest :

```
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
 annotations:
 kubernetes.io/ingress.class: argo-tunnel
 labels:
 ingress: argo-tunnel
 name: echo
spec:
 tls:
 - hosts:
 - echo.mydomain.com
 secretName: mydomain.com
 rules:
 - host: echo.mydomain.com
 http:
 paths:
 - backend:
 serviceName: echo
 servicePort: http
```

Si je ne veux pas dépendre d’Argo Tunnel, je peux opter pour les nombreuses alternatives comme par exemple Serveo qui propose une implémentation on-premise :

![https://cdn-images-1.medium.com/max/1200/1*vmmanTM6K7ftqCiHwVXwxg.png](https://cdn-images-1.medium.com/proxy/1*vmmanTM6K7ftqCiHwVXwxg.png)

[Serveo: expose local servers to the internet using SSH](http://serveo.net/)

![](https://cdn-images-1.medium.com/max/1024/1*Zt191kMajmqM-FYSuvII6w.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*Q6bH6ri0IkwP1aWbYNvV8w.jpeg)

Je pars d’une micro instance dans Outscale avec cette variante :

![](https://cdn-images-1.medium.com/max/1024/1*vKiOZDvyjTQ4r8coH6n7IA.png)

![](https://cdn-images-1.medium.com/max/1024/1*qRoSbkL_FFW0UEetyYJ-Tg.jpeg)

```
outscale@ip-10-9-5-245:~$ **wget -c** [**https://storage.googleapis.com/serveo/download/2018-05-08/serveo-linux-amd64**](https://storage.googleapis.com/serveo/download/2018-05-08/serveo-linux-amd64)

--2019-06-19 14:40:53-- [https://storage.googleapis.com/serveo/download/2018-05-08/serveo-linux-amd64](https://storage.googleapis.com/serveo/download/2018-05-08/serveo-linux-amd64)
Resolving storage.googleapis.com (storage.googleapis.com)... 172.217.22.144, 2a00:1450:4007:815::2010
Connecting to storage.googleapis.com (storage.googleapis.com)|172.217.22.144|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 3145352 (3.0M) [application/octet-stream]
Saving to: ‘serveo-linux-amd64’

serveo-linux-amd64 100%[========================================================================\>] 3.00M --.-KB/s in 0.04s

2019-06-19 14:40:53 (76.8 MB/s) - ‘serveo-linux-amd64’ saved [3145352/3145352]

outscale@ip-10-9-5-245:~$ **chmod +rwx serveo-linux-amd64** 
outscale@ip-10-9-5-245:~$ **sudo mv serveo-linux-amd64 /usr/local/bin/serveo**

outscale@ip-10-9-5-245:~$ **vim key.rsa**
outscale@ip-10-9-5-245:~$ **chmod 400 key.rsa**

outscale@ip-10-9-5-245:~$ **sudo serveo -private\_key\_path=key.rsa -port=2222 -http\_port=80 -https\_port=443 -domain=171-33-99-243.sslip.io**

Listening on :2222...
```

J’ai lancé le serveur Serveo sur un domaine Wild Card pour l’exemple …

![](https://cdn-images-1.medium.com/max/1024/1*ZLxEwZLGJTb8RYur1mUnNw.jpeg)

Depuis mon instance sur le Scale Set, je peux lancer un tunnel persistant via Autossh vers le serveur Serveo depuis le load Balancer HAProxy généré précédemment avec Octavia :

```
$ **eval "$(ssh-agent -s)"**
Agent pid 6770

$ **ssh-add ./key.rsa** 
Identity added: ./key.rsa (./key.rsa)

$ **sudo apt install autossh**

$ **autossh -p 2222 -M 0 -R fc:80:192.168.122.234:80 171-33-99-243.sslip.io**
Warning: Permanently added '[171-33-99-243.sslip.io]:2222,[171.33.99.243]:2222' (RSA) to the list of known hosts.
Warning: no TLS certificate available for fc.171-33-99-243.sslip.io. You won't be able to use HTTPS, only HTTP.
Forwarding HTTP traffic from [**http://fc.171-33-99-243.sslip.io**](http://fc.171-33-99-243.sslip.io)
Press g to start a GUI session and ctrl-c to quit.
```

J’accède alors au démonstrateur via ce Tunnel et ce domaine Wild Card DNS (via sslip.io) :

![](https://cdn-images-1.medium.com/max/1024/1*osowAyL6Ysz0vtoORVwn5w.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*3G4DIi3_T5_AXAAE3K-W5A.jpeg)

![](https://cdn-images-1.medium.com/max/1024/1*LfteHwMgBt9pNg1N4h2_QA.jpeg)

Tout ceci peut être très utile pour la réalisation d’environnement de test par exemple …

A suivre !

![](https://cdn-images-1.medium.com/max/414/1*JEMqDSLoKwnNH40gyeMmqQ.jpeg)