Découvrir vos services et les publier simplement avec Traefik Hub …

Karim
11 min readNov 12, 2022

--

Traefik Labs, créateur du proxy open source Traefik, a annoncé la disponibilité générale le 26 octobre pendant la KubeCon, de son nouveau service cloud en mode SaaS “Traefik Hub” qui permet d’éliminer les complexité de la gestion des réseaux Kubernetes et Docker à grande échelle …

Avec la plateforme Traefik Hub, les clients peuvent :

  • Publier : installez l’agent open source léger Hub, découvrez automatiquement les services et obtenez un accès public sécurisé aux conteneurs en quelques secondes.
  • Sécurisé : automatisez la gestion des certificats HTTP, accédez aux conteneurs via des tunnels sécurisés/des connexions privées directes et accélérez le déploiement du contrôle d’accès moderne. Par exemple, l’authentification basée sur OpenID Connect (OIDC) peut protéger les microservices nouveaux ou existants en quelques minutes.
  • Mise à l’échelle : Commencez avec un seul cluster à l’aide de Traefik ou Nginx, et évoluez de manière transparente vers plusieurs clusters gérés par le plan de contrôle réseau centralisé Traefik Hub.

Vue rapide ici avec la connexion une instance Ubuntu avec k3s provisionné dans Hetzner Cloud :

Puis installation de Helm :

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/$(curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt)/bin/linux/amd64/kubectl && chmod +x kubectl && mv kubectl /usr/local/bin/ && cp /etc/rancher/k3s/k3s.yaml .kube/config

$ chmod 400 .kube/config && curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash

Depuis la page d’accès à Traefik Hub, on me propose l’installation d’un agent Hub :

L’agent Hub est le lien entre sa machine et la plateforme Traefik Hub. Il permet à Traefik Hub de découvrir less services et de rediriger le trafic de la périphérie vers sa machine. Il va utiliser Helm pour l’installation de l’agent :

Installation dans le cluster k3s aux Etats-Unis :

root@k3s-united-states:~# helm repo add traefik https://helm.traefik.io/traefik
"traefik" has been added to your repositories

root@k3s-united-states:~# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "traefik" chart repository
Update Complete. ⎈Happy Helming!⎈

root@k3s-united-states:~# helm upgrade --install traefik traefik/traefik \
> --namespace hub-agent --create-namespace \
> --set=additionalArguments='{--experimental.hub,--hub}' \
> --set metrics.prometheus.addRoutersLabels=true \
> --set providers.kubernetesIngress.allowExternalNameServices=true \
> --set ports.web=null --set ports.websecure=null --set ports.metrics.expose=true \
> --set ports.traefikhub-tunl.port=9901 --set ports.traefikhub-tunl.expose=true --set ports.traefikhub-tunl.exposedPort=9901 --set ports.traefikhub-tunl.protocol="TCP" \
> --set service.type="ClusterIP" --set fullnameOverride=traefik-hub
Release "traefik" does not exist. Installing it now.
NAME: traefik
LAST DEPLOYED: Sat Nov 12 22:12:17 2022
NAMESPACE: hub-agent
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Traefik Proxy v2.9.4 has been deployed successfully
on hub-agent namespace !

root@k3s-united-states:~# helm repo add traefik-hub https://helm.traefik.io/hub
"traefik-hub" has been added to your repositories
root@k3s-united-states:~# helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "traefik-hub" chart repository
...Successfully got an update from the "traefik" chart repository
Update Complete. ⎈Happy Helming!⎈

root@k3s-united-states:~# helm upgrade --install hub-agent traefik-hub/hub-agent \
> --set token="<TOKEN>" --namespace hub-agent \
> --create-namespace
Release "hub-agent" does not exist. Installing it now.
NAME: hub-agent
LAST DEPLOYED: Sat Nov 12 22:12:50 2022
NAMESPACE: hub-agent
STATUS: deployed
REVISION: 1
TEST SUITE: None

Celui-çi a donc entraîné l’installation de Traefik Proxy puis de Traefik Hub et permet maintenant l’auto-découverte des services présents sur le cluster k3s :

root@k3s-united-states:~# kubectl get po,svc,ing -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/local-path-provisioner-5b5579c644-q9wcf 1/1 Running 0 30m
kube-system pod/coredns-75fc8f8fff-j6cnb 1/1 Running 0 30m
kube-system pod/helm-install-traefik-crd-7zh5m 0/1 Completed 0 30m
kube-system pod/svclb-traefik-4cb48712-ljwfd 2/2 Running 0 29m
kube-system pod/metrics-server-5c8978b444-2hv24 1/1 Running 0 30m
kube-system pod/traefik-9c6dc6686-4t58p 1/1 Running 0 29m
kube-system pod/helm-install-traefik-54msj 0/1 Completed 2 30m
hub-agent pod/traefik-hub-66d648f884-bwtvp 1/1 Running 0 6m49s
hub-agent pod/hub-agent-tunnel-64cd44bf56-gpfpc 1/1 Running 0 6m16s
hub-agent pod/hub-agent-controller-cb5784546-ws4hz 1/1 Running 0 6m16s
hub-agent pod/hub-agent-auth-server-b745674d7-qtf8g 1/1 Running 1 (6m13s ago) 6m16s
hub-agent pod/hub-agent-auth-server-b745674d7-v7rr6 1/1 Running 1 (6m13s ago) 6m16s
hub-agent pod/hub-agent-auth-server-b745674d7-7gwqp 1/1 Running 0 6m16s

NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 30m
kube-system service/kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 30m
kube-system service/metrics-server ClusterIP 10.43.126.213 <none> 443/TCP 30m
kube-system service/traefik LoadBalancer 10.43.150.149 2a01:4ff:f0:4d9c::1,5.161.152.165 80:32292/TCP,443:30571/TCP 29m
hub-agent service/traefik-hub ClusterIP 10.43.12.246 <none> 9100/TCP,9901/TCP 6m49s
hub-agent service/hub-catch-all ExternalName <none> hub.traefik.io 443/TCP 6m16s
hub-agent service/hub-agent-auth-server ClusterIP 10.43.87.2 <none> 80/TCP 6m16s
hub-agent service/hub-agent-controller ClusterIP 10.43.72.187 <none> 443/TCP 6m16s

NAMESPACE NAME CLASS HOSTS ADDRESS PORTS AGE
hub-agent ingress.networking.k8s.io/hub-catch-all traefik-hub * 2a01:4ff:f0:4d9c::1,5.161.152.165 80, 443 6m12s

Je déploie le petit démonstrateur FC sans la partie Ingress :

root@k3s-united-states:~# cat <<EOF | kubectl apply -f -
> ---
> apiVersion: apps/v1
> kind: Deployment
> metadata:
> name: fcdemo3
> labels:
> app: fcdemo3
> spec:
> replicas: 4
> selector:
> matchLabels:
> app: fcdemo3
> template:
> metadata:
> labels:
> app: fcdemo3
> spec:
> containers:
> - name: fcdemo3
> image: mcas/franceconnect-demo2:latest
> ports:
> - containerPort: 3000
> ---
> apiVersion: v1
> kind: Service
> metadata:
> name: fcdemo-service
> spec:
> type: ClusterIP
> selector:
> app: fcdemo3
> ports:
> - protocol: TCP
> port: 80
> targetPort: 3000
> EOF
deployment.apps/fcdemo3 created
service/fcdemo-service created
root@k3s-united-states:~# kubectl get po,svc
NAME READY STATUS RESTARTS AGE
pod/fcdemo3-6bff77544b-7462w 1/1 Running 0 46s
pod/fcdemo3-6bff77544b-6l5qs 1/1 Running 0 46s
pod/fcdemo3-6bff77544b-wv7dg 1/1 Running 0 46s
pod/fcdemo3-6bff77544b-b7pbz 1/1 Running 0 46s

NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 34m
service/fcdemo-service ClusterIP 10.43.80.38 <none> 80/TCP 46s

Le service est automatiquement découvert par Traefik Hub :

Et la plateforme me propose de la publier :

avec une sécurisation de l’accès. Je choisis pour cette dernière la méthode basique avec une simple combinaison login / mot de passe :

et je la publie ensuite en mode public :

En effet un domaine et un certificat ont été provisionnés au moment du déploiement de l’agent dans le cluster :

Une adresse publique est fournie pour accéder au démonstrateur FC :

Et une demande d’authentification est en effet proposée pour l’accès au démonstrateur :

avec la combinaison login / mode de passe pré-définie auparavant …

J’ajoute une nouvelle version du démonstrateur FC :

root@k3s-united-states:~# cat <<EOF | kubectl apply -f -
> ---
> apiVersion: apps/v1
> kind: Deployment
> metadata:
> name: fcdemo4
> labels:
> app: fcdemo4
> spec:
> replicas: 4
> selector:
> matchLabels:
> app: fcdemo4
> template:
> metadata:
> labels:
> app: fcdemo4
> spec:
> containers:
> - name: fcdemo4
> image: mcas/franceconnect-demo3:latest
> ports:
> - containerPort: 3000
> ---
> apiVersion: v1
> kind: Service
> metadata:
> name: fcdemo-service2
> spec:
> type: ClusterIP
> selector:
> app: fcdemo4
> ports:
> - protocol: TCP
> port: 80
> targetPort: 3000
> EOF
deployment.apps/fcdemo4 created
service/fcdemo-service2 created

On remarque qu’une adresse IPV6 externe a été inserée dans le cluster pour l’accès à Traefik. Le nouveau service est déployé :

root@k3s-united-states:~# kubectl get po,svc -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/local-path-provisioner-5b5579c644-q9wcf 1/1 Running 0 56m
kube-system pod/coredns-75fc8f8fff-j6cnb 1/1 Running 0 56m
kube-system pod/helm-install-traefik-crd-7zh5m 0/1 Completed 0 56m
kube-system pod/svclb-traefik-4cb48712-ljwfd 2/2 Running 0 56m
kube-system pod/metrics-server-5c8978b444-2hv24 1/1 Running 0 56m
kube-system pod/traefik-9c6dc6686-4t58p 1/1 Running 0 56m
kube-system pod/helm-install-traefik-54msj 0/1 Completed 2 56m
hub-agent pod/traefik-hub-66d648f884-bwtvp 1/1 Running 0 33m
hub-agent pod/hub-agent-tunnel-64cd44bf56-gpfpc 1/1 Running 0 32m
hub-agent pod/hub-agent-controller-cb5784546-ws4hz 1/1 Running 0 32m
hub-agent pod/hub-agent-auth-server-b745674d7-qtf8g 1/1 Running 1 (32m ago) 32m
hub-agent pod/hub-agent-auth-server-b745674d7-v7rr6 1/1 Running 1 (32m ago) 32m
hub-agent pod/hub-agent-auth-server-b745674d7-7gwqp 1/1 Running 0 32m
default pod/fcdemo3-6bff77544b-7462w 1/1 Running 0 23m
default pod/fcdemo3-6bff77544b-6l5qs 1/1 Running 0 23m
default pod/fcdemo3-6bff77544b-wv7dg 1/1 Running 0 23m
default pod/fcdemo3-6bff77544b-b7pbz 1/1 Running 0 23m
default pod/fcdemo4-6fdd9fb757-gnkzc 1/1 Running 0 33s
default pod/fcdemo4-6fdd9fb757-pplf7 1/1 Running 0 33s
default pod/fcdemo4-6fdd9fb757-66mt2 1/1 Running 0 33s
default pod/fcdemo4-6fdd9fb757-w4wqn 1/1 Running 0 33s

NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 56m
kube-system service/kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 56m
kube-system service/metrics-server ClusterIP 10.43.126.213 <none> 443/TCP 56m
kube-system service/traefik LoadBalancer 10.43.150.149 2a01:4ff:f0:4d9c::1,5.161.152.165 80:32292/TCP,443:30571/TCP 56m
hub-agent service/traefik-hub ClusterIP 10.43.12.246 <none> 9100/TCP,9901/TCP 33m
hub-agent service/hub-catch-all ExternalName <none> hub.traefik.io 443/TCP 32m
hub-agent service/hub-agent-auth-server ClusterIP 10.43.87.2 <none> 80/TCP 32m
hub-agent service/hub-agent-controller ClusterIP 10.43.72.187 <none> 443/TCP 32m
default service/fcdemo-service2 ClusterIP 10.43.149.7 <none> 80/TCP 33s

Le nouveau service découvert peut être publié également … Ce que je fais ici sans méthode d’authentification :

Et il est en effet accessible publiquement directement :

root@k3s-united-states:~# kubectl get po,svc -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system pod/local-path-provisioner-5b5579c644-q9wcf 1/1 Running 0 101m
kube-system pod/coredns-75fc8f8fff-j6cnb 1/1 Running 0 101m
kube-system pod/helm-install-traefik-crd-7zh5m 0/1 Completed 0 101m
kube-system pod/svclb-traefik-4cb48712-ljwfd 2/2 Running 0 100m
kube-system pod/metrics-server-5c8978b444-2hv24 1/1 Running 0 101m
kube-system pod/traefik-9c6dc6686-4t58p 1/1 Running 0 100m
kube-system pod/helm-install-traefik-54msj 0/1 Completed 2 101m
hub-agent pod/traefik-hub-66d648f884-bwtvp 1/1 Running 0 77m
hub-agent pod/hub-agent-tunnel-64cd44bf56-gpfpc 1/1 Running 0 77m
hub-agent pod/hub-agent-controller-cb5784546-ws4hz 1/1 Running 0 77m
hub-agent pod/hub-agent-auth-server-b745674d7-qtf8g 1/1 Running 1 (77m ago) 77m
hub-agent pod/hub-agent-auth-server-b745674d7-v7rr6 1/1 Running 1 (77m ago) 77m
hub-agent pod/hub-agent-auth-server-b745674d7-7gwqp 1/1 Running 0 77m
default pod/fcdemo3-6bff77544b-7462w 1/1 Running 0 68m
default pod/fcdemo3-6bff77544b-6l5qs 1/1 Running 0 68m
default pod/fcdemo3-6bff77544b-wv7dg 1/1 Running 0 68m
default pod/fcdemo3-6bff77544b-b7pbz 1/1 Running 0 68m
default pod/fcdemo4-6fdd9fb757-gnkzc 1/1 Running 0 45m
default pod/fcdemo4-6fdd9fb757-pplf7 1/1 Running 0 45m
default pod/fcdemo4-6fdd9fb757-66mt2 1/1 Running 0 45m
default pod/fcdemo4-6fdd9fb757-w4wqn 1/1 Running 0 45m

NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default service/kubernetes ClusterIP 10.43.0.1 <none> 443/TCP 101m
kube-system service/kube-dns ClusterIP 10.43.0.10 <none> 53/UDP,53/TCP,9153/TCP 101m
kube-system service/metrics-server ClusterIP 10.43.126.213 <none> 443/TCP 101m
kube-system service/traefik LoadBalancer 10.43.150.149 2a01:4ff:f0:4d9c::1,5.161.152.165 80:32292/TCP,443:30571/TCP 100m
hub-agent service/traefik-hub ClusterIP 10.43.12.246 <none> 9100/TCP,9901/TCP 77m
hub-agent service/hub-catch-all ExternalName <none> hub.traefik.io 443/TCP 77m
hub-agent service/hub-agent-auth-server ClusterIP 10.43.87.2 <none> 80/TCP 77m
hub-agent service/hub-agent-controller ClusterIP 10.43.72.187 <none> 443/TCP 77m
default service/fcdemo-service2 ClusterIP 10.43.149.7 <none> 80/TCP 45m

Je peux générer un peu de traffic avec un webservice en ligne …

Et une page de monitoring des performances du service est proposé sur Traefik Hub :

D’autres méthodes d’authentification sont proposées notamment en utilisant les JSON Web Tokens :

https://doc.traefik.io/traefik-hub/access-control-policies/methods/jwt/

Ou par l’intermédiaire d’OpenID Connect avec ici le fournisseur Google par défaut (et pour le mode Premium uniquement) :

https://doc.traefik.io/traefik-hub/access-control-policies/methods/oidc/

On est limité à ces ressources dans le plan gratuit de la plateforme :

Un ajour de domaine en alias est possible pour le service publié :

https://doc.traefik.io/traefik-hub/publishing-services/custom-domains/

Traefik Hub comble une lacune dans l’industrie pour les petites équipes autonomes et les grandes organisations distribuées”, a déclaré Darren Shepherd, architecte en chef et co-fondateur d’Acorn Labs, et ancien directeur de la technologie de Rancher.

Annoncé en version bêta en juin et comptant déjà plus de 6 000 utilisateurs, Traefik Hub est une plateforme de logiciel en tant que service (SaaS) qui s’intègre à Traefik et Nginx et fournit instantanément une passerelle vers des services exécutés sur n’importe quel environnement Kubernetes ou Docker.

À suivre !

--

--

Karim
Karim

Written by Karim

Above the clouds, the sky is always blue ...

No responses yet