Skip to main content

Configure Agent Secrets for EKS Cluster

The ai-platform-engineering helm chart supports two approaches for managing agent secrets:

Manual Secret Creation

Step 1: Copy Secret Examples

Copy the secret example files from the secrets-examples directory to data directory, removing the .example extension:

# Copy all example files without the .example extension
for file in ai-platform-engineering/deploy/secrets-examples/*.yaml.example; do
cp "$file" "ai-platform-engineering/deploy/data/$(basename "$file" .example)"
done

Step 2: Configure Your Secrets

Edit the secret files in the data directory and fill in the plain text values for the secrets you want to use e.g.

# Edit global secrets for LLM provider configuration
vim ai-platform-engineering/deploy/data/llm-secret.yaml

# Example: Edit GitHub token
vim ai-platform-engineering/deploy/data/github-secret.yaml
# ... edit other secret files as needed

Note: The llm-secret is required and shared by all agents. Configure additional secrets only for the agents you want to deploy.

Step 3: Apply the Secrets

Before applying the secrets, ensure the namespace exists:

kubectl create namespace ai-platform-engineering

Create the secret resources on your cluster:

# Apply all configured secrets
kubectl apply -f ai-platform-engineering/deploy/data/

# Or apply individual secrets as needed:
kubectl apply -f ai-platform-engineering/deploy/data/llm-secret.yaml
kubectl apply -f ai-platform-engineering/deploy/data/github-secret.yaml
# ... apply other secrets as needed

Step 4: Verify Secrets

Verify that your secrets were created successfully:

# List all secrets in the namespace
kubectl get secrets -n ai-platform-engineering

# Check a specific secret
kubectl describe secret llm-secret -n ai-platform-engineering

External Secrets Management

For production environments, it's recommended to use external secret management solutions instead of storing secrets directly in Kubernetes. The ai-platform-engineering helm chart integrates with the External Secrets Operator to sync secrets from external providers like:

  • HashiCorp Vault
  • AWS Secrets Manager
  • Azure Key Vault
  • Google Secret Manager

Prerequisites

  1. Install External Secrets Operator in your cluster:

    helm repo add external-secrets https://charts.external-secrets.io
    helm install external-secrets external-secrets/external-secrets -n external-secrets-system --create-namespace
  2. Configure a SecretStore or ClusterSecretStore that connects to your secret backend (e.g., Vault, AWS Secrets Manager). Refer to the External Secrets Operator documentation for provider-specific setup.

Global Configuration

Enable external secrets globally in your values.yaml:

global:
externalSecrets:
enabled: true
secretStoreRef: # this is the secret store used for all sub-agent secrets
name: "vault-store" # Name of your SecretStore or ClusterSecretStore
kind: ClusterSecretStore # Or SecretStore for namespace-scoped

agentSecrets:
create: true # enable sub-agent secrets creation globally using external secrets

Configuring LLM Secrets with External Secrets

The LLM secret is required by all agents and should be configured globally:

global:                          # Put this under the same global section as above
llmSecrets:
create: false # Only create LLM secret in the parent chart and use the same secret in subcharts
secretName: "llm-secret"
externalSecrets:
secretStoreRef:
name: "vault-store" # this is the secret store used for the LLM secret
kind: ClusterSecretStore # Or SecretStore for namespace-scoped
data:
- secretKey: LLM_PROVIDER
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: projects/your-project/llm-provider
property: LLM_PROVIDER

# Azure OpenAI configuration
- secretKey: AZURE_OPENAI_API_KEY
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AZURE_OPENAI_API_KEY
- secretKey: AZURE_OPENAI_ENDPOINT
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AZURE_OPENAI_ENDPOINT
- secretKey: AZURE_OPENAI_API_VERSION
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AZURE_OPENAI_API_VERSION
- secretKey: OPENAI_API_VERSION
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AZURE_OPENAI_API_VERSION
- secretKey: AZURE_OPENAI_DEPLOYMENT
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AZURE_OPENAI_DEPLOYMENT
# OpenAI configuration
- secretKey: OPENAI_API_KEY
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: OPENAI_API_KEY
- secretKey: OPENAI_ENDPOINT
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: OPENAI_ENDPOINT
- secretKey: OPENAI_MODEL_NAME
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: OPENAI_MODEL_NAME
# AWS Bedrock configuration
- secretKey: AWS_ACCESS_KEY_ID
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AWS_ACCESS_KEY_ID
- secretKey: AWS_SECRET_ACCESS_KEY
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AWS_SECRET_ACCESS_KEY
- secretKey: AWS_REGION
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AWS_REGION
- secretKey: AWS_BEDROCK_MODEL_ID
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AWS_BEDROCK_MODEL_ID
- secretKey: AWS_BEDROCK_PROVIDER
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: secret/ai-platform-engineering/global
property: AWS_BEDROCK_PROVIDER

NOTE: You can delete the keys of the providers you don't need. Supported LLM_PROVIDER values are: azure-openai, openai, aws-bedrock.

External Secret Configuration Fields

  • secretKey: The key name in the Kubernetes secret
  • remoteRef.key: Path to the secret in your external secret store
  • remoteRef.property: Specific property/field within the secret
  • conversionStrategy: How to convert the secret value (Default, Unicode, Base64, etc.)
  • decodingStrategy: How to decode the secret value (None, Base64, Auto, etc.)

Configuring Agent-Specific Secrets

Now configure external secrets for individual agents:

Example: ArgoCD Agent

agent-argocd:
agentSecrets:
secretName: "agent-argocd-secret"
externalSecrets:
data:
- secretKey: ARGOCD_TOKEN
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: projects/your-project/argocd
property: ARGOCD_TOKEN

- secretKey: ARGOCD_API_URL
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: projects/your-project/argocd
property: ARGOCD_API_URL

- secretKey: ARGOCD_VERIFY_SSL
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: projects/your-project/argocd
property: ARGOCD_VERIFY_SSL

Example: GitHub Agent

agent-github:
agentSecrets:
secretName: "agent-github-secret"
externalSecrets:
data:
- secretKey: GITHUB_PERSONAL_ACCESS_TOKEN
remoteRef:
conversionStrategy: Default
decodingStrategy: None
key: projects/your-project/github
property: GITHUB_PERSONAL_ACCESS_TOKEN

You can find the required secret keys for each agent in the repo's .env.example file.

Organizing Secrets in Your Secret Store

It's recommended to organize your secrets hierarchically in your external secret store:

projects/
└── your-project/
├── llm-provider # LLM configuration
├── azure-openai # Azure OpenAI credentials
├── argocd # ArgoCD credentials
├── github # GitHub credentials
├── slack # Slack credentials
├── aws # AWS credentials
├── atlassian # Shared for Jira & Confluence
├── pagerduty # PagerDuty credentials
└── ... # Other agent credentials

Troubleshooting

If secrets are not syncing properly:

  1. Check ExternalSecret status:

    kubectl get externalsecret -n ai-platform-engineering
  2. Check ExternalSecret events:

    kubectl describe externalsecret <secret-name> -n ai-platform-engineering
  3. Verify SecretStore connectivity:

    kubectl get secretstore -n ai-platform-engineering
    kubectl get clustersecretstore
  4. Check External Secrets Operator logs:

    kubectl logs -n external-secrets-system -l app.kubernetes.io/name=external-secrets