teleport-cluster Chart Reference
The teleport-cluster
Helm chart deploys a Teleport cluster on Kubernetes.
This includes deploying proxies, auth servers, and kubernetes-access.
See the Teleport HA Architecture page
for more details.
You can browse the source on GitHub.
The teleport-cluster
chart runs three Teleport services, split into two sets of pods:
Teleport service | Running in | Purpose | Documentation |
---|---|---|---|
auth_service | auth Deployment | Authenticates users and hosts, and issues certificates. | Auth documentation |
kubernetes_service | auth Deployment | Provides secure access to the Kubernetes cluster where the Teleport cluster is hosted. | Kubernetes Access documentation |
proxy_service | proxy Deployment | Runs the externally-facing parts of a Teleport cluster, such as the web UI, SSH proxy and reverse tunnel service. | Proxy documentation |
If you want to provide access to resources like Databases, Applications or other
Kubernetes clusters than the one hosting the Teleport cluster, you should use the
teleport-kube-agent
Helm chart.
teleport-cluster
hosts a Teleport cluster, you should only need one.teleport-kube-agent
connects to an existing Teleport cluster and exposes configured resources.
This reference details available values for the teleport-cluster
chart.
The teleport-cluster
chart can be deployed in four different modes.
Get started with a guide for each mode:
chartMode | Purpose | Guide |
---|---|---|
standalone | Runs by relying only on Kubernetes resources. | Getting Started - Kubernetes |
aws | Leverages AWS managed services to store data. | Running an HA Teleport cluster using an AWS EKS Cluster |
gcp | Leverages GCP managed services to store data. | Running an HA Teleport cluster using a Google Cloud GKE cluster |
azure | Leverages Azure managed services to store data. | Running an HA Teleport cluster using a Microsoft Azure AKS cluster |
scratch (v12 and above) | Generates empty Teleport configuration. User must pass their own config. This is discouraged, use standalone mode with auth.teleportConfig and proxy.teleportConfig instead. | Running a Teleport cluster with a custom config |
custom
mode has been removed in Teleport version 12. See the version 12
migration guide for
more information.
The chart is versioned with Teleport. No compatibility guarantees are ensured between new charts and previous major Teleport versions. It is strongly recommended to always deploy a Teleport version with the same major version as the Helm chart.
Backing up production instances, environments, and/or settings before making permanent modifications is encouraged as a best practice. Doing so allows you to roll back to an existing state if needed.
clusterName
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
string | nil | Yes | auth_service.cluster_name , proxy_service.public_addr |
clusterName
controls the name used to refer to the Teleport cluster, along with
the externally-facing public address used to access it. In most setups this must
be a fully-qualified domain name (e.g. teleport.example.com
) as this value is
used as the cluster's public address by default.
When using a fully qualified domain name as your clusterName
, you will also
need to configure the DNS provider for this domain to point to the external
load balancer address of your Teleport cluster.
Whether an IP or hostname is provided as an external address for the load balancer varies according to the provider.
- EKS (hostname)
- GKE (IP address)
EKS uses a hostname:
$ kubectl --namespace teleport-cluster get service/teleport -o jsonpath='{.status.loadBalancer.ingress[*].hostname}'
# a5f22a02798f541e58c6641c1b158ea3-1989279894.us-east-1.elb.amazonaws.com
GKE uses an IP address:
$ kubectl --namespace teleport-cluster get service/teleport -o jsonpath='{.status.loadBalancer.ingress[*].ip}'
# 35.203.56.38
You will need to manually add a DNS A record pointing teleport.example.com
to
the IP, or a CNAME record pointing to the hostname of the Kubernetes load balancer.
Using Application Access?
Teleport assigns a subdomain to each application you configure for Application
Access. For example, if you enroll Grafana as a resource, Teleport assigns the resource
to the grafana.teleport.example.com
subdomain.
If you host the Teleport cluster on your own network, you should update your DNS configuration to account for application subdomains. You can update DNS in one of two ways:
- Create a single DNS address (A) or canonical name (CNAME) record using wildcard substitution
for the subdomain name. For example, create a DNS record with the name
*.teleport.example.com
. - Create a separate DNS address (A) or canonical name (CNAME) record for each application subdomain.
Modifying DNS ensures that the certificate authority—for example, Let's Encrypt—can issue a certificate for each subdomain and that clients can verify Teleport hosts regardless of the application they are accessing.
If you use the Teleport cloud platform, no DNS updates are needed because your Teleport cluster automatically provides the subdomains and signed TLS certificates for your applications under your tenant address.
The clusterName
cannot be changed during a Teleport cluster's lifespan.
If you need to change it, you must redeploy a completely new cluster.
kubeClusterName
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
string | clusterName value | no | kubernetes_service.kube_cluster_name |
kubeClusterName
sets the name used for Kubernetes access.
This name will be shown to Teleport users connecting to the Kubernetes cluster.
auth
Type | Default value | Required? |
---|---|---|
object | no |
The teleport-cluster
chart deploys two sets of pods, one for the Auth Service
and another for the Proxy Service.
auth
allows you to set chart values only for Kubernetes resources related to the Teleport Auth Service.
This is merged with chart-scoped values and takes precedence in case of conflict.
For example, to override the postStart
value only for auth pods:
# By default all pods postStart command should be "echo starting"
postStart: ["echo", "starting"]
auth:
# But we override the `postStart` value specifically for auth pods
postStart: ["curl", "http://hook"]
imagePullPolicy: Always
proxyProtocol
Component | Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|---|
proxy | string | null | no | proxy_service.proxy_protocol |
The proxyProtocol
value controls whether the Proxy pods will
accept PROXY lines with the client's IP address when they are
behind a L4 load balancer (e.g. AWS ELB, GCP L4 LB, etc) with PROXY protocol
enabled. Since L4 LBs do not preserve the client's IP address, PROXY protocol is
required to ensure that Teleport can properly audit the client's IP address.
When Teleport pods are not behind a L4 LB with PROXY protocol enabled, this
value should be set to off
to prevent Teleport from accepting PROXY headers
from untrusted sources.
Possible values are:
on
: will enable the PROXY protocol for all connections and will require the L4 LB to send a PROXY header.off
will disable the PROXY protocol for all connections and denies all connections prefixed a PROXY header.
If proxyProtocol
is unspecified, Teleport does not require PROXY header for the
connection, but will accept it if present. This mode is considered insecure
and should only be used for testing purposes.
See the PROXY Protocol security section for more details.
auth.teleportConfig
Type | Default value | Required? |
---|---|---|
object | no |
auth.teleportConfig
contains YAML teleport configuration for auth pods.
The configuration will be merged with the chart-generated configuration
and will take precedence in case of conflict. This field allows customization of/overrides to
any bit of configuration in teleport.yaml
without having to use
the scratch
chart mode.
The merge logic is as follows:
- object fields are merged recursively
- lists are replaced
- values (string, integer, boolean, ...) are replaced
- fields can be unset by setting them to
null
or~
See the Teleport Configuration Reference for the list of supported fields.
auth:
teleportConfig:
teleport:
cache:
enabled: false
auth_service:
client_idle_timeout: 2h
client_idle_timeout_message: "Connection closed after 2 hours without activity"
proxy
Type | Default value | Required? |
---|---|---|
object | no |
The teleport-cluster
charts deploys two sets of pods: one for the Auth Service
and another for the Proxy Service.
proxy
allows you to set chart values only for Kubernetes resources related to the Teleport Proxy Service.
This is merged with chart-scoped values and takes precedence in case of conflict.
For example, to override the postStart
value only for Teleport Proxy Service pods
and annotate the Kubernetes Service deployed for the Teleport Proxy Service:
# By default all pods postStart command should be "echo starting"
postStart: ["echo", "starting"]
proxy:
# But we override the `postStart` value specifically for proxy pods
postStart: ["curl", "http://hook"]
imagePullPolicy: Always
# We also annotate only the Kubernetes Service sending traffic to Proxy Service pods.
annotations:
service:
external-dns.alpha.kubernetes.io/hostname: "teleport.example.com"
proxy.teleportConfig
Type | Default value | Required? |
---|---|---|
object | no |
proxy.teleportConfig
contains YAML teleport configuration for proxy pods
The configuration will be merged with the chart-generated configuration
and will take precedence in case of conflict. This field allows customization of/overrides to
any bit of configuration in teleport.yaml
without having to use
the scratch
chart mode.
The merge logic is as follows:
- object fields are merged recursively
- lists are replaced
- values (string, integer, boolean, ...) are replaced
- fields can be unset by setting them to
null
or~
See the Teleport Configuration Reference for the list of supported fields.
proxy:
teleportConfig:
teleport:
cache:
enabled: false
proxy_service:
https_keypairs:
- key_file: /my-custom-mount/key.pem
cert_file: /my-custom-mount/cert.pem
authentication
authentication.type
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
string | local | Yes | auth_service.authentication.type |
authentication.type
controls the authentication scheme used by Teleport.
Possible values are local
and github
for Teleport Community Edition, plus oidc
and saml
for Enterprise.
authentication.connectorName
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
string | "" | No | auth_service.authentication.connector_name |
authentication.connectorName
sets the default authentication connector.
The SSO documentation explains how to create
authentication connectors for common identity providers. In addition to SSO
connector names, the following built-in connectors are supported:
local
for local userspasswordless
to enable by default passwordless authentication.
Defaults to local
.
authentication.localAuth
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
bool | true | No | auth_service.authentication.local_auth |
authentication.localAuth
controls whether local authentication is enabled.
When disabled, users can only log in through authentication connectors like saml
, oidc
or github
.
Disabling local auth is required for FedRAMP / FIPS.
authentication.lockingMode
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
string | "" | No | auth_service.authentication.locking_mode |
authentication.lockingMode
controls the locking mode cluster-wide. Possible values are best_effort
and strict
.
See the locking modes documentation for more
details.
Defaults to Teleport's binary default when empty: best_effort
.
authentication.passwordless
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
bool | nil | No | auth_service.authentication.passwordless |
authentication.passwordless
controls whether passwordless authentication is enabled.
Can be used to forbid passwordless access to your cluster
authentication.secondFactor
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
string | otp | Yes | auth_service.authentication.second_factor |
authentication.secondFactor
controls the second factor used for local user authentication. Possible values supported by this chart
are on
, otp
, and webauthn
.
When set to on
or webauthn
, the authenticationSecondFactor.webauthn
section can also be used.
The configured rp_id
defaults to clusterName
.
If you set publicAddr
for users to access the cluster under a domain different
to clusterName
, you must manually set the webauthn Relying
Party Identifier (RP
ID). If you don't,
RP ID will default to clusterName
and users will fail to register second
factors.
You can do this by setting the value
auth.teleportConfig.auth_service.authentication.webauthn.rp_id
.
RP ID must be both a valid domain, and part of the full domain users are connecting to. For example, if users are accessing the cluster with the domain "teleport.example.com", RP ID can be "teleport.example.com" or "example.com".
Changing the RP ID will invalidate all already registered webauthn second factors.
authentication.webauthn
See Second Factor - WebAuthn for more details.
authentication.webauthn.attestationAllowedCas
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
array | [] | No | auth_service.authentication.webauthn.attestation_allowed_cas |
authentication.webauthn.attestationAllowedCas
is an optional allow list of certificate authorities (as local file paths or in-line PEM certificate string) for
device verification.
This field allows you to restrict which device models and vendors you trust.
Devices outside of the list will be rejected during registration.
By default all devices are allowed.
authentication.webauthn.attestationDeniedCas
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
array | [] | No | auth_service.authentication.webauthn.attestation_denied_cas |
authentication.webauthn.attestationDeniedCas
is optional deny list of certificate authorities (as local file paths or in-line PEM certificate string) for
device verification.
This field allows you to forbid specific device models and vendors, while allowing all others (provided they clear attestation_allowed_cas as well).
Devices within this list will be rejected during registration.
By default no devices are forbidden.
proxyListenerMode
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
string | nil | no | auth_service.proxy_listener_mode |
proxyListenerMode
controls proxy TLS routing used by Teleport. Possible values are multiplex
, separate
.
values.yaml
example:
proxyListenerMode: multiplex
sessionRecording
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
string | "" | no | auth_service.session_recording |
sessionRecording
controls the session_recording
field in the teleport.yaml
configuration.
It is passed as-is in the configuration.
For possible values, see the Teleport Configuration Reference.
values.yaml
example:
sessionRecording: proxy
separatePostgresListener
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
bool | false | no | proxy_service.postgres_listen_addr |
separatePostgresListener
controls whether Teleport will multiplex PostgreSQL
traffic for the Teleport Database Service over a separate TLS listener to
Teleport's web UI.
When separatePostgresListener
is false
(the default), PostgreSQL traffic will be directed to port 443 (the default Teleport web
UI port). This works in situations when Teleport is terminating its own TLS traffic, i.e. when using certificates from LetsEncrypt
or providing a certificate/private key pair via Teleport's proxy_service.https_keypairs
config.
When separatePostgresListener
is true
, PostgreSQL traffic will be directed to a separate Postgres-only listener on port 5432.
This also adds the port to the Service
that the chart creates. This is useful when terminating TLS at a load balancer
in front of Teleport, such as when using AWS ACM.
These settings will not apply if proxyListenerMode
is set to multiplex
.
values.yaml
example:
separatePostgresListener: true
separateMongoListener
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
bool | false | no | proxy_service.mongo_listen_addr |
separateMongoListener
controls whether Teleport will multiplex PostgreSQL traffic for the Teleport Database Service
over a separate TLS listener to Teleport's web UI.
When separateMongoListener
is false
(the default), MongoDB traffic will be directed to port 443 (the default Teleport web
UI port). This works in situations when Teleport is terminating its own TLS traffic, i.e. when using certificates from LetsEncrypt
or providing a certificate/private key pair via Teleport's proxy_service.https_keypairs
config.
When separateMongoListener
is true
, MongoDB traffic will be directed to a separate Mongo-only listener on port 27017.
This also adds the port to the Service
that the chart creates. This is useful when terminating TLS at a load balancer
in front of Teleport, such as when using AWS ACM.
These settings will not apply if proxyListenerMode
is set to multiplex
.
values.yaml
example:
separateMongoListener: true
publicAddr
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
list[string] | [] | no | proxy_service.public_addr |
publicAddr
controls the advertised addresses for TLS connections.
When publicAddr
is not set, the address used is clusterName
on port 443.
If you set publicAddr
for users to access the cluster under a domain different
to clusterName
you must manually set the webauthn Relying
Party Identifier (RP
ID). If you don't,
RP ID will default to clusterName
and users will fail to register second
factors.
You can do this by setting the value
auth.teleportConfig.auth_service.authentication.webauthn.rp_id
.
RP ID must be both a valid domain, and part of the full domain users are connecting to. For example, if users are accessing the cluster with the domain "teleport.example.com", RP ID can be "teleport.example.com" or "example.com".
Changing the RP ID will invalidate all already registered webauthn second factors.
values.yaml
example:
publicAddr: ["loadbalancer.example.com:443"]
kubePublicAddr
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
list[string] | [] | no | proxy_service.kube_public_addr |
kubePublicAddr
controls the advertised addresses for the Kubernetes proxy.
This setting will not apply if proxyListenerMode
is set to multiplex
.
When kubePublicAddr
is not set, the addresses are inferred from publicAddr
if set,
else clusterName
is used. Default port is 3026.
values.yaml
example:
kubePublicAddr: ["loadbalancer.example.com:3026"]
mongoPublicAddr
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
list[string] | [] | no | proxy_service.mongo_public_addr |
mongoPublicAddr
controls the advertised addresses to MongoDB clients.
This setting will not apply if proxyListenerMode
is set to multiplex
and
requires separateMongoListener
enabled.
When mongoPublicAddr
is not set, the addresses are inferred from clusterName
is used.
Default port is 27017.
values.yaml
example:
mongoPublicAddr: ["loadbalancer.example.com:27017"]
mysqlPublicAddr
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
list[string] | [] | no | proxy_service.mysql_public_addr |
mysqlPublicAddr
controls the advertised addresses for the MySQL proxy.
This setting will not apply if proxyListenerMode
is set to multiplex
.
When mysqlPublicAddr
is not set, the addresses are inferred from publicAddr
if set,
else clusterName
is used. Default port is 3036.
values.yaml
example:
mysqlPublicAddr: ["loadbalancer.example.com:3036"]
postgresPublicAddr
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
list[string] | [] | no | proxy_service.postgres_public_addr |
postgresPublicAddr
controls the advertised addresses to postgres clients.
This setting will not apply if proxyListenerMode
is set to multiplex
and
requires separatePostgresListener
enabled.
When postgresPublicAddr
is not set, the addresses are inferred from publicAddr
if set,
else clusterName
is used. Default port is 5432.
values.yaml
example:
postgresPublicAddr: ["loadbalancer.example.com:5432"]
sshPublicAddr
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
list[string] | [] | no | proxy_service.ssh_public_addr |
sshPublicAddr
controls the advertised addresses for SSH clients. This is also used by the tsh
client.
This setting will not apply if proxyListenerMode
is set to multiplex
.
When sshPublicAddr
is not set, the addresses are inferred from publicAddr
if set,
else clusterName
is used. Default port is 3023.
values.yaml
example:
sshPublicAddr: ["loadbalancer.example.com:3023"]
tunnelPublicAddr
Type | Default value | Required? | teleport.yaml equivalent |
---|---|---|---|
list[string] | [] | no | proxy_service.tunnel_public_addr |
tunnelPublicAddr
controls the advertised addresses to trusted clusters or nodes joining via node-tunneling.
This setting will not apply if proxyListenerMode
is set to multiplex
.
When tunnelPublicAddr
is not set, the addresses are inferred from publicAddr
if set,
else clusterName
is used. Default port is 3024.
values.yaml
example:
tunnelPublicAddr: ["loadbalancer.example.com:3024"]
enterprise
Type | Default value |
---|---|
bool | false |
enterprise
controls whether to use Teleport Community Edition or Teleport Enterprise.
Setting enterprise
to true
will use the Teleport Enterprise image.
You will also need to download your Enterprise license from the Teleport dashboard and add it as a Kubernetes secret to use this:
$ kubectl --namespace teleport create secret generic license --from-file=/path/to/downloaded/license.pem
If you installed the Teleport chart into a specific namespace, the license
secret you create must also be added to the same namespace.
The file added to the secret must be called license.pem
. If you have renamed it, you can specify the filename to use in the secret creation command:
$ kubectl --namespace teleport create secret generic license --from-file=license.pem=/path/to/downloaded/this-is-my-teleport-license.pem
values.yaml
example:
enterprise: true
licenseSecretName
Type | Default value |
---|---|
string | license |
licenseSecretName
controls Kubernetes secret name for the Enterprise license.
By using this value you will update the Kubernetes volume specification to mount Secret based volume to the container using custom name.
values.yaml
example:
licenseSecretName: enterprise-license
installCRDs
Type | Default value |
---|---|
bool | false |
CRDs are not namespace-scoped resources - they can be installed only once in a cluster.
CRDs are required by the Teleport Kubernetes Operator and are installed by default when operator.enabled
is true.
installCRDs
overrides this behavior and allows users to indicate whether to deploy Teleport CRDs.
If several releases of the teleport-cluster
chart are deployed in the same Kubernetes cluster, only one
release should have installCRDs
enabled. Unless you are deploying multiple teleport-cluster
Helm releases in
the same Kubernetes cluster or installing the CRDs on your own you should not have to set this value.
values.yaml
example:
installCRDs: true