Deploying a Groundplex in Kubernetes with Elastic Scaling

In this Article


You can deploy Groundplex nodes in a Kubernetes environment and enable elastic scaling of resources for Groundplex nodes by completing the steps in this tutorial. 

HPA Concepts

Kubernetes (K8s) is a container-orchestration system for automating computer application deployment, scaling, and management. In Kubernetes, the containers that share storage and network resources are called Pods. Groundplex node resources are represented by Pods in the SnapLogic implementation of elastic scaling, which leverages the Horizontal Pod Autoscaler (HPA), a Kubernetes API resource, that automatically scales the number of Pods in a deployment based on the observed CPU/Memory utilization. The number of Pods made available in a cluster depends on the load on the server farm. Other types of metrics require a monitoring application like Prometheus Adapter software.

Setup Workflow

Step 1: Setting up the Snaplex in the UI

  1. If you have not created a Snaplex already, navigate to Manager > shared and create a Snaplex.
    Make sure to select Groundplex as the Snaplex type.

  2. In Manager, click the target Snaplex to display the dialog window.

  3. Click the Nodes tab, and add the following entries to the Global Properties:


    The following screenshot shows the added setting:

  4. Click Update. If you are creating the Snaplex, click Create.

You can now set up the Metrics Server software.

Step 2: Setting up the Resource Metric Collection

  1. Install the Metrics Server software into your Kubernetes system using this AWS user guide.

  2. Verify the installation by running the following command on your console:

$ kubectl get deployment metrics-server -n kube-system

Output for a successful installation:

metrics-server 1/1 1 1 6d20h

Step 3: Installing and Setting Up the Prometheus Software and Adapter

You must install and set up the Prometheus software and adapter to track custom metrics. SnapLogic uses the kube-prometheus-stack package from the following sources:

Installing the Prometheus Software

  1. Create the custom_values.yaml file.
    1. The following example shows custom_values.yaml chart.

          type: LoadBalancer
          port: 80
          # AWS EKS specific setting
          # Expose additional targets which can be discovered by Prometheus
            - job_name: 'snaplogic-snaplex-hpa-jcc-autoscale-metrics'
              scrape_interval: 15s
              metrics_path: '/autoscale_metrics' # default is metrics
                - role: pod
                      - default
                      # If you install the Snaplex in your own namespace, you have to provide here.
                      # - snaplogic 
              scheme: https
                insecure_skip_verify: true
              - source_labels: [__meta_kubernetes_namespace]
                action: replace
                target_label: namespace
              - source_labels: [__meta_kubernetes_pod_name]
                action: replace
                target_label: pod
              - source_labels: [__address__]
                action: replace
                regex: ([^:]+)(?::\d+)?
                replacement: ${1}:8081
                target_label: __address__
              - source_labels: [__meta_kubernetes_pod_label_app_kubernetes_io_type]
                action: keep
                regex: jcc # Name for the Pod to match
        # set 'enabled: true' if you want to enable the Grafana dashboard
        enabled: false
          type: LoadBalancer
          port: 80
          # AWS EKS specific setting
        enabled: false

      You can enable the Grafana dashboard in the chart.

    2. Create your own namespace by adding the namespace entry into the following field.  
      In the custom_values.yaml Helm chart, the namespace is snaplogic; however, it is commented out in the chart. To use SnapLogic as your namespace, uncomment those lines:

      # If you install the Snaplex in your own namespace, you have to provide here.
      # - snaplogic

  2. Install Prometheus software by deploying the following Helm chart.

    # create namespace
    kubectl create namespace $NAME_SPACE
    # install Prometheus 
    helm repo add prometheus-community
    helm install $PROM_RELEASE_NAME prometheus-community/kube-prometheus-stack --version $PROMETHEUS_VERSION --namespace $NAME_SPACE -f custom_values.yaml
  3. Verify that the Prometheus and Grafana services by running the following command.
    $ kubectl get all -n monitoring

    NAME                                                         READY   STATUS    RESTARTS   AGE
    pod/alertmanager-prometheus-kube-prometheus-alertmanager-0   2/2     Running   0          19m
    pod/prometheus-grafana-6f5448f95b-68zdt                      2/2     Running   0          19m
    pod/prometheus-kube-prometheus-operator-8556f58759-tlxb8     1/1     Running   0          19m
    pod/prometheus-kube-state-metrics-6bfcd6f648-ckzf6           1/1     Running   0          19m
    pod/prometheus-prometheus-kube-prometheus-prometheus-0       2/2     Running   1          19m
    pod/prometheus-prometheus-node-exporter-fgc5x                1/1     Running   0          19m
    pod/prometheus-prometheus-node-exporter-r7dgf                1/1     Running   0          19m
    pod/prometheus-prometheus-node-exporter-rd8pz                1/1     Running   0          19m
    NAME                                              TYPE           CLUSTER-IP       EXTERNAL-IP                                                                        PORT(S)                      AGE
    service/alertmanager-operated                     ClusterIP      None             <none>                                                                             9093/TCP,9094/TCP,9094/UDP   19m
    service/prometheus-grafana                        LoadBalancer   80:30324/TCP                 19m
    service/prometheus-kube-prometheus-operator       ClusterIP   <none>                                                                             443/TCP                      19m
    service/prometheus-kube-prometheus-prometheus     LoadBalancer   80:31644/TCP                 19m
    service/prometheus-kube-state-metrics             ClusterIP    <none>                                                                             8080/TCP                     19m
    service/prometheus-operated                       ClusterIP      None             <none>                                                                             9090/TCP                     19m
    service/prometheus-prometheus-node-exporter       ClusterIP   <none>                                                                             9100/TCP                     19m
    NAME                                                 DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
    daemonset.apps/prometheus-prometheus-node-exporter   3         3         3       3            3           <none>          19m
    NAME                                                  READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/prometheus-grafana                    1/1     1            1           19m
    deployment.apps/prometheus-kube-prometheus-operator   1/1     1            1           19m
    deployment.apps/prometheus-kube-state-metrics         1/1     1            1           19m
    NAME                                                             DESIRED   CURRENT   READY   AGE
    replicaset.apps/prometheus-grafana-6f5448f95b                    1         1         1       19m
    replicaset.apps/prometheus-kube-prometheus-operator-8556f58759   1         1         1       19m
    replicaset.apps/prometheus-kube-state-metrics-6bfcd6f648         1         1         1       19m
    NAME                                                                    READY   AGE
    statefulset.apps/alertmanager-prometheus-kube-prometheus-alertmanager   1/1     19m
    statefulset.apps/prometheus-prometheus-kube-prometheus-prometheus       1/1     19m
  4. Access the Prometheus and Grafana UIs with the respective IP addresses under the EXTERNAL-IP column.

Installing the Prometheus Adapter

  1. Obtain the Prometheus Adapter:
    1. Install the Prometheus adapter the following command:

      # install Prometheus Adapter
      helm install $ADAPTER_RELEASE_NAME prometheus-community/prometheus-adapter --version $ADAPTER_VERSION --namespace $NAME_SPACE -f adapter_custom_values.yaml

      You have to create the adapter_custom_values.yaml file and apply it during Helm Chart installation.

    2. Create the adapter_custom_values.yaml file and apply it during the Helm Chart installation:

        # Run `kubectl get svc -n namespace` to get the url of Prometheus
        url: http://prometheus-kube-prometheus-prometheus.monitoring.svc
        # Prometheus's port. Currently it is LoadBalancer with 80 default.
        port: 80
      replicas: 1
        # Whether to enable the default rules
        default: false
        # Add custom metrics API here
        # plex_queue_size API
        - seriesQuery: 'plex_queue_size'
              namespace: {resource: "namespace"}
              pod: {resource: "pod"}
            matches: ^(.*)
            as: "plex_queue_size"
          metricsQuery: <<.Series>>{<<.LabelMatchers>>}
  2. Verify the Prometheus Adapter installation by running the following command:

    $ kubectl get --raw /apis/ | jq .
      "kind": "APIResourceList",
      "apiVersion": "v1",
      "groupVersion": "",
      "resources": [
          "name": "pods/plex_queue_size",
          "singularName": "",
          "namespaced": true,
          "kind": "MetricValueList",
          "verbs": [
          "name": "namespaces/plex_queue_size",
          "singularName": "",
          "namespaced": false,
          "kind": "MetricValueList",
          "verbs": [

Integrating Grafana Analytics with Elastic Scaling

  1. Import the following SnapLogic template to your Grafana analytics from the following source:

    The page describes multiple methods for importing the template.
  2. In the custom_values.yaml chart, set the Enabled field to true.

  3. Access the Grafana UI through the IP addresses under the EXTERNAL-IP column from Step 2 of Installing the Prometheus Application.

    You can also use the kubectl top command to monitor the CPU and Memory for the pods.

Step 4: Installing the Snaplex Helm Chart

  1. Enter the following values into your Helm Chart:
    1. CPU and memory requests for the nodes.

    2. HPA (Horizontal Pod Autoscaler) enabled flag. 

    3. minReplicas. The lower limit for the number of replicas to which the autoscaler can scale down. The value defaults to 1 pod and cannot be set to 0.

    4. maxReplicas. The upper limit for the number of pods that can be set by the autoscaler. This value cannot be smaller than the value set for the MinReplicas.

    5. targetPlexQueueSize. The target value for the average count of Snaplex queued Pipelines.
      • Example:  targetPlexQueueSize: 5
        Where 5 is the number of queued Pipelines.
      • Leave this field empty to disable this metric.

    6. targetAvgCPUUtilization. The target utilization for average CPU utilization.
      • Example.  targetAvgCPUUtilization: 50
        Where 50 is 50%
      • Leave this field empty to disable the metric.

    7. targetAvgMemoryUtilization. The target utilization for  average memory utilization.
      • Example:  targetAvgMemoryUtilization: 50
        Where 50 is 50%
      • Leave this field empty to disable the metric.
    8. scaleUpStabilizationWindowSeconds. The window of time during scale up
      If you leave this field empty, the default value is 0.

    9. scaleDownStabilizationWindowSeconds. The window of time  scale down.
      If you leave this field empty, the default value is 300.

    10. terminationGracePeriodSeconds. The grace period in seconds after the Snaplex node termination signal and before a forced shutdown.
      If you leave this field empty, the default value is 30 seconds.

  2. Install the Helm Chart by running the following command.
    $ helm install -n snaplogic <helm_chart_folder>

  3. Verify the Helm Chart installation by running the following command.

    $ kubectl get all -n snaplogic
    NAME                                                                 READY   STATUS    RESTARTS   AGE
    pod/<helm_chart_name>-snaplogic-snaplex-feedmaster-84ff4f48c-7rtpd   1/1     Running   0          12s
    pod/<helm_chart_name>-snaplogic-snaplex-jcc-66ddddcb76-ttdwz         1/1     Running   0          12s
    NAME                                                  TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    service/<helm_chart_name>-snaplogic-snaplex-feed      NodePort    <none>        8084:30456/TCP   13s
    service/<helm_chart_name>-snaplogic-snaplex-regular   NodePort   <none>        8081:30182/TCP   13s
    NAME                                                             READY   UP-TO-DATE   AVAILABLE   AGE
    deployment.apps/<helm_chart_name>-snaplogic-snaplex-feedmaster   1/1     1            1           13s
    deployment.apps/<helm_chart_name>-snaplogic-snaplex-jcc          1/1     1            1           13s
    NAME                                                                       DESIRED   CURRENT   READY   AGE
    replicaset.apps/<helm_chart_name>-snaplogic-snaplex-feedmaster-84ff4f48c   1         1         1       13s
    replicaset.apps/<helm_chart_name>-snaplogic-snaplex-jcc-66ddddcb76         1         1         1       13s
    NAME                                                                          REFERENCE                                            TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
    horizontalpodautoscaler.autoscaling/<helm_chart_name>-snaplogic-snaplex-hpa   Deployment/<helm_chart_name>-snaplogic-snaplex-jcc   10%/50%   1         5         0          13s

You can now monitor the scale up and scale down of your Groundplex node resources in Kubernetes. View an example of a completed Helm Chart in the next section.

Sample Helm Chart Version 2 Configuration Values 

The following Helm Chart shows example configuration values for Elastic Scaling of Snaplex instances. Download a sample template

# Default values for snaplogic-snaplex.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.

# Regular nodes count
jccCount: 1

# Feedmaster nodes count
feedmasterCount: 1

# Docker image of SnapLogic snaplex
  repository: snaplogic/snaplex
  tag: latest

# SnapLogic configuration link

# SnapLogic Org admin credential
#snaplogic_secret: secret

# Enhanced encryption secret
#enhanced_encrypt_secret: secret

# CPU and memory limits/requests for the nodes
  memory: 8Gi
  cpu: 2000m
  memory: 8Gi
  cpu: 2000m

  enabled: true

  maxReplicas: 4

  # Average count of Snaplex queued pipelines (e.g. targetPlexQueueSize: 5), leave empty to disable
  # To enable this metric, Prometheus and Prometheus-Adapter are required to install.
  targetPlexQueueSize: 2

  # Average CPU utilization (e.g. targetAvgCPUUtilization: 50 means 50%), leave empty to disable.
  # To enable this metric, Kubernetes Metrics Server is required to install.
  targetAvgCPUUtilization: 80

  # Average memory utilization (e.g. targetAvgMemoryUtilization: 50 means 50%), leave empty to disable.
  # To enable this metric, Kubernetes Metrics Server is required to install.
  targetAvgMemoryUtilization: 70

  # window to consider waiting while scaling up. default is 0s if empty.
  scaleUpStabilizationWindowSeconds: 0
  # window to consider waiting while scaling down. default is 300s if empty.
  scaleDownStabilizationWindowSeconds: 300

  # grace period seconds after JCC termination signal before force shutdown, default is 30s if empty.
  terminationGracePeriodSeconds: 900

To understand the monitoring workflow for elastic scaling, see Monitoring your Snaplexes in a Kubernetes Environment.