Install SDR orchestrator on Kubernetes
Some capabilities shown here may require additional enablement or licensing. Contact your Atlan representative for details.
This guide walks you through deploying the SDR Orchestrator on a Kubernetes cluster. You download the SDR package, fill in a single configuration file, install via Helm, and verify the connection in the Atlan UI. The SDR Orchestrator then automatically manages the full lifecycle of Atlan apps—installation, upgrades, health checks, and self-updates—without any manual intervention.
For Docker or Podman-based installations, see Install SDR Orchestrator on Docker/Podman.
System requirements
- Kubernetes cluster: EKS, GKE, AKS, k3s, OpenShift, RKE2, or any CNCF-conformant distribution. See supported distributions.
- Kubernetes version: 1.24+
- CLI tools:
kubectlandhelm(v3+) configured with access to the target cluster - SDR Orchestrator resources:
- CPU: 100m request, 500m limit
- Memory: 256Mi request, 512Mi limit
- Per app resources: 0.5–1 vCPU, 512 MB–1 GB memory (varies by app)
Prerequisites
Setup takes 10–15 minutes. Gather credentials from your infrastructure team beforehand.
Before you begin, verify you have:
- kubectl and helm (v3+) configured with administrative access to the target cluster (ability to create namespaces, roles, deployments)
- An OAuth client ID and client secret from your Atlan representative
- A Docker Hub Personal Access Token (PAT) from your Atlan representative (required to pull private app images)
- The PAT is regenerated periodically—contact your Atlan representative for the latest token.
- Object storage: AWS S3, Google Cloud Storage, or Azure Blob Storage. See Dapr object store docs.
- Secret store: AWS Secrets Manager, Azure Key Vault, GCP Secret Manager, or HashiCorp Vault. See Dapr secret store docs.
- Outbound network connectivity (HTTPS) from the cluster to:
<tenant>.atlan.com:Atlan API, auth, event ingress<tenant>-temporal.atlan.com:443:Temporal workflow serverdocker.io:pull app container images
Download SDR package
Download the SDR package from Atlan. This archive contains the Helm chart, a pre-filled values.yaml template, and a README.
curl -fSL -o sdr-orchestrator-k8s.tar.gz \
https://atlan-public.s3.eu-west-1.amazonaws.com/sdr-orchestrator-k8s-app/sdr-orchestrator-k8s.tar.gz
tar -xzf sdr-orchestrator-k8s.tar.gz
cd sdr-orchestrator-k8s
The extracted directory contains the following files:
sdr-orchestrator-k8s/
├── chart/ # Helm chart (do not modify)
├── values.yaml # Configuration file (edit this)
└── README.md # Quick reference
Create namespace and registry credentials
Create the atlan namespace and a secret for pulling private app images from Docker Hub.
kubectl create namespace atlan
kubectl create secret docker-registry atlan-registry-creds \
--namespace atlan \
--docker-server=docker.io \
--docker-username=YOUR_DOCKERHUB_USERNAME \
--docker-password=YOUR_DOCKERHUB_PAT
Replace YOUR_DOCKERHUB_USERNAME and YOUR_DOCKERHUB_PAT with the credentials provided by your Atlan representative.
The Docker Hub PAT is regenerated periodically. If pulls start failing, contact your Atlan representative for the latest token.
Configure values.yaml
Open values.yaml and fill in the required values. The SDR image tag is already pre-filled. Don't change it.
Atlan identity
- deploymentName: A unique identifier for this SDR installation (for example,
mycompany-eks). Lowercase letters, numbers, and hyphens only. Must start and end with a letter or number. - domain: Your Atlan tenant domain (for example,
mycompany.atlan.com). Don't includehttps://.
sdr:
enabled: true
deploymentName: "mycompany-eks"
credentials:
clientId: "oauth-client-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
clientSecret: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
config:
domain: "mycompany.atlan.com"
Object storage
Self-Deployed Runtime needs a store for reading or writing files. Configure the object storage under sdr.config.components.
Dapr supports additional object stores. For more information, see Dapr object store documentation.
- AWS S3
- Google Cloud Storage
- Azure Blob Storage
Add AWS S3 configuration. For more information, see AWS S3 Binding Spec.
sdr:
config:
components:
objectstore:
type: bindings.aws.s3
version: v1
metadata:
- name: accessKey # optional, leave empty for IAM / IRSA authentication
value: ""
- name: secretKey # optional, leave empty for IAM / IRSA authentication
value: ""
- name: bucket # required
value: "<bucket-name>"
- name: region # required
value: "<bucket-region>"
- name: forcePathStyle
value: "true"
Add Google Cloud Storage configuration. For more information, see GCP Storage Bucket binding spec.
sdr:
config:
components:
objectstore:
type: bindings.gcp.bucket
version: v1
metadata:
- name: bucket
value: "<your-gcs-bucket-name>"
- name: type
value: "service_account"
- name: project_id
value: "<your-gcp-project-id>"
Add Azure Blob Storage configuration. For more information, see Azure Blob Storage binding spec.
sdr:
config:
components:
objectstore:
type: bindings.azure.blobstorage
version: v1
metadata:
- name: accountName
value: "<your-storage-account-name>"
- name: accountKey
value: "<your-storage-account-key>"
- name: containerName
value: "<your-container-name>"
Secret store
Self-Deployed Runtime fetches secrets from a secret store to connect to source systems. Configure the secret store under the same sdr.config.components section.
Dapr supports additional secret stores. For more information, see Dapr secret store documentation.
- AWS Secrets Manager
- Azure Key Vault
- GCP Secret Manager
- HashiCorp Vault
Add AWS Secrets Manager configuration. For more information, see AWS Secrets Manager.
sdr:
config:
components:
secretstore:
type: secretstores.aws.secretmanager
version: v1
metadata:
- name: region # required
value: "<secret-region>"
- name: accessKey # optional, leave empty for IAM / IRSA
value: ""
- name: secretKey # optional, leave empty for IAM / IRSA
value: ""
Add Azure Key Vault configuration. For more information, see Azure Key Vault secret store.
sdr:
config:
components:
secretstore:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "<your-keyvault-name>"
- name: azureTenantId
value: "<your-tenant-id>"
- name: azureClientId
value: "<your-client-id>"
- name: azureClientSecret
value: "<your-client-secret>"
Add Google Cloud Secret Manager configuration. For more information, see GCP Secret Manager.
sdr:
config:
components:
secretstore:
type: secretstores.gcp.secretmanager
version: v1
metadata:
- name: type
value: "service_account"
- name: project_id
value: "<project-id>"
- name: private_key_id
value: "<private-key-id>"
- name: private_key
value: "<private-key>"
- name: client_email
value: "<client-email>"
- name: client_id
value: "<client-id>"
- name: auth_uri
value: "https://accounts.google.com/o/oauth2/auth"
- name: token_uri
value: "https://oauth2.googleapis.com/token"
- name: auth_provider_x509_cert_url
value: "https://www.googleapis.com/oauth2/v1/certs"
- name: client_x509_cert_url
value: "https://www.googleapis.com/robot/v1/metadata/x509/<client-email>"
Add HashiCorp Vault configuration. For more information, see HashiCorp Vault.
sdr:
config:
components:
secretstore:
type: secretstores.hashicorp.vault
version: v1
metadata:
- name: vaultAddr
value: "[vault_address]"
- name: vaultToken
value: "[vault_token]"
- name: vaultKVPrefix
value: "dapr"
- name: enginePath
value: "secret"
Private container registry (optional)
If you mirror Atlan app images to your own registry, set containerRegistryBase in values.yaml to rewrite image URLs at deploy time. For example, atlanhq/atlan-oracle-app:1.0 becomes myregistry.io/atlan/atlan-oracle-app:1.0.
sdr:
config:
containerRegistryBase: "myregistry.io/atlan"
Leave this empty (or omit it) if pulling directly from Docker Hub.
Sample values.yaml files
Below are complete, copy-paste-ready values.yaml snippets for common infrastructure combinations. Replace placeholder values with your actual credentials.
- AWS (EKS)
- GCP (GKE)
- Azure (AKS)
image:
repository: atlanhq/atlan-sdr-orchestrator-k8s
tag: "latest" # pre-filled by Atlan—don't change
pullPolicy: Always
sdr:
enabled: true
deploymentName: "mycompany-eks"
credentials:
clientId: "oauth-client-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
clientSecret: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
imagePullSecrets:
- name: atlan-registry-creds
config:
domain: "mycompany.atlan.com"
components:
objectstore:
type: bindings.aws.s3
version: v1
metadata:
- name: bucket
value: "<your-bucket-name>"
- name: region
value: "us-east-1"
- name: forcePathStyle
value: "true"
secretstore:
type: secretstores.aws.secretmanager
version: v1
metadata:
- name: region
value: "us-east-1"
image:
repository: atlanhq/atlan-sdr-orchestrator-k8s
tag: "latest" # pre-filled by Atlan—don't change
pullPolicy: Always
sdr:
enabled: true
deploymentName: "mycompany-gke"
credentials:
clientId: "oauth-client-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
clientSecret: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
imagePullSecrets:
- name: atlan-registry-creds
config:
domain: "mycompany.atlan.com"
components:
objectstore:
type: bindings.gcp.bucket
version: v1
metadata:
- name: bucket
value: "<your-gcs-bucket-name>"
- name: type
value: "service_account"
- name: project_id
value: "<your-gcp-project-id>"
secretstore:
type: secretstores.gcp.secretmanager
version: v1
metadata:
- name: type
value: "service_account"
- name: project_id
value: "<your-gcp-project-id>"
image:
repository: atlanhq/atlan-sdr-orchestrator-k8s
tag: "latest" # pre-filled by Atlan—don't change
pullPolicy: Always
sdr:
enabled: true
deploymentName: "mycompany-aks"
credentials:
clientId: "oauth-client-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
clientSecret: "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
imagePullSecrets:
- name: atlan-registry-creds
config:
domain: "mycompany.atlan.com"
components:
objectstore:
type: bindings.azure.blobstorage
version: v1
metadata:
- name: accountName
value: "<your-storage-account-name>"
- name: accountKey
value: "<your-storage-account-key>"
- name: containerName
value: "<your-container-name>"
secretstore:
type: secretstores.azure.keyvault
version: v1
metadata:
- name: vaultName
value: "<your-keyvault-name>"
- name: azureTenantId
value: "<your-tenant-id>"
- name: azureClientId
value: "<your-client-id>"
- name: azureClientSecret
value: "<your-client-secret>"
Install SDR Orchestrator
Run helm install with the release name atlan-sdr-<deployment_name>. The release name must follow this pattern—it's required for the automatic self-update mechanism.
helm install atlan-sdr-<DEPLOYMENT_NAME> ./chart \
--namespace atlan \
-f values.yaml
Replace <DEPLOYMENT_NAME> with the value you set in sdr.deploymentName. For example:
helm install atlan-sdr-mycompany-eks ./chart \
--namespace atlan \
-f values.yaml
Helm creates all required resources in one command:
| Resource | Name | Purpose |
|---|---|---|
| Deployment | atlan-sdr-<name> | SDR orchestrator pod |
| Secret | atlan-sdr-<name>-credentials | OAuth + deployment credentials |
| ConfigMap | atlan-sdr-<name>-config | Domain, Dapr component specs |
| ServiceAccount | atlan-sdr-<name>-serviceaccount | K8s API identity |
| Role | atlan-sdr-<name>-role | Namespace-scoped permissions |
| RoleBinding | atlan-sdr-<name>-rolebinding | Binds role to service account |
For full details on what each resource does, see SDR Orchestrator on Kubernetes.
Verify installation
-
Check the SDR pod is running:
kubectl get pods -n atlan -l app=atlan-sdrExpected output:
NAME READY STATUS RESTARTS AGE
atlan-sdr-mycompany-eks-xxxxx-xxxxx 1/1 Running 0 2m -
Check logs for "K8s SDR worker listening on task_queue" which confirms Temporal connectivity:
kubectl logs -n atlan -l app=atlan-sdr --tail=50You can see:
[entrypoint] Starting K8s SDR agent...
[entrypoint] deployment_name=mycompany-eks
[entrypoint] Generating SDR Dapr components from config.yaml...
...
K8s SDR worker listening on task_queue=atlan-sdr-mycompany-eks -
Verify in Atlan UI: Go to Settings > Self-Deployed Runtimes. Your deployment appears as "Connected."
-
Install apps: From the Atlan UI, navigate to the Marketplace, select an app, and choose your SDR as the deployment target. The SDR automatically creates the app Deployment with all necessary configurations.
Automatic updates
The SDR Orchestrator manages two types of automatic updates:
-
App updates: When a new app version is published to the marketplace, the reconciler detects the version mismatch and triggers an update via the SDR (checked every 60 minutes). The SDR runs
helm upgrade --installwith the new image tag, and K8s performs a rolling update. -
SDR self-updates: The SDR Orchestrator itself is also a marketplace app. When a new SDR version is published, the same reconciler triggers a self-update. The SDR runs
helm upgrade --reuse-valueswith the new image tag, and K8s rolls the SDR pod to the new version.
No manual intervention is required for either type of update.
Uninstall
To remove the SDR orchestrator and all managed apps:
# List all Helm releases in the atlan namespace
helm list -n atlan
# Uninstall each app first
helm uninstall oracle -n atlan
helm uninstall redshift -n atlan
# ... uninstall other apps
# Uninstall the SDR
helm uninstall atlan-sdr-<DEPLOYMENT_NAME> -n atlan
# Clean up remaining resources
kubectl delete secret atlan-registry-creds -n atlan
kubectl delete namespace atlan
Deleting the namespace removes all resources in it, including any app Deployments managed by the SDR.
Need help
If the SDR pod isn't starting or apps aren't deploying, check the logs:
kubectl logs -n atlan -l app=atlan-sdr --tail=100
Common issues:
- "IP address not allowed": Your cluster's egress IP needs to be allowlisted on the Atlan tenant. Contact your Atlan representative.
- "Authentication token refresh failed": Check OAuth credentials in
values.yaml(sdr.credentials.clientIdandsdr.credentials.clientSecret). - "ImagePullBackOff": Check registry credentials (
atlan-registry-credsSecret). The Docker Hub PAT may need rotation. - Pod stuck in Pending: Check cluster resource availability with
kubectl describe pod -n atlan. - App pod CrashLoopBackOff: Check the app pod logs. Common causes: misconfigured object storage or secret store in
values.yaml.
For additional troubleshooting, see the SDR Orchestrator FAQ.
Next steps
Once the SDR shows as Connected in Atlan UI:
- Navigate to the Marketplace and pick an app (for example, Oracle connector).
- Click Install and select your SDR as the deployment target.
- The SDR handles everything—creating the Deployment, configuring Dapr components, health checking, and reporting success back to Atlan. No terminal commands are needed.
See also
- Install SDR Orchestrator on Docker/Podman: For VM-based installations using Docker or Podman.
- SDR Orchestrator: Components, communication model, and how deployment management works.
- SDR Orchestrator on Kubernetes: RBAC, Helm charts, environment variables, and K8s-specific operational details.
- SDR Orchestrator FAQ: Troubleshooting, monitoring, and common issues.
- Configure network security: Firewall rules for outbound-only communication.