Skip to main content

How to deploy Impact Framework to Kubernetes

The Impact Framework provides a Helm chart for easy deployment on Kubernetes clusters, making it simple to run the API server in containerized environments.

Prerequisites

Before deploying to Kubernetes, ensure you have:

  • A running Kubernetes cluster
  • kubectl configured to access your cluster
  • Helm 3.x installed
  • Appropriate permissions to deploy resources in your namespace

Quick Start

Basic Deployment

The Helm chart is provided in OCI format on GitHub Container Registry. Deploy with default settings:

$ helm install if oci://ghcr.io/green-software-foundation/charts/if

This creates:

  • A Deployment running the IF API server
  • A ClusterIP Service for internal cluster access
  • Optional ConfigMaps for configuration
  • Optional Secrets for authentication

Verify Deployment

Check that the deployment is running:

$ kubectl get pods -l app.kubernetes.io/name=if
$ kubectl get services -l app.kubernetes.io/name=if

Accessing the API Server

By default, a ClusterIP service is deployed for internal cluster communication. To access the API Server from the outside, it must be accessed by one of the following methods

External Access via Port Forward

For development and testing, use port forwarding:

$ kubectl port-forward svc/if 3000:3000 &
$ curl -H "Content-Type: application/yaml" --data-binary @manifest.yaml http://localhost:3000/v1/run

External Access via NodePort

For external access without load balancers, use NodePort:

# values-nodeport.yaml
service:
type: NodePort
nodePort: 32000
$ helm upgrade if oci://ghcr.io/green-software-foundation/charts/if -f values-nodeport.yaml

Access the service at http://<node-ip>:32000

External Access via LoadBalancer

For production external access, use LoadBalancer:

# values-loadbalancer.yaml
service:
type: LoadBalancer
$ helm upgrade if oci://ghcr.io/green-software-foundation/charts/if -f values-loadbalancer.yaml

Get the external IP:

$ kubectl get services if

External Access via Ingress

Expose the service via Ingress:

# values-ingress.yaml
ingress:
enabled: true
className: nginx
annotations:
cert-manager.io/cluster-issuer: letsencrypt-prod
hosts:
- host: if.example.com
paths:
- path: /
pathType: Prefix
tls:
- secretName: if-tls
hosts:
- if.example.com

Refer to the respective Ingress Controller documentation for Ingress configuration.

Plugin Management

Installing External Plugins

Add external plugins that will be installed at pod startup:

# values-plugins.yaml
additionalPlugins:
- carbon-intensity-plugin
- Green-Software-Foundation/if-github-plugin

Installing Private Packages

For private plugins from npm registry, configure authentication:

# values-private-plugins.yaml
additionalPlugins:
- "@myscope/myplugin"

npmrc: |
//registry.npmjs.org/:_authToken=<YOUR_AUTH_TOKEN>
@myscope:registry=https://registry.npmjs.org/

Installing from GitHub Packages

For packages in GitHub Packages, a personal access token (classic) with read:packages permission is required even for public packages:

# values-github-packages.yaml
additionalPlugins:
- Green-Software-Foundation/community-plugins
- danuw/if-casdk-plugin

npmrc: |
//npm.pkg.github.com/:_authToken=<YOUR_PERSONAL_ACCESS_TOKEN>
@Green-Software-Foundation:registry=https://npm.pkg.github.com/

Using Environment Variables for Tokens

Extract tokens to environment variables for better security:

# values-env-auth.yaml
additionalPlugins:
- Green-Software-Foundation/community-plugins

npmrc: |
//npm.pkg.github.com/:_authToken=${GITHUB_TOKEN}
@Green-Software-Foundation:registry=https://npm.pkg.github.com/

env:
secret:
GITHUB_TOKEN: <YOUR_PERSONAL_ACCESS_TOKEN>

Using Custom Container Images

For faster startup, use custom images with pre-installed plugins:

# values-custom-image.yaml
image:
repository: myorg/if-with-plugins
tag: v1.0.0

# Disable plugin installation since they're pre-installed
additionalPlugins: []

For custom image creation, see the How to build custom container images.

Security Configuration

Enabling Disabled Plugins

By default, certain plugins are disabled for security. Enable them if needed:

# values-all-plugins.yaml
disabledPlugins: [] # Enable all builtin plugins

Security Warning: The Shell, CSVImport, and CSVLookup plugins can access the filesystem and execute commands. Only enable in trusted environments.

Other Configurations

Resource Limits

Configure CPU and memory limits for production:

# values-production.yaml
resources:
limits:
cpu: 1000m
memory: 512Mi
requests:
cpu: 100m
memory: 128Mi

Replica Count

Scale the deployment for high availability:

# values-ha.yaml
replicaCount: 3

# Optional: Pod disruption budget
podDisruptionBudget:
enabled: true
minAvailable: 2

Troubleshooting

Pod Startup Issues

If pods fail to start:

  1. If using a custom image, verify the image can be pulled correctly.
  2. Check pod logs for any error messages.

Plugin Installation Failures

If plugin installation fails:

  1. Verify the plugin name is correct.
  2. If installing plugins from Git repositories, ensure you're using a container image with git installed.
  3. If installing private plugins or plugins published to GitHub Packages, verify the npmrc configuration is correct.

API Server Access Issues

If you cannot access the API server:

  1. Verify the service is properly exposed.
  2. Verify the access URL is correct.
  3. Verify the Content-Type is correct.