GoTeleport - GitOps Deployment on Kubernetes
🔧 Pré-requis
GoTeleport peut être déployer sur un cluster Kubernetes ou directement sur une machine virtuelle.
Kubernetes est recommandé pour un déploiement HA, fortement conseillé en production pour fournir à minima du failover et au mieux une redondance.
Notre objectif ici est de déployer GoTeleport avec ArgoCD et l'intégrer automatiquement à notre référentiel d'identité, nous commencerons par identifier le processus de déploiement manuel avec un Helm Chart avant de l'automatiser.
⛴️ Kubernetes
Ce guide concerne les déploiements pour Teleport v12 et supérieur (v17 au jour de l'écriture de ce guide). De quoi avons-nous besoin côté Kubernetes ?
🪣 Stockage
Il existe plusieurs modes de déploiement correspondant à chaque provider Kubernetes. Nous couvrirons ici un environnement self-hosted, soit standalone.
Teleport utilise deux composants : teleport-auth et teleport-proxy .
teleport-proxy est stateless et peut être répliqué à volonté, aucun stockage n'y est associé. Il s'agit du composant exposé via l'Ingress ou le Load Balancer. Il vient par défaut avec deux replicas.
teleport-auth est stateful et nécessite un backend de stockage supporté.
Par défaut, une seule replica sera déployée, c'est parfait si l'on ne cherche qu'à avoir du failover et dans ce cas un simple volume RWO est suffisant.
Pour avec un fonctionnement avec plus d'une replica, il sera nécessaire d'ajuster la configuration et l'architecture.

La documentation référence l'ensemble des backend supportés
📦 Helm Chart et registry
Les charts sont stockés sur le repository Teleport officiel : https://charts.releases.teleport.dev
Les charts qui nous intéressent sont teleport-cluster et teleport-operator.teleport-kube-agent vous sera utile pour intégrer des ressources Kubernetes à la solution. Les autres dépendent de votre cas d'usage.
❯ helm search repo teleport/teleport
NAME CHART VERSION APP VERSION DESCRIPTION
teleport/teleport-access-graph 1.27.3 1.27.3 A Helm chart for Teleport Access Graph
teleport/teleport-cluster 17.4.10 17.4.10 Teleport is an access platform for your infrast...
teleport/teleport-kube-agent 17.4.10 17.4.10 Teleport provides a secure SSH, Kubernetes, dat...
teleport/teleport-operator 17.4.10 17.4.10 Teleport Operator provides management of select...
teleport/teleport-plugin-datadog 17.4.10 17.4.10 A Helm chart for the Teleport Datadog Incident ...
teleport/teleport-plugin-discord 17.4.10 17.4.10 A Helm chart for the Teleport Discord Plugin
teleport/teleport-plugin-email 17.4.10 17.4.10 A Helm chart for the Teleport Email Plugin
teleport/teleport-plugin-event-handler 17.4.10 17.4.10 A Helm chart for Teleport Event Handler Plugin
teleport/teleport-plugin-jira 17.4.10 17.4.10 A Helm chart for the Teleport Jira Plugin
teleport/teleport-plugin-mattermost 17.4.10 17.4.10 A Helm chart for the Teleport Mattermost Plugin
teleport/teleport-plugin-msteams 17.4.10 17.4.10 A Helm chart for the Teleport MsTeams Plugin
teleport/teleport-plugin-pagerduty 17.4.10 17.4.10 A Helm chart for the Teleport Pagerduty Plugin
teleport/teleport-plugin-slack 17.4.10 17.4.10 A Helm chart for the Teleport Slack Plugin Les images utilisées sont hébergées sur la registry officielle : public.ecr.aws/gravitational/ sur AWS.
Il n'y en a que trois :
helm show values teleport/teleport-cluster | grep "image:"
image: public.ecr.aws/gravitational/teleport-operator
image: public.ecr.aws/gravitational/teleport-distroless
enterpriseImage: public.ecr.aws/gravitational/teleport-ent-distroless
Si votre environnement est air-gapped ou si vous restreignez l'usage d'image externe, pensez à les synchroniser au préalable.
🌐 Ingress ou Load Balancer
Le déploiement en mode Load Balancer vous permet d'exposer directement Teleport sur une adresse privée ou publique, derrière un reverse proxy externe ou non.
Il est également possible de le déployer derrière un contrôleur Ingress comme Traefik que nous utiliserons ici, couplé à cert-manager pour générer un certificat.
🔗 Réseau
La topologie réseau variera également en fonction de votre choix :
- Avec un LoadBalancer, des flux devront être ouvert vers les différents services. La documentation référence l'ensemble des ports à ouvrir.

- Avec un Ingress, les agents se connecteront simplement au Proxy Service au travers du contrôleur sur le port 443. Les accès à la console Teleport se feront sur la même interface.
- Notez que les flux nécessaire dépendront également de vos déploiements, par exemple si vous donnez l'accès à une application web ou une API depuis l'un des agents enregistrés, même chose pour les accès aux bases de données ou RDP.
🚀 Déploiement
👷♂️ Manuellement
Cette section se base sur la documentation officielle et mes expériences personnelles. Ce guide sera mis à jour régulièrement mais les choses ayant pu évoluée, n'hésitez pas à vous référez au site de GoTeleport.
Pour déployer GoTeleport, vous pouvez utilisez le dépôt officiel ou les intégrer à un repo interne.
Ajouter le repo si nécessaire :
helm repo add teleport https://charts.releases.teleport.devPour déployer l'image :
helm install teleport-cluster teleport/teleport-cluster \
--create-namespace --version 17.4.8 \
--values teleport-cluster-values.yamlLe fichier de values dépendra de vos besoins, la documentation reprend toutes les propriétés :

Ci-dessous un exemple pour un déploiement sur un cluster Kubernetes .
acme: false
chartMode: standalone
clusterName: teleport.prod.zenops360.fr
createProxyToken: true
enterprise: true
highAvailability:
replicaCount: 1
annotations:
ingress:
cert-manager.io/cluster-issuer: letsencrypt-prod
traefik.ingress.kubernetes.io/service.serversscheme: https
traefik.ingress.kubernetes.io/service.serverstransport: "teleport-transport"
traefik.ingress.kubernetes.io/service.passhostheader: "true"
ingress:
enabled: true
spec:
ingressClassName: traefik
operator:
enabled: true
persistence:
enabled: true
volumeSize: 20Gi
rbac:
create: true
service:
type: ClusterIP
sessionRecording: ''
tls:
existingCASecretName: ''
existingSecretName: 'teleport-tls'
extraLabels:
service:
traefik.ingress.kubernetes.io/service.serversscheme: https
traefik.ingress.kubernetes.io/service.serverstransport: "teleport-transport"
traefik.http.serverstransports.mytransport.insecureskipverify: "true"
Quelques remarques :
chartMode: standalone- Indique que le cluster Kubernetes est self-managed, il existe des attributs spécifique pour chaque hyperscaler.
enterprise: true- Déploie la version Enterprise et nécessite une licence qui devra être créé dans un
Secretnommélicensedans le même namespace que l'application. - Le secret devra contenir la licence sous une clé
license.pem
- Déploie la version Enterprise et nécessite une licence qui devra être créé dans un
apiVersion: v1
kind: Secret
metadata:
name: license
namespace: teleport
type: Opaque
data:
license.pem: LS0tLS1CRUdJTiB....
Exemple de licence
operator.enabled: true- Déploie l'opérateur Teleport, permet de créer des objets depuis des CRDs
- Les autres paramètres sont propres à mon installation. Par exemple, Traefik n'est par défaut pas trop friand de rediriger son traffic vers un backend TLS avec un certificat non valide.
⚡ Avec ArgoCD
Dans une configuration avec un ApplicationSet (App of apps pattern), voici un exemple de déploiement.
Quelques remarques :
- Ici, le Helm Chart est déployé directement depuis le repository officiel.
- Le fichier de values est stocké dans un repo Git, préfixé avec le nom du cluster.
- Des manifests sont également déployés via Kustomize dans un autre dossier du même repo, c'est ici que nous déploierons les ressources Kubernetes dont l'operator aura besoin pour configurer Teleport.
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
name: teleport
namespace: argocd
spec:
goTemplate: true
goTemplateOptions: ["missingkey=error"]
syncPolicy:
applicationsSync: sync
generators:
- clusters:
selector:
matchLabels:
app: teleport-cluster
template:
metadata:
name: '{{.name}}-teleport'
spec:
project: default
sources:
- repoURL: https://gitlab.prod.zenops.fr/prod/zenops-apps.git
targetRevision: HEAD
ref: values
- repoURL: https://charts.releases.teleport.dev
targetRevision: 17.4.10
chart: teleport-cluster
helm:
releaseName: teleport
valueFiles:
- $values/Helm/teleport/{{.name}}.teleport-cluster.values.yaml
- path: 'Kustomize/app/teleport/{{.name}}'
repoURL: https://gitlab.prod.zenops.fr/prod/zenops-apps.git
targetRevision: HEAD
destination:
server: '{{.server}}'
namespace: teleport
syncPolicy:
syncOptions:
- CreateNamespace=true
automated:
prune: true
selfHeal: true⚙️ Configuration
🔐 Référentiel d'identité
La version communautaire ne permet d'intégrer que des comptes locaux, ou tiré de GitHub. Pour vous intégrer à un référentiel SAML, OIDC, Okta, Entra ID ou Google Workspace, il vous faudra déployer la version d'entreprise.
Nous utiliserons ici Keycloak comme référentiel d'identité, avec un provider SAML. La documentation officielle explique très clairement comment configurer intégrer Teleport à votre Keycloak, n'hésitez donc pas à vous y référer pour paramétrer le client.

Ci-dessous un exemple de configuration dans lequel nous rattachons le groupe devopsprésent dans Keycloak avec les rôles devops et access de Teleport:
#keycloak.samlconnector.yaml
apiVersion: resources.teleport.dev/v2
kind: TeleportSAMLConnector
metadata:
name: keycloak-connector
namespace: teleport
spec:
acs: https://teleport.prod.zenops360.fr/v1/webapi/saml/acs/keycloak
attributes_to_roles:
- name: groups
roles:
- devops
- access
value: "/devops"
audience: https://teleport.prod.zenops360.fr/v1/webapi/saml/acs/keycloak
entity_descriptor_url: https://keycloak.prod.zenops360.fr/realms/prod/protocol/saml/descriptor
service_provider_issuer: https://teleport.prod.zenops360.fr/v1/webapi/saml/acs/keycloakNotre AppSet ArgoCD déploie également un ensemble de manifest via Kustomize, dont le connecteur SAML.
#kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- secrets.license.yaml
- keycloak.samlconnector.yaml
- devops.teleportroles.yamlNotre connecteur faisant référence au rôle devops qui n'existe pas par défaut, nous devrons également créer le rôle.
apiVersion: resources.teleport.dev/v1
kind: TeleportRoleV7
metadata:
name: devops
spec:
allow:
rules:
- resources: ['*']
verbs: ['*'] 🎯 Et ensuite ?
Cette configuration vous permet d'intégrer automatiquement une nouvelle installation de Teleport à votre référentiel d'identité, il s'agit d'un exemple pour démarrer, vous devrez adapter la configuration à votre cas d'usage.