Prepare your Kubernetes Environment

Review the preparation tasks required before installing Splunk AppDynamics services on your Kubernetes cluster.

This page lists the tasks to prepare your Kubernetes environment so that you can install appd services.

Create Custom Storage Classes

Custom storage classes are controlled from the config/globals.yaml.gotmpl file. Most workloads use storageClass so they can be placed on faster or dedicated storage independently of everything else.

Create a storage class that meets your profile requirements.

Profile Throughput IOPS
Small 125 MiB/s 3000
Medium 250 MiB/s 6000
Large 750 MiB/s 15000
XLarge 1000 MiB/s 25000

(Optional) Create and Manage Custom Namespaces

You can specify custom namespaces that overrides the default namespaces. Use the config/namespaces.yaml.template to create and manage custom namespaces.
Note: You can change the default namespaces only before first installation, it cannot be changed later. Ensure to use the updated namespaces across your Kubernetes cluster.
  1. Copy the contents from namespaces.yaml.template to namespaces.yaml.
  2. Edit namespaces.yaml.
    CODE
    vi namespaces.yaml
    JSON
    # Keep namespaces.yaml across BYOK bundle upgrades (same as secrets.yaml).
    # On each upgrade, compare this template for new keys and add them to your file.
    
    # Applied to every base name below unless the key is listed under namespaceFullOverrides.
    namespacePrefix: ""
    namespaceSuffix: ""
    
    # Namespace for the byok-namespace-config Secret.
    # Default appd-cluster stores the Secret in the resolved appd-cluster namespace
    # (honors namespacePrefix / namespaceSuffix). Set another literal name (e.g. kube-system)
    # only when you need the Secret in a fixed namespace; that namespace is created on sync
    # if missing and does not receive prefix/suffix.
    namespaceConfigSecretNamespace: appd-cluster
    
    # Optional per-key full namespace names (skip prefix/suffix for these keys only).
    namespaceFullOverrides: {}
    # Example:
    #   cisco-controller: legacy-controller
    
    # Base K8s names (prefix/suffix applied unless overridden above).
    namespaceOverrides:
    
      # ── Operators ──────────────────────────────────────────────────────────
      cert-manager:         cert-manager
      elastic-system:       elastic-system
      kafka-operator:       kafka-operator
      mysql-operator:       mysql-operator
      pg-operator:          pg-operator
    
      # ── Infrastructure ─────────────────────────────────────────────────────
      appd-cluster:         appd-cluster
      cisco-coredns:        cisco-coredns
      replicator:           replicator
      nfs-provisioner:      nfs-provisioner
      ingress:              ingress
      ingress-master:       ingress-master
      cisco-edge-proxy:     cisco-edge-proxy
      minio:                minio
    
      # ── Data Layer ─────────────────────────────────────────────────────────
      mysql:                mysql
      postgres:             postgres
      kafka:                kafka
      kafka-external:       kafka-external
      es:                   es
      es-external:          es-external
      schema-registry:      schema-registry
      redis:                redis
    
      # ── Authentication ─────────────────────────────────────────────────────
      authn:                authn
      authz:                authz
    
      # ── AppDynamics Core ───────────────────────────────────────────────────
      cisco-controller:     cisco-controller
      cisco-events:         cisco-events
      cisco-eum:            cisco-eum
      cisco-synthetic:      cisco-synthetic
      cisco-metric:         cisco-metric
      cisco-dis:            cisco-dis
    
      # ── Feature Modules ────────────────────────────────────────────────────
      cisco-aiops:          cisco-aiops
      cisco-secureapp:      cisco-secureapp
      cisco-atd:            cisco-atd
      cisco-uil:            cisco-uil
      cisco-mcp:            cisco-mcp
  3. Change the default namespaces to the desired ones.
    Attention: The custom namespaces can be up to 21 characters.

    Example

    Default Namespaces Updated Namespaces
    CODE
    cisco-aiops:          cisco-aiops
      cisco-secureapp:      cisco-secureapp
      cisco-atd:            cisco-atd
      cisco-uil:            cisco-uil
      cisco-mcp:            cisco-mcp
    CODE
    cisco-aiops:          company-aiops
      cisco-secureapp:      company-secureapp
      cisco-atd:            company-atd
      cisco-uil:            company-uil
      cisco-mcp:            company-mcp

Modify the Global Configuration File

Modify the globals.yaml.gotmpl file as follows:
Note:

Go to the directory where you have extracted the deployment files.

  1. Go to the following directory:
    CODE
    ./byok8s/config
  2. Edit the globals.yaml.gotmpl file.
    CODE
    vi globals.yaml.gotmpl
  3. Verify that the provider parameter is set to openshift.
    This parameter specifies which Kubernetes provider the Virtual Appliance uses for deployment.
  4. In the dnsDomain parameter, specify the external DNS domain for routes.
    Note: To find your external DNS domain, run this command:
    CODE
    oc get ingresses.config/cluster -o jsonpath='{.spec.domain}'

    Example Response:

    CODE
    apps.rosa.mycluster.openshiftapps.com
  5. Add appd. as a prefix to the domain name.
    CODE
    appd.apps.rosa.mycluster.openshiftapps.com
  6. In the global.imageRegistry parameter, specify the container registry URL.
    CODE
    myregistry.example.com:5000
  7. Verify that the default Storage Class is created for the cluster.
    CODE
    use-default
    To configure MySQL and Kafka services, use enhancedStorageClass.
    1. In global.storageClass, set an additional storage class name to MySQL and Kafka to a specific class.
      CODE
      global
      	storageClass:          "use-default"   # everyone else
      When set to "use-default", the storageClass field is omitted entirely, allowing the cluster's default storage class to apply.
    2. In global.enhancedStorageClass, set the enhancedStorageClass setting for Kafka and MySQL services. Enter the suitable storage for performance that matches the selected profile.
      See
      CODE
      global
      	enhancedStorageClass:  "use-default"   # MySQL & Kafka only
      Create Custom Storage Classes.
By default, BYOK installs and manages cert-manager. To use an existing cert-manager installation:
  1. Set certManager.install to false.
    BYOK-deployer does not install cert-manager or create a cert-manager namespace.
  2. Set certManager.clusterResourceNamespace to the value of the cert-manager Controller’s --cluster-resource-namespace flag.
    cert-manager looks for the ClusterIssuer CA secret in this namespace.
    CODE
    certManager:
      install: false
      clusterResourceNamespace: "customer-cert-manager"
  3. If the flag is not set or its value is $(POD_NAMESPACE), specify the namespace where cert-manager is installed.
    Attention: Before installation, BYOK deployer verifies the cert-manager configuration. If clusterResourceNamespace is missing or incorrect, installation stops and displays the correct value. Update config/globals.yaml.gotmpl, and then run the installation again. BYOK-deployer does not deploy any resources before this check passes.
JSON
# Set provider
{{- $provider := "openshift" }}

# Set DNS domain
{{- $dnsDomain := "appd.apps.rosa.mycluster.openshiftapps.com" }}

# Set registry URL
global:
  imageRegistry: "custom-registry-appd-registry.apps.rosa.mycluster.openshiftapps.com"
  storageClass: "use-default"
  enhancedStorageClass: "my-enhanced-storage-class"

Configure CoreDNS

Configure a CoreDNS cluster IP so Splunk AppDynamics services can communicate internally in your Kubernetes cluster.

A CoreDNS configuration is required within the Kubernetes cluster to enable internal communication for appd services without relying on external DNS hostnames. Since the platform CoreDNS cannot be modified directly, a separate CoreDNS instance is deployed in the cisco-coredns namespace.
Note:

Go to the directory where you have extracted the deployment files.

Perform the following steps to configure CoreDNS:

  1. Identify the available cluster IP address that is within the cluster's service CIDR range.
    You can run the ./scripts/find-available-service-ip.sh file. Or, manually find the required IP addresses.

    These are example commands to find the available IP addresses:

    CODE
    # Find an available IP with .53 suffix (ideal for DNS — port 53 convention)
    ./scripts/find-available-service-ip.sh -c 1 -s 53
    
    # Find 5 available IPs (default)
    ./scripts/find-available-service-ip.sh
    
    # Find 3 available IPs
    ./scripts/find-available-service-ip.sh -c 3
    
    # Dry-run: show service CIDR info without scanning
    ./scripts/find-available-service-ip.sh --dry-run

    Command options:

    Option Description Default
    -c, --count <N> Returns the count of available IP addresses. 5
    -s, --suffix <N> Returns the preferred last-octet suffix (1–254). For example, 53 for DNS. none
    --dry-run Displays CIDR info only and skips IP scan. Off
    -h, --help Displays the usage help. -
  2. Edit the globals.yaml.gotmpl file with the following code:
    CODE
    coredns:
      clusterIP: "10.0.0.1"

Place Your License File in the Configuration Folder

Add the license file to the deployment configuration and verify that it is available before installation.

Copy the license file into the configuration folder so that the Helm charts can access it during deployment.
Note:

Go to the directory where you have extracted the deployment files.

  1. Copy the downloaded license file to the ./config folder.
    CODE
    cp /<path-of-your-license-file>/license.lic ./config/license.lic
  2. Verify the license file.
    CODE
    cat ./config/license.lic | head -5

Create and Modify the Secrets File

Create the secrets.yaml file from the template and update the credentials required for deployment.

Use the secrets template to create a secret file and update the necessary credentials.
  1. Use secrets.yaml.template to create a secrets.yaml and update its access permissions.
    CODE
    cd config
    cp secrets.yaml.template secrets.yaml
    chmod 600 secrets.yaml
  2. Update the necessary credentials in the secrets file.
    1. Specify the credentials in the appdController section.
      • rootPassword : Reset the Root password to access Controller administration page. Default value is welcome .
      • adminUsername : Create and specify the administrator username. Default value is admin .
      • adminPassword : Create and specify the password for the admin user. Default value is welcome .
      • monitoringAgentUsername and monitoringAgentPassword: Use these credentials to authenticate Virtual Appliance with Controller APIs for:
        • creating and reconciling health rules.
        • updating associated policies.
        • performing Controller-related self-monitoring operations.
      YAML
      appdController:
      	rootUsername: root
      	rootPassword: welcome
      	rootAccountname: system
      	adminUsername: admin
      	adminPassword: welcome
      	monitoringAgentUsername: admin
      	monitoringAgentPassword: welcome
    2. Specify your MySQL credentials.
      YAML
      mysql:
      	secret:
      		rootUser: root
      		rootPassword: <Password>
      		rootHost: '%'
      		eumDb: eum_db
      		eumDbUser: eum_user
      		eumDbPassword: <Password>
    3. Specify your PostgreSQL credentials.
      CODE
      postgres:
        users:
          postgres:
            password: <postgres-password>
          pgtest:
            password: <pgtest-password>
    4. Specify the keystore password of Elasticsearch.
      CODE
      elasticsearch:
        secret:
          keystorePassword: <password>
    5. Specify the Events Service secrets.
      CODE
      events:
        secret: <<get this value>>
    6. Specify the user password of the Kafka Controller
      CODE
      kafka:
        controllerUser:
          password: <password>
    7. Verify that the TLS keystore password is changeit.
      Note: Do not change the TLS keystore password.
      YAML
      tls:
      	keyStorePassword: changeit