GridGain Developers Hub

Installing on Kubernetes

You can install GridGain 9 and run a GridGain cluster on Kubernetes cluster. This section describes all the necessary steps, as well as provides the configurations and manifests that you can copy and paste into your environment.

Prerequisites

  • GridGain 9.0.5 or more recent

  • Access to a running Kubernetes cluster

  • kubectl installed and configured to interact with your Kubernetes cluster

  • A namespace exists for GridGain 9 to be deployed.

Installation Steps

Create ConfigMaps

  1. Create the GridGain configuration file and get a license. The minimum node configuration is as follows:

    gridgain-config.conf
    {
      ignite: {
        network: {
          # GridGain 9 node port
          port: 3344,
          nodeFinder: {
            netClusterNodes: [
              # Kubernetes service to access the GridGain 9 cluster on the Kubernetes network
              "gridgain-svc-headless:3344"
            ]
          }
        }
      }
    }
  2. Place your license content in the license.conf file.

  3. Create the ConfigMap object for GridGain configuration:

    kubectl create configmap gridgain-config -n <namespace> --from-file=gridgain-config.conf
  4. Create the ConfigMap object for the GridGain license:

    kubectl create configmap gridgain-license -n <namespace> --from-file=license.conf

    Replace <namespace> with the name of the namespace where you want to deploy GridGain.

Deploy the Service

  1. Prepare the service.yaml for service deployment:

    service.yaml
    apiVersion: v1
    kind: Service
    metadata:
      # The name must be equal to netClusterNodes.
      name: gridgain-svc-headless
      # Place your namespace name here.
      namespace: <namespace>
    spec:
      clusterIP: None
      internalTrafficPolicy: Cluster
      ipFamilies:
      - IPv4
      ipFamilyPolicy: SingleStack
      ports:
      - name: management
        port: 10300
        protocol: TCP
        targetPort: 10300
      - name: rest
        port: 10800
        protocol: TCP
        targetPort: 10800
      - name: cluster
        port: 3344
        protocol: TCP
        targetPort: 3344
      selector:
        # Must be equal to the label set for pods.
        app: gridgain
      # Include not-yet-ready nodes.
      publishNotReadyAddresses: True
      sessionAffinity: None
      type: ClusterIP
  2. Apply the service.yaml file to set up the service:

    kubectl apply -f service.yaml

Deploy the StatefulSet

  1. Prepare the statefulset.yaml file for StatefulSet deployment:

    statefulset.yaml
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      # The cluster name.
      name: gridgain-cluster
      # Place your namespace name.
      namespace: <namespace>
    spec:
      # The initial number of pods to be started by Kubernetes.
      replicas: 2
      # Kubernetes service to access the GridGain 9 cluster on the Kubernetes network.
      serviceName: gridgain-svc-headless
      selector:
        matchLabels:
          app: gridgain
      template:
        metadata:
          labels:
            app: gridgain
        spec:
          terminationGracePeriodSeconds: 60000
          containers:
            # Custom pod name.
          - name: gridgain-node
            # Limits and requests for the GridGain container.
            resources:
              limits:
                cpu: "4"
                memory: 4Gi
              requests:
                cpu: "4"
                memory: 4Gi
            env:
              # Must be specified to ensure that GridGain 9 cluster replicas are visible to each other.
              - name: GRIDGAIN_NODE_NAME
                valueFrom:
                  fieldRef:
                    fieldPath: metadata.name
              # GridGain 9 working directory.
              - name: GRIDGAIN_WORK_DIR
                value: /gg9-work
            # GridGains Docker image and it's version.
            image: gridgain/gridgain9:9.0.5
            ports:
            - containerPort: 10300
            - containerPort: 10800
            - containerPort: 3344
            volumeMounts:
            # The config will be placed at this path in the container.
            - mountPath: /opt/gridgain/etc/gridgain-config.conf
              name: config-vol
              subPath: gridgain-config.conf
            # The license will be placed at this path in the container.
            - mountPath: /opt/gridgain/etc/license.conf
              name: license-vol
              subPath: license.conf
            # GridGain 9 working directory.
            - mountPath: /gg9-work
              name: persistence
          volumes:
          - name: config-vol
            configMap:
              name: gridgain-config
          - name: license-vol
            configMap:
              name: gridgain-license
      volumeClaimTemplates:
      - apiVersion: v1
        kind: PersistentVolumeClaim
        metadata:
          name: persistence
        spec:
          accessModes:
          - ReadWriteOnce
          resources:
            requests:
              storage: 10Gi # Provide enough space for your application data.
          volumeMode: Filesystem
  2. Apply the statefulset.yaml file to deploy the main components of GridGain 9:

    kubectl apply -f statefulset.yaml

Wait for Pods to Start

  1. Monitor the status of the pods:

    kubectl get pods -n <namespace> -w
  2. Ensure that all pods' STATUS is Running before proceeding.

Deploy the Job

  1. Prepare the job.yaml file for deploying the job:

    job.yaml
    apiVersion: batch/v1
    kind: Job
    metadata:
      name: cluster-init
      # Place your namespace name here.
      namespace: <namespace>
    spec:
      template:
        spec:
          containers:
          # Command to init the cluster. URL and host must be the name of the service you created before. Port is 10300 as the management port.
          - args:
            - -ec
            - |
              apt update && apt-get install -y bind9-host
              GG_NODES=$(host -tsrv _cluster._tcp.gridgain-svc-headless | grep 'SRV record' | awk '{print $8}' | awk -F. '{print $1}' | paste -sd ',')
              /opt/gridgain9cli/bin/gridgain9 cluster init --name=gridgain --metastorage-group $GG_NODES --url=http://gridgain-svc-headless:10300 --config-files=/opt/gridgain/etc/license.conf
            command:
            - /bin/sh
            # Specify the Docker image with the GridGain 9 CLI and its version.
            image: gridgain/gridgain9:9.0.5
            imagePullPolicy: IfNotPresent
            name: cluster-init
            resources: {}
            volumeMounts:
            # The license required to be mounted to cluster-init job.
            - mountPath: /opt/gridgain/etc/license.conf
              name: license-vol
              subPath: license.conf
          restartPolicy: Never
          terminationGracePeriodSeconds: 120
          volumes:
          - name: license-vol
            configMap:
              name: gridgain-license
  2. Apply the job.yaml file to complete installation.

    kubectl apply -f job.yaml

Installation Verification

  1. Check the status of all resources in your namespace:

    kubectl get all -n <namespace>
  2. Ensure that all components are running as expected, without errors, and that the initialization job is in the Completed status.

  3. Verify that your cluster is initialized and running.

    kubectl exec -it gridgain-cluster-0 bash -n <namespace>
    /opt/gridgain9cli/bin/gridgain9 cluster status

    The command output must include the name of your cluster and the number of nodes. The status must be ACTIVE.

Installation Troubleshooting

If any issues occur during the installation:

  • Check the logs of specific pods:

    kubectl logs <pod-name> -n <namespace>
  • Review events in the namespace:

    kubectl get events -n <namespace>