Add-on compatibilities
Keep your add-ons compatible with the next Kubernetes version
Ensuring add-on compatibility across different Kubernetes versions can be challenging, as it requires careful planning, thorough testing, and continuous maintenance to address the evolving nature of Kubernetes and its ecosystem. Learn how Plural can assist you in that process.
Compatibility scraping
Plural helps ensure that all known third-party add-ons are compatible with the next Kubernetes version by systematically scraping multiple sources for compatibility information. This includes gathering data from official documentation, GitHub repositories, and other relevant sources. By consolidating this information, we create a comprehensive database of add-on compatibility details.
Checking add-on compatibilities
Add-on compatibility data is then made accessible through the Plural Console, where you can easily check the compatibility status of your add-ons with upcoming Kubernetes versions. This proactive approach helps to avoid potential issues caused by API changes and other version-specific nuances, ensuring a smoother transition to newer Kubernetes releases.


Automating Deployments on Newly Discovered Add-On Versions
Plural's Observer can automatically scrape our compatibility tables and generate PRs or Pipeline Runs whenever a new version is discovered that is compatible with a provided set of Kubernetes versions. It's easiest to look at an example:
apiVersion: deployments.plural.sh/v1alpha1
kind: Observer
metadata:
name: ingress-nginx
spec:
crontab: "*/5 * * * *"
initial: 4.8.0
target:
order: SEMVER
type: ADDON
addon:
name: ingress-nginx
kubernetesVersions:
- "1.28"
- "1.29"
- "1.30"
actions:
- type: PIPELINE
configuration:
pipeline:
pipelineRef:
name: ingress-nginx
namespace: infra
context:
name: ingress-nginx
version: $valueThis will scrape the tables for Ingress NGINX versions that are compatible with all of Kubernetes versions 1.28, 1.29, and 1.30, and create a pipeline context to bounce the pipeline we've defined to deploy it across dev and prod. This makes it very easy to trace an upgrade path across multiple versions with very little manual effort beyond, at most, approving PRs.
Observers are a lot more flexible, and can also call PR automations that trigger your own deployment automation on merge.
Pipeline Setup
If you want to set up the pipeline acted on above, here's a basic example of how it could be done.
First, we want a wrapper service to house the manifests for our cluster SBOM. Put it at bootstrap/sbom.yaml with contents:
apiVersion: deployments.plural.sh/v1alpha1
kind: ServiceDeployment
metadata:
name: sbom
namespace: infra
spec:
git:
folder: services/sbom
ref: main
repositoryRef:
kind: GitRepository
name: infra
namespace: infra
clusterRef:
kind: Cluster
name: mgmt
namespace: infraThen within services/sbom add the following:
services/sbom/ingress-nginx/dev.yaml:
apiVersion: deployments.plural.sh/v1alpha1
kind: GlobalService
metadata:
name: ingress-nginx-dev
namespace: infra
spec:
mgmt: false
tags:
tier: dev
template:
git:
folder: helm
ref: main
helm:
chart: ingress-nginx
url: https://kubernetes.github.io/ingress-nginx
valuesFiles:
- ingress-nginx.yaml.liquid
version: 4.12.0
name: ingress-nginx
namespace: ingress-nginx
repositoryRef:
name: infra
namespace: infraservices/sbom/ingress-nginx/prod.yaml:
apiVersion: deployments.plural.sh/v1alpha1
kind: GlobalService
metadata:
name: ingress-nginx-prod
namespace: infra
spec:
mgmt: false
tags:
tier: prod
template:
git:
folder: helm
ref: main
helm:
chart: ingress-nginx
url: https://kubernetes.github.io/ingress-nginx
valuesFiles:
- ingress-nginx.yaml.liquid
version: 4.12.0
name: ingress-nginx
namespace: ingress-nginx
repositoryRef:
name: infra
namespace: infraservices/sbom/ingress-nginx/pipeline.yaml:
apiVersion: deployments.plural.sh/v1alpha1
kind: Pipeline
metadata:
name: ingress-nginx
spec:
stages:
- name: dev
services:
- serviceRef:
name: sbom # <-- notice this points to the wrapper service above
namespace: infra
criteria:
prAutomationRef:
name: sbom-upgrade-pra
- name: prod
services:
- serviceRef:
name: sbom
namespace: infra
criteria:
prAutomationRef:
name: sbom-upgrade-pra
edges:
- from: dev
to: prod
gates:
- name: approval-gate
type: APPROVALservices/sbom/sbom-upgrade-pra.yaml:
apiVersion: deployments.plural.sh/v1alpha1
kind: PrAutomation
metadata:
name: sbom-upgrade-pra
spec:
documentation: Updates a specific sbom addon to a new chart version
updates:
yamlOverlays:
- file: services/sbom/{{ context.name }}/{{ context.pipeline.stage.name }}.yaml
yaml: |
spec:
template:
helm:
version: "{{ context.version }}"
scmConnectionRef:
name: plural
title: "Update addon {{ context.name }} to chart version {{ context.version }}"
message: "Update addon {{ context.name }} to chart version {{ context.version }}"
identifier: mgmt # <-- can change it to the explicit name of your repo if you wish, or the mgmt identifier will use your management repo
configuration:
- name: name
type: STRING
documentation: the name of the addon
- name: version
type: STRING
documentation: the version of the addonThis setup also provides a flexible way to add other SBOM components (external-dns, cert-manager, etc.) with the same dev/prod pipeline structure.
This workflow will:
- For the dev stage, modify the
services/sbom/ingress-nginx/dev.yamlfile with the new version supplied to the pipeline by the observer and create a pull request to have the change reviewed and merged. - Wait for manual approval in the Plural Console UI
- Progress to the prod stage, issuing a similar PR for
services/sbom/ingress-nginx/prod.yaml.