
🔐 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 !