No alternative text provided

🔐 Accès sécurisé à Kubernetes avec Teleport : fini les port-forwards manuels

J’héberge oursi.net sur un cluster Kubernetes auto-hébergé, et je gère toute l’infra avec ArgoCD. Mais comme beaucoup d'entre vous, j’en avais marre de devoir faire ça à chaque fois que je voulais voir mes déploiements :

1kubectl port-forward svc/argocd-server -n argocd 8080:8080

Puis ouvrir https://localhost:8080 dans le navigateur. Bof.

Alors j’ai décidé d’installer Teleport.

🧭 C’est quoi Teleport ?

Teleport est une plateforme d’accès sécurisé — un peu comme un bastion moderne sous stéroïdes. Elle fournit :

  • une interface web
  • un accès en ligne de commande
  • une authentification zéro confiance pour SSH, Kubernetes, les bases de données et les applis web

… tout ça avec un seul login (avec passkey ou OTP).

Dans mon cas, je voulais utiliser Teleport pour exposer mes services internes (comme ArgoCD et Argo Workflows) de manière sécurisée, sans les rendre publics.

🛠️ Installer Teleport avec Helm + ArgoCD

J’utilise GitOps, donc tout passe par ArgoCD. La première étape consiste à déployer le cluster principal de Teleport.

1apiVersion: argoproj.io/v1alpha1
2kind: Application
3metadata:
4  name: teleport
5  namespace: argocd
6spec:
7  project: default
8  source:
9    repoURL: https://charts.releases.teleport.dev
10    chart: teleport-cluster
11    targetRevision: 17.5.1
12    helm:
13      values: |
14        clusterName: "teleport.oursi.net"
15        service:
16          type: ClusterIP
17        ingress:
18          enabled: false
19        proxyListenerMode: multiplex
20        acme: false
21        tls:
22          existingSecretName: teleport-tls-cert
23        operator:
24          enabled: true
25        persistence:
26          enabled: true
27          storageClassName: "local-path"
28          size: 10Gi
29        log:
30          level: INFO
31        resources:
32          limits:
33            cpu: 500m
34            memory: 512Mi
35          requests:
36            cpu: 250m
37            memory: 256Mi
38  destination:
39    server: https://kubernetes.default.svc
40    namespace: teleport-cluster
41  syncPolicy:
42    automated:
43      prune: true
44      selfHeal: true
45    syncOptions:
46      - CreateNamespace=true

🔐 TLS avec cert-manager

J’ai généré un certificat TLS avec cert-manager et Let’s Encrypt :

1apiVersion: cert-manager.io/v1
2kind: Certificate
3metadata:
4  name: teleport-tls-cert
5  namespace: teleport-cluster
6spec:
7  secretName: teleport-tls-cert
8  dnsNames:
9    - teleport.oursi.net
10    - "*.teleport.oursi.net"
11  issuerRef:
12    name: letsencrypt-issuer
13    kind: ClusterIssuer
14    group: cert-manager.io

C'est ce secret que je référence dans le chart Helm du cluster Teleport.

🌐 Exposer Teleport avec Traefik (IngressRouteTCP)

Teleport parle TLS natif via TCP. Impossible de le faire fonctionner correctement avec un Ingress standard, donc j’ai utilisé IngressRouteTCP de Traefik :

1apiVersion: traefik.io/v1alpha1
2kind: IngressRouteTCP
3metadata:
4  name: teleport-tcp
5  namespace: teleport-cluster
6spec:
7  entryPoints:
8    - websecure
9  routes:
10    - match: HostSNI(`teleport.oursi.net`)
11      services:
12        - name: teleport
13          port: 443
14          nativeLB: true
15    - match: HostSNI(`argocd.teleport.oursi.net`)
16      services:
17        - name: teleport
18          port: 443
19          nativeLB: true
20    - match: HostSNI(`argowf.teleport.oursi.net`)
21      services:
22        - name: teleport
23          port: 443
24          nativeLB: true
25  tls:
26    passthrough: true

L'inconvénient avec cette méthode est que je dois penser à ajouter le hostname ici quand j'expose une nouvelle application.

👤 Créer un utilisateur avec les CRD de Teleport

Pour créer un utilisateur Teleport avec un accès admin, j’utilise ce YAML :

1apiVersion: resources.teleport.dev/v2
2kind: TeleportUser
3metadata:
4  name: benoit
5  namespace: teleport-cluster
6spec:
7  roles:
8    - access
9    - editor

Cela crée l’utilisateur, mais il faut encore générer un mot de passe. Pour ça, on génère un lien de réinitialisation :

1kubectl -n teleport-cluster exec -ti deployment/teleport-auth -- tctl users reset benoit

Ouvre le lien et voilà, tu peux te connecter ✨

🔌 Installer l’agent Kubernetes

Pour exposer ArgoCD et Argo Workflows, j’ai déployé teleport-kube-agent.

D’abord, on crée un jeton de connexion :

1apiVersion: resources.teleport.dev/v2
2kind: TeleportProvisionToken
3metadata:
4  name: kubernetes-app-token
5  namespace: teleport-cluster
6spec:
7  roles: [App]
8  join_method: kubernetes
9  kubernetes:
10    type: in_cluster
11    allow:
12      - service_account: "teleport-cluster:teleport-agent"

Puis j’installe le chart Helm via ArgoCD :

1apiVersion: argoproj.io/v1alpha1
2kind: Application
3metadata:
4  name: teleport-agent
5  namespace: argocd
6spec:
7  project: default
8  source:
9    repoURL: https://charts.releases.teleport.dev
10    chart: teleport-kube-agent
11    targetRevision: 17.5.1
12    helm:
13      values: |
14        proxyAddr: "teleport.oursi.net:443"
15        roles: app
16        joinParams:
17          method: "kubernetes"
18          tokenName: "kubernetes-app-token"
19        apps:
20          - name: argocd
21            uri: "https://argocd-server.argocd.svc.cluster.local"
22            public_addr: argocd.teleport.oursi.net
23            insecure_skip_verify: true
24            rewrite:
25              redirect:
26                - argocd-server.argocd.svc.cluster.local
27          - name: argowf
28            uri: "https://argo-server.argo.svc.cluster.local:2746"
29            public_addr: argowf.teleport.oursi.net
30            insecure_skip_verify: true
31            rewrite:
32              redirect:
33                - argo-server.argo.svc.cluster.local
34  destination:
35    server: https://kubernetes.default.svc
36    namespace: teleport-cluster
37  syncPolicy:
38    automated:
39      prune: true
40      selfHeal: true
41    syncOptions:
42      - CreateNamespace=true

🎉 Résultat

Maintenant, je peux simplement aller sur :

https://argocd.teleport.oursi.net
https://argowf.teleport.oursi.net

… me connecter avec une passkey, et accéder à tout ça en toute sécurité 🚀

Teleport supprime la douleur du port-forward, du tunnel SSH et de l’auth multi-cluster avec une interface élégante. Je recommande à tous ceux qui font du GitOps ou qui exposent des outils internes !