Compare commits

...

28 Commits

Author SHA1 Message Date
Armel Soro c1b06c96dd
feat: Support autoscaling via HPA (#268)
* feat: expose autoscaling configuration using the HPA resource

Signed-off-by: Armel Soro <asoro@redhat.com>

* Set the Deployment replicas only if autoscaling is not enabled

When autoscaling is enabled, the HPA controller controls the number of replicas [1]

[1] https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/\#migrating-deployments-and-statefulsets-to-horizontal-autoscaling

Signed-off-by: Armel Soro <asoro@redhat.com>

* Add CI values file with autoscaling enabled

Signed-off-by: Armel Soro <asoro@redhat.com>

* Bump chart version

This is a backward-compatible change

Signed-off-by: Armel Soro <asoro@redhat.com>

* Update values schema

Signed-off-by: Armel Soro <asoro@redhat.com>

* Update README

Signed-off-by: Armel Soro <asoro@redhat.com>

---------

Signed-off-by: Armel Soro <asoro@redhat.com>
2025-07-09 21:16:13 +01:00
dependabot[bot] 3b72b98b16
chore(deps): bump sigstore/cosign-installer from 3.8.2 to 3.9.1 (#267)
* chore(deps): bump sigstore/cosign-installer from 3.8.2 to 3.9.1

Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.8.2 to 3.9.1.
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](3454372f43...398d4b0eee)

---
updated-dependencies:
- dependency-name: sigstore/cosign-installer
  dependency-version: 3.9.1
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix: schema references

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

* bumps chart version to 2.5.3

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>
2025-06-23 17:54:27 +01:00
dependabot[bot] 45ba9bd1de
chore(deps): bump actions/setup-go from 5.4.0 to 5.5.0 (#265) 2025-05-24 06:18:15 +01:00
dependabot[bot] a8c862044a
chore(deps): bump actions/setup-python from 5.5.0 to 5.6.0 (#263)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.5.0 to 5.6.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](8d9ed9ac5c...a26af69be9)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-version: 5.6.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-10 15:05:28 +01:00
dependabot[bot] 6dcd9bb905
chore(deps): bump sigstore/cosign-installer from 3.8.1 to 3.8.2 (#262)
Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.8.1 to 3.8.2.
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](d7d6bc7722...3454372f43)

---
updated-dependencies:
- dependency-name: sigstore/cosign-installer
  dependency-version: 3.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-10 15:05:06 +01:00
dependabot[bot] dd66752014
chore(deps): bump oras-project/setup-oras from 1.2.2 to 1.2.3 (#264)
* chore(deps): bump oras-project/setup-oras from 1.2.2 to 1.2.3

Bumps [oras-project/setup-oras](https://github.com/oras-project/setup-oras) from 1.2.2 to 1.2.3.
- [Release notes](https://github.com/oras-project/setup-oras/releases)
- [Commits](5c0b487ce3...8d34698a59)

---
updated-dependencies:
- dependency-name: oras-project/setup-oras
  dependency-version: 1.2.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* adds schema

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

* bumps chart

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>
2025-05-10 15:00:20 +01:00
Chris Burns ebba2e3094
feat: adds codespell action to ensure correct spelling (#259)
* feat: adds codespell action to ensure correct spelling

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

* bumps chart version

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

* merge conflicts

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

* adds codespell action

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

* bumps chart

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

---------

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>
Signed-off-by: Chris Burns <29541485+ChrisJBurns@users.noreply.github.com>
2025-04-14 15:56:44 +02:00
Ilan Zerath 63ec4eb19e
feat: Add PDB (#248)
Signed-off-by: Ilan Zerath <contact@fuegobyp.business>
Co-authored-by: Ilan Zerath <contact@fuegobyp.business>
2025-04-10 17:18:00 +01:00
dependabot[bot] da59cbc874
chore(deps): bump actions/setup-python from 5.4.0 to 5.5.0 (#260)
Bumps [actions/setup-python](https://github.com/actions/setup-python) from 5.4.0 to 5.5.0.
- [Release notes](https://github.com/actions/setup-python/releases)
- [Commits](42375524e2...8d9ed9ac5c)

---
updated-dependencies:
- dependency-name: actions/setup-python
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-31 18:12:30 +01:00
Chris Burns cb7f0d4955
fix: serviceMonitor port is a string not integer (#258) 2025-03-31 01:08:44 +01:00
dependabot[bot] 9bbdaf000b
chore(deps): bump actions/setup-go from 5.3.0 to 5.4.0 (#257)
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5.3.0 to 5.4.0.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](f111f3307d...0aaccfd150)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-29 14:05:48 +00:00
dependabot[bot] c06522e9c5
chore(deps): bump docker/login-action from 3.3.0 to 3.4.0 (#256)
Bumps [docker/login-action](https://github.com/docker/login-action) from 3.3.0 to 3.4.0.
- [Release notes](https://github.com/docker/login-action/releases)
- [Commits](9780b0c442...74a5d14239)

---
updated-dependencies:
- dependency-name: docker/login-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-03-17 17:44:46 +00:00
dependabot[bot] c34f95a3ec
chore(deps): bump azure/setup-helm from 4.2.0 to 4.3.0 (#253) 2025-02-26 11:46:04 +00:00
dependabot[bot] 56dcd7b10c
chore(deps): bump sigstore/cosign-installer from 3.8.0 to 3.8.1 (#254) 2025-02-24 17:57:03 +00:00
Armel Soro 2df03a970e
feat: Allow configuring the Service IP Family policy to make it dual-stack (#252)
* feat: Allow configuring the Service IP Family policy to make it dual-stack

Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services
Signed-off-by: Armel Soro <asoro@redhat.com>

* Bump the Chart version

Signed-off-by: Armel Soro <asoro@redhat.com>

* Update values schema

Signed-off-by: Armel Soro <asoro@redhat.com>

* Add test values file for CI

Signed-off-by: Armel Soro <asoro@redhat.com>

* Run pre-commit hooks

Signed-off-by: Armel Soro <asoro@redhat.com>

---------

Signed-off-by: Armel Soro <asoro@redhat.com>
2025-02-23 14:35:03 +00:00
dependabot[bot] 174eb0ea08
chore(deps): bump sigstore/cosign-installer from 3.7.0 to 3.8.0 (#251)
Bumps [sigstore/cosign-installer](https://github.com/sigstore/cosign-installer) from 3.7.0 to 3.8.0.
- [Release notes](https://github.com/sigstore/cosign-installer/releases)
- [Commits](dc72c7d5c4...c56c2d3e59)

---
updated-dependencies:
- dependency-name: sigstore/cosign-installer
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-02-10 18:37:38 +00:00
Vincenzo Scamporlino 672bf55dd3
Bump python version (#249)
* Bump python version

Apparently 3.7 isn't available anymore in the running image which is causing some CI issues

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

* Update test.yml

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

* Update test.yml

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>

* fix: updates json schemas

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

* chore: bump bugfix chart version

Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>

---------

Signed-off-by: Vincenzo Scamporlino <vincenzos@spotify.com>
Signed-off-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>
Co-authored-by: ChrisJBurns <29541485+ChrisJBurns@users.noreply.github.com>
2025-02-08 20:34:58 +00:00
dependabot[bot] 165d184f37
chore(deps): bump actions/setup-python from 5.3.0 to 5.4.0 (#247) 2025-02-04 09:59:03 +00:00
dependabot[bot] 593e6d312e
chore(deps): bump actions/stale from 9.0.0 to 9.1.0 (#246) 2025-02-03 06:47:02 +00:00
dependabot[bot] 65f39ba05c
chore(deps): bump oras-project/setup-oras from 1.2.1 to 1.2.2 (#245) 2025-02-02 00:12:33 +00:00
dependabot[bot] cb8ddd1c15
chore(deps): bump actions/setup-go from 5.2.0 to 5.3.0 (#244) 2025-02-01 13:26:08 +00:00
dependabot[bot] 14b574f9b8
chore(deps): bump helm/chart-releaser-action from 1.6.0 to 1.7.0 (#243)
Bumps [helm/chart-releaser-action](https://github.com/helm/chart-releaser-action) from 1.6.0 to 1.7.0.
- [Release notes](https://github.com/helm/chart-releaser-action/releases)
- [Commits](a917fd15b2...cae68fefc6)

---
updated-dependencies:
- dependency-name: helm/chart-releaser-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-20 15:19:10 +00:00
dependabot[bot] 805abd937f
chore(deps): bump helm/chart-testing-action from 2.6.1 to 2.7.0 (#242)
Bumps [helm/chart-testing-action](https://github.com/helm/chart-testing-action) from 2.6.1 to 2.7.0.
- [Release notes](https://github.com/helm/chart-testing-action/releases)
- [Commits](e6669bcd63...0d28d3144d)

---
updated-dependencies:
- dependency-name: helm/chart-testing-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-01-20 15:18:41 +00:00
dependabot[bot] 1a215fc9dc
chore(deps): bump helm/kind-action from 1.11.0 to 1.12.0 (#240)
Bumps [helm/kind-action](https://github.com/helm/kind-action) from 1.11.0 to 1.12.0.
- [Release notes](https://github.com/helm/kind-action/releases)
- [Commits](ae94020eaf...a1b0e39133)

---
updated-dependencies:
- dependency-name: helm/kind-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-28 15:25:48 +00:00
dependabot[bot] f035007788
chore(deps): bump helm/kind-action from 1.10.0 to 1.11.0 (#238)
Bumps [helm/kind-action](https://github.com/helm/kind-action) from 1.10.0 to 1.11.0.
- [Release notes](https://github.com/helm/kind-action/releases)
- [Commits](0025e74a8c...ae94020eaf)

---
updated-dependencies:
- dependency-name: helm/kind-action
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-17 22:30:09 +01:00
dependabot[bot] 0972ad802e
chore(deps): bump actions/setup-go from 5.1.0 to 5.2.0 (#239)
Bumps [actions/setup-go](https://github.com/actions/setup-go) from 5.1.0 to 5.2.0.
- [Release notes](https://github.com/actions/setup-go/releases)
- [Commits](41dfa10bad...3041bf56c9)

---
updated-dependencies:
- dependency-name: actions/setup-go
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-12-17 22:29:45 +01:00
RedlineTriad df1d5e8e63
feat: allow extra ports to be added to the backend service (#237)
This is useful when prometheus metrics are exposed on a different port.
This resolves #236.

Signed-off-by: RedlineTriad <39059512+RedlineTriad@users.noreply.github.com>
2024-12-10 17:24:34 +01:00
Corey Daley 51294434ea
fix: Updates to jsonschema dereference script (#235)
- Fix linting errors when opening files without selecting an encoding
 - Search for values.schema.tmpl.json instead of Chart.lock files
 - Rename 'schema' variables to prevent shadowing or redefining
 - Add Module docstring
 - Add comments explaining what is being done
 - Rename file to follow Python module naming convention of snake_case
 - Rename some variables to correctly represent what they are doing, schema_template instead of chart, etc.
 - Update pre-commit to point to new jsonschema_dereference script name

Signed-off-by: Corey Daley <cdaley@redhat.com>
2024-11-25 16:14:42 +00:00
24 changed files with 519 additions and 108 deletions

2
.codespellrc Normal file
View File

@ -0,0 +1,2 @@
[codespell]
ignore-words-list = NotIn,notin

View File

@ -14,7 +14,7 @@ jobs:
pull-requests: write # for actions/stale to close stale PRs
runs-on: ubuntu-latest
steps:
- uses: actions/stale@28ca1036281a5e5922ead5184a1bbf96e5fc984e # v9.0.0
- uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
id: stale
with:
stale-issue-message: >

27
.github/workflows/lint.yaml vendored Normal file
View File

@ -0,0 +1,27 @@
name: Lint Charts
on:
pull_request:
jobs:
lint:
runs-on: ubuntu-latest
env:
GO111MODULE: on
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v3
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # pin@v4
with:
python-version: 3.12
- uses: actions/setup-go@d35c59abb061a4a6fb18e82ac0862c26744d6ab5 # pin@v3
with:
go-version: ^1
- name: Setup helm-docs
run: go install github.com/norwoodj/helm-docs/cmd/helm-docs@latest
- name: Run pre-commit
uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # pin@v3.0.1

View File

@ -28,24 +28,24 @@ jobs:
git config user.email "$GITHUB_ACTOR@users.noreply.github.com"
- name: Run chart-releaser
uses: helm/chart-releaser-action@a917fd15b20e8b64b94d9158ad54cd6345335584 # pin@v1.6.0
uses: helm/chart-releaser-action@cae68fefc6b5f367a0275617c9f83181ba54714f # pin@v1.7.0
with:
config: cr.yaml
env:
CR_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
- name: Login to GitHub Container Registry
uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 #pin@v3.3.0
uses: docker/login-action@74a5d142397b4f367a81961eba4e8cd7edddf772 #pin@v3.4.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Install Cosign
uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da #pin@v3.7.0
uses: sigstore/cosign-installer@398d4b0eeef1380460a10c8013a76f728fb906ac #pin@v3.9.1
- name: Install Oras
uses: oras-project/setup-oras@9c92598691bfef1424de2f8fae81941568f5889c # v1.2.1
uses: oras-project/setup-oras@8d34698a59f5ffe24821f0b48ab62a3de8b64b20 # v1.2.3
- name: Publish and Sign OCI Charts
run: |

18
.github/workflows/spellcheck.yaml vendored Normal file
View File

@ -0,0 +1,18 @@
name: Codespell
on:
pull_request:
jobs:
codespell:
name: Codespell
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
- name: Codespell
uses: codespell-project/actions-codespell@v2
with:
skip: .git
check_filenames: true
check_hidden: true

View File

@ -1,33 +1,9 @@
name: Lint Charts
name: Test Charts
on:
pull_request:
paths:
- "charts/**"
jobs:
check-readme:
runs-on: ubuntu-latest
env:
GO111MODULE: on
steps:
- name: Checkout
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # pin@v3
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # pin@v4
with:
python-version: 3.7
- uses: actions/setup-go@41dfa10bad2bb2ae585af6ee5bb4d7d973ad74ed # pin@v3
with:
go-version: ^1
- name: Setup helm-docs
run: go install github.com/norwoodj/helm-docs/cmd/helm-docs@latest
- name: Run pre-commit
uses: pre-commit/action@2c7b3805fd2a0fd8c1884dcaebf91fc102a13ecd # pin@v3.0.1
test:
runs-on: ubuntu-latest
steps:
@ -37,16 +13,16 @@ jobs:
fetch-depth: 0
- name: Set up Helm
uses: azure/setup-helm@fe7b79cd5ee1e45176fcad797de68ecaf3ca4814 # pin@v4.2.0
uses: azure/setup-helm@b9e51907a09c216f16ebe8536097933489208112 # pin@v4.3.0
with:
version: v3.10.0
- uses: actions/setup-python@0b93645e9fea7318ecaed2b359559ac225c90a2b # pin@v4
- uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # pin@v4
with:
python-version: 3.7
python-version: 3.12
- name: Set up chart-testing
uses: helm/chart-testing-action@e6669bcd63d7cb57cb4380c33043eebe5d111992 # pin@v2.3.0
uses: helm/chart-testing-action@0d28d3144d3a25ea2cc349d6e59901c4ff469b3b # pin@v2.3.0
- name: "Add NGINX Ingress and Bitnami Repository"
run: |
@ -57,7 +33,7 @@ jobs:
run: ct lint --config ct.yaml
- name: Create KIND Cluster
uses: helm/kind-action@0025e74a8c7512023d06dc019c617aa3cf561fde # pin@v1.10.0
uses: helm/kind-action@a1b0e391336a6ee6713a0583f8c6240d70863de3 # pin@v1.12.0
- name: Install Ingress Controller
run: "helm install ingress-nginx/ingress-nginx --generate-name --set controller.service.type='NodePort' --set controller.admissionWebhooks.enabled=false"

View File

@ -14,7 +14,12 @@ repos:
hooks:
- id: jsonschema-dereference
name: jsonschema-dereference
entry: python .pre-commit/jsonschema-dereference.py
entry: python .pre-commit/jsonschema_dereference.py
additional_dependencies: [jsonref]
language: python
types_or: [yaml, json]
- repo: https://github.com/codespell-project/codespell
rev: v2.4.1
hooks:
- id: codespell

View File

@ -1,34 +0,0 @@
import json
from typing import List, Dict, Any
from pathlib import Path
import jsonref
JSONSCHEMA_TEMPLATE_NAME = "values.schema.tmpl.json"
JSONSCHEMA_NAME = "values.schema.json"
CHART_LOCK = "Chart.lock"
def load_template_schema(chart_dir: Path) -> Dict[str, Any]:
"""Load values.schema.tmpl.json and template it via Jinja2."""
with open(chart_dir / JSONSCHEMA_TEMPLATE_NAME, "r") as f:
return json.loads(f.read())
def save(chart_dir: Path, schema: Any):
"""Take schema containing $refs and dereference them."""
with open(chart_dir / JSONSCHEMA_NAME, "w") as f:
json.dump(schema, f, indent=4, sort_keys=True)
if __name__ == '__main__':
charts = [p.parent for p in Path(".").rglob(CHART_LOCK)]
errors: List[BaseException] = []
for chart in charts:
try:
schema_template = load_template_schema(chart)
schema = jsonref.replace_refs(schema_template)
save(chart, schema)
except BaseException as e:
print(f"Could not process schema for '{chart}': {e}")
errors.append(e)
if errors:
exit(1)

View File

@ -0,0 +1,54 @@
"""
This Python module:
- Searches for JSON Schema templates with the name values.schema.tmpl.json
- Dereferences any $refs contained in those files
- Outputs the new Schema to a values.schema.json file in the same directory
"""
import sys
import json
from typing import List, Dict, Any
from pathlib import Path
# External library dependency
# Install with 'pip install jsonref'
import jsonref
# File to write the dereferenced JSON Schema to
JSONSCHEMA_NAME = "values.schema.json"
# File that contains the JSON Schema that needs dereferencing
JSONSCHEMA_TEMPLATE_NAME = "values.schema.tmpl.json"
def load_template_schema(schema_dir: Path) -> Dict[str, Any]:
"""Load the schema template values.schema.tmpl.json"""
with open(schema_dir / JSONSCHEMA_TEMPLATE_NAME, "r", encoding="utf-8") as f:
return json.loads(f.read())
def save(schema_dir: Path, schema_data: Any):
"""Save the dereferenced schema to values.schema.json"""
with open(schema_dir / JSONSCHEMA_NAME, "w", encoding="utf-8") as f:
json.dump(schema_data, f, indent=4, sort_keys=True)
if __name__ == '__main__':
# Search for all values.schema.tmpl.json files
schema_templates = [p.parent for p in Path(".").rglob(JSONSCHEMA_TEMPLATE_NAME)]
# Create a list to hold any exceptions
errors: List[BaseException] = []
# Iterate over the List of found schema templates
for schema_template in schema_templates:
try:
# Load the schema into a variable as JSON
st = load_template_schema(schema_template)
# Dereference all of the $refs
s = jsonref.replace_refs(st)
# Save the dereferenced JSON
save(schema_template, s)
except BaseException as e:
# Print any errors to the screen
print(f"Could not process schema for '{schema_template}': {e}")
# Append any exceptions to the errors List
errors.append(e)
if errors:
# Exit with status 1 if any exceptions were thrown
sys.exit(1)

View File

@ -11,7 +11,7 @@ Backstage unifies all your infrastructure tooling, services, and documentation t
This chart focuses on providing users the same experience and functionality no matter what flavor of Kubernetes they use. This chart will support only patterns that are either customary for all Kubernetes flavors, are commonly used in the Bitnami charts ecosystem, and recognized as Backstage official patterns.
We welcome other, more specialized, charts to use this cannonical chart as a direct dependency, expanding the feature set further, beyond this scope.
We welcome other, more specialized, charts to use this canonical chart as a direct dependency, expanding the feature set further, beyond this scope.
A list of derived charts:
- OpenShift specialized chart: [Red Hat Developer Hub Helm chart](https://github.com/redhat-developer/rhdh-chart/tree/main/charts/backstage)

View File

@ -38,4 +38,4 @@ sources:
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 2.2.0
version: 2.6.0

View File

@ -2,7 +2,7 @@
# Backstage Helm Chart
[![Artifact Hub](https://img.shields.io/endpoint?url=https://artifacthub.io/badge/repository/backstage)](https://artifacthub.io/packages/search?repo=backstage)
![Version: 2.2.0](https://img.shields.io/badge/Version-2.2.0-informational?style=flat-square)
![Version: 2.6.0](https://img.shields.io/badge/Version-2.6.0-informational?style=flat-square)
![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square)
A Helm chart for deploying a Backstage application
@ -51,7 +51,7 @@ This chart bootstraps a [Backstage](https://backstage.io/docs/deployment/docker)
This chart focuses on providing users the same experience and functionality no matter what flavor of Kubernetes they use. This chart will support only patterns that are either customary for all Kubernetes flavors, are commonly used in the Bitnami charts ecosystem, and recognized as Backstage official patterns.
We welcome other, more specialized, charts to use this cannonical chart as a direct dependency, expanding the feature set further, beyond this scope.
We welcome other, more specialized, charts to use this canonical chart as a direct dependency, expanding the feature set further, beyond this scope.
A list of derived charts:
- OpenShift specialized chart: [Janus Backstage Helm chart](https://github.com/janus-idp/helm-backstage/tree/main/charts/backstage)
@ -117,6 +117,7 @@ Kubernetes: `>= 1.19.0-0`
| backstage.annotations | Additional custom annotations for the `Deployment` resource | object | `{}` |
| backstage.appConfig | Generates ConfigMap and configures it in the Backstage pods | object | `{}` |
| backstage.args | Backstage container command arguments | list | `[]` |
| backstage.autoscaling | Autoscaling configuration. <br /> Ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ | object | `{"enabled":false,"maxReplicas":100,"minReplicas":1,"targetCPUUtilizationPercentage":80}` |
| backstage.command | Backstage container command | list | `["node","packages/backend"]` |
| backstage.containerPorts | Container ports on the Deployment | object | `{"backend":7007}` |
| backstage.containerSecurityContext | Security settings for a Container. <br /> Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-container | object | `{}` |
@ -125,6 +126,7 @@ Kubernetes: `>= 1.19.0-0`
| backstage.extraEnvVars | Backstage container environment variables | list | `[]` |
| backstage.extraEnvVarsCM | Backstage container environment variables from existing ConfigMaps | list | `[]` |
| backstage.extraEnvVarsSecrets | Backstage container environment variables from existing Secrets | list | `[]` |
| backstage.extraPorts | Backstage container additional ports | list | `[]` |
| backstage.extraVolumeMounts | Backstage container additional volume mounts | list | `[]` |
| backstage.extraVolumes | Backstage container additional volumes | list | `[]` |
| backstage.hostAliases | Host Aliases for the pod <br /> Ref: https://kubernetes.io/docs/concepts/services-networking/add-entries-to-pod-etc-hosts-with-host-aliases/ | list | `[]` |
@ -138,6 +140,7 @@ Kubernetes: `>= 1.19.0-0`
| backstage.installDir | Directory containing the backstage installation | string | `"/app"` |
| backstage.livenessProbe | Liveness Probe Ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes <!-- E.g. livenessProbe: failureThreshold: 3 httpGet: path: /.backstage/health/v1/liveness port: 7007 scheme: HTTP initialDelaySeconds: 60 periodSeconds: 10 successThreshold: 1 timeoutSeconds: 2 | object | `{"httpGet":{"path":"/.backstage/health/v1/liveness","port":7007,"scheme":"HTTP"}}` |
| backstage.nodeSelector | Node labels for pod assignment <br /> Ref: https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector | object | `{}` |
| backstage.pdb | Pod Disruption Budget configuration ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/ | object | `{"create":false,"maxUnavailable":"","minAvailable":""}` |
| backstage.podAnnotations | Annotations to add to the backend deployment pods | object | `{}` |
| backstage.podLabels | Labels to add to the backend deployment pods | object | `{}` |
| backstage.podSecurityContext | Security settings for a Pod. The security settings that you specify for a Pod apply to all Containers in the Pod. <br /> Ref: https://kubernetes.io/docs/tasks/configure-pod-container/security-context/#set-the-security-context-for-a-pod | object | `{}` |
@ -179,7 +182,7 @@ Kubernetes: `>= 1.19.0-0`
| metrics.serviceMonitor.interval | ServiceMonitor scrape interval | string | `nil` |
| metrics.serviceMonitor.labels | Additional ServiceMonitor labels | object | `{}` |
| metrics.serviceMonitor.path | ServiceMonitor endpoint path <br /> Note that the /metrics endpoint is NOT present in a freshly scaffolded Backstage app. To setup, follow the [Prometheus metrics tutorial](https://github.com/backstage/backstage/blob/master/contrib/docs/tutorials/prometheus-metrics.md). | string | `"/metrics"` |
| metrics.serviceMonitor.port | ServiceMonitor endpoint port <br /> The port where the metrics are exposed. If using OpenTelemetry as [documented here](https://backstage.io/docs/tutorials/setup-opentelemetry/), then the port needs to be explicitely specificed. OpenTelemetry's default port is 9464. | string | `"http-backend"` |
| metrics.serviceMonitor.port | ServiceMonitor endpoint port <br /> The port where the metrics are exposed. If using OpenTelemetry as [documented here](https://backstage.io/docs/tutorials/setup-opentelemetry/), then the port needs to be explicitly specified. OpenTelemetry's default port is 9464. | string | `"http-backend"` |
| nameOverride | String to partially override common.names.fullname | string | `""` |
| networkPolicy.egressRules.customRules | Additional custom egress rules | list | `[]` |
| networkPolicy.egressRules.denyConnectionsToExternal | Deny external connections. Should not be enabled when working with an external database. | bool | `false` |
@ -203,6 +206,8 @@ Kubernetes: `>= 1.19.0-0`
| service.clusterIP | Backstage service Cluster IP <br /> E.g `clusterIP: None` | string | `""` |
| service.externalTrafficPolicy | Backstage service external traffic policy Ref: https://kubernetes.io/docs/tasks/access-application-cluster/create-external-load-balancer/#preserving-the-client-source-ip | string | `"Cluster"` |
| service.extraPorts | Extra ports to expose in the Backstage service (normally used with the `sidecar` value) | list | `[]` |
| service.ipFamilies | IP Families <br /> Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack | list | `[]` |
| service.ipFamilyPolicy | IP Family Policy <br /> Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack | string | `""` |
| service.loadBalancerIP | Backstage service Load Balancer IP <br /> Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer | string | `""` |
| service.loadBalancerSourceRanges | Load Balancer sources <br /> Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer <br /> E.g `loadBalancerSourceRanges: [10.10.10.0/24]` | list | `[]` |
| service.nodePorts | Node port for the Backstage client connections Choose port between `30000-32767` | object | `{"backend":""}` |

View File

@ -45,7 +45,7 @@ This chart bootstraps a [Backstage](https://backstage.io/docs/deployment/docker)
This chart focuses on providing users the same experience and functionality no matter what flavor of Kubernetes they use. This chart will support only patterns that are either customary for all Kubernetes flavors, are commonly used in the Bitnami charts ecosystem, and recognized as Backstage official patterns.
We welcome other, more specialized, charts to use this cannonical chart as a direct dependency, expanding the feature set further, beyond this scope.
We welcome other, more specialized, charts to use this canonical chart as a direct dependency, expanding the feature set further, beyond this scope.
A list of derived charts:
- OpenShift specialized chart: [Janus Backstage Helm chart](https://github.com/janus-idp/helm-backstage/tree/main/charts/backstage)

View File

@ -0,0 +1,7 @@
backstage:
autoscaling:
enabled: true
minReplicas: 1
maxReplicas: 3
targetCPUUtilizationPercentage: 75
targetMemoryUtilizationPercentage: 90

View File

@ -0,0 +1,4 @@
service:
ipFamilyPolicy: PreferDualStack
ipFamilies:
- IPv4

View File

@ -0,0 +1,9 @@
metrics:
serviceMonitor:
enabled: true
annotations:
test: test
labels:
test: test
path: /metrics
port: http-backend

View File

@ -20,7 +20,9 @@ metadata:
{{- include "common.tplvalues.render" ( dict "value" .Values.backstage.annotations "context" $) | nindent 4 }}
{{- end }}
spec:
{{- if not .Values.backstage.autoscaling.enabled }}
replicas: {{ .Values.backstage.replicas }}
{{- end }}
revisionHistoryLimit: {{ .Values.backstage.revisionHistoryLimit }}
selector:
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
@ -162,6 +164,9 @@ spec:
- name: backend
containerPort: {{ .Values.backstage.containerPorts.backend }}
protocol: TCP
{{- if .Values.backstage.extraPorts }}
{{- include "common.tplvalues.render" ( dict "value" .Values.backstage.extraPorts "context" $) | nindent 12 }}
{{- end }}
{{- if (or .Values.backstage.extraAppConfig .Values.backstage.appConfig (and .Values.backstage.extraVolumeMounts .Values.backstage.extraVolumes)) }}
volumeMounts:
{{- range .Values.backstage.extraAppConfig }}

View File

@ -0,0 +1,43 @@
{{- if .Values.backstage.autoscaling.enabled }}
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "common.names.fullname" . }}
namespace: {{ .Release.Namespace | quote }}
labels: {{ include "common.labels.standard" . | nindent 4 }}
app.kubernetes.io/component: backstage
{{- if .Values.commonLabels }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
{{- end }}
annotations:
{{- if .Values.commonAnnotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
{{- end }}
{{- if .Values.backstage.annotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.backstage.annotations "context" $) | nindent 4 }}
{{- end }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "common.names.fullname" . }}
minReplicas: {{ .Values.backstage.autoscaling.minReplicas }}
maxReplicas: {{ .Values.backstage.autoscaling.maxReplicas }}
metrics:
{{- if .Values.backstage.autoscaling.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: {{ .Values.backstage.autoscaling.targetCPUUtilizationPercentage }}
{{- end }}
{{- if .Values.backstage.autoscaling.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: {{ .Values.backstage.autoscaling.targetMemoryUtilizationPercentage }}
{{- end }}
{{- end }}

View File

@ -0,0 +1,29 @@
{{- if .Values.backstage.pdb.create }}
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: {{ include "common.names.fullname" . }}
namespace: {{ .Release.Namespace | quote }}
labels: {{ include "common.labels.standard" . | nindent 4 }}
app.kubernetes.io/component: backstage
{{- if .Values.commonLabels }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }}
{{- end }}
annotations:
{{- if .Values.commonAnnotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }}
{{- end }}
{{- if .Values.backstage.annotations }}
{{- include "common.tplvalues.render" ( dict "value" .Values.backstage.annotations "context" $) | nindent 4 }}
{{- end }}
spec:
{{- if .Values.backstage.pdb.minAvailable }}
minAvailable: {{ .Values.backstage.pdb.minAvailable }}
{{- end }}
{{- if or .Values.backstage.pdb.maxUnavailable ( not .Values.backstage.pdb.minAvailable ) }}
maxUnavailable: {{ .Values.backstage.pdb.maxUnavailable | default 1 }}
{{- end }}
selector:
matchLabels: {{- include "common.labels.matchLabels" . | nindent 6 }}
app.kubernetes.io/component: backstage
{{- end }}

View File

@ -34,6 +34,13 @@ spec:
{{- if .Values.service.sessionAffinity }}
sessionAffinity: {{ .Values.service.sessionAffinity }}
{{- end }}
{{- if .Values.service.ipFamilyPolicy }}
ipFamilyPolicy: {{ .Values.service.ipFamilyPolicy }}
{{- end }}
{{- with .Values.service.ipFamilies }}
ipFamilies:
{{- toYaml . | nindent 4 }}
{{- end }}
ports:
- name: {{ .Values.service.ports.name }}
port: {{ .Values.service.ports.backend }}

View File

@ -29,7 +29,7 @@ spec:
matchLabels: {{ include "common.labels.standard" . | nindent 6 }}
app.kubernetes.io/component: backstage
endpoints:
- port: {{ .Values.metrics.serviceMonitor.port }}
- port: {{ .Values.metrics.serviceMonitor.port | quote }}
path: {{ .Values.metrics.serviceMonitor.path }}
{{- with .Values.metrics.serviceMonitor.interval }}
interval: {{ . }}

View File

@ -244,7 +244,7 @@
"x-kubernetes-map-type": "atomic"
},
"matchLabelKeys": {
"description": "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
"description": "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.",
"items": {
"type": "string"
},
@ -252,7 +252,7 @@
"x-kubernetes-list-type": "atomic"
},
"mismatchLabelKeys": {
"description": "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
"description": "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.",
"items": {
"type": "string"
},
@ -388,7 +388,7 @@
"x-kubernetes-map-type": "atomic"
},
"matchLabelKeys": {
"description": "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
"description": "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.",
"items": {
"type": "string"
},
@ -396,7 +396,7 @@
"x-kubernetes-list-type": "atomic"
},
"mismatchLabelKeys": {
"description": "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
"description": "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.",
"items": {
"type": "string"
},
@ -476,7 +476,7 @@
"description": "Pod anti affinity is a group of inter pod anti affinity scheduling rules.",
"properties": {
"preferredDuringSchedulingIgnoredDuringExecution": {
"description": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and adding \"weight\" to the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.",
"description": "The scheduler will prefer to schedule pods to nodes that satisfy the anti-affinity expressions specified by this field, but it may choose a node that violates one or more of the expressions. The node that is most preferred is the one with the greatest sum of weights, i.e. for each node that meets all of the scheduling requirements (resource request, requiredDuringScheduling anti-affinity expressions, etc.), compute a sum by iterating through the elements of this field and subtracting \"weight\" from the sum if the node has pods which matches the corresponding podAffinityTerm; the node(s) with the highest sum are the most preferred.",
"items": {
"description": "The weights of all of the matched WeightedPodAffinityTerm fields are added per-node to find the most preferred node(s)",
"properties": {
@ -529,7 +529,7 @@
"x-kubernetes-map-type": "atomic"
},
"matchLabelKeys": {
"description": "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
"description": "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.",
"items": {
"type": "string"
},
@ -537,7 +537,7 @@
"x-kubernetes-list-type": "atomic"
},
"mismatchLabelKeys": {
"description": "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
"description": "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.",
"items": {
"type": "string"
},
@ -673,7 +673,7 @@
"x-kubernetes-map-type": "atomic"
},
"matchLabelKeys": {
"description": "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
"description": "MatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key in (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both matchLabelKeys and labelSelector. Also, matchLabelKeys cannot be set when labelSelector isn't set.",
"items": {
"type": "string"
},
@ -681,7 +681,7 @@
"x-kubernetes-list-type": "atomic"
},
"mismatchLabelKeys": {
"description": "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set. This is a beta field and requires enabling MatchLabelKeysInPodAffinity feature gate (enabled by default).",
"description": "MismatchLabelKeys is a set of pod label keys to select which pods will be taken into consideration. The keys are used to lookup values from the incoming pod labels, those key-value labels are merged with `labelSelector` as `key notin (value)` to select the group of existing pods which pods will be taken into consideration for the incoming pod's pod (anti) affinity. Keys that don't exist in the incoming pod labels will be ignored. The default value is empty. The same key is forbidden to exist in both mismatchLabelKeys and labelSelector. Also, mismatchLabelKeys cannot be set when labelSelector isn't set.",
"items": {
"type": "string"
},
@ -792,6 +792,38 @@
"title": "Backstage container command arguments",
"type": "array"
},
"autoscaling": {
"additionalProperties": false,
"properties": {
"enabled": {
"default": false,
"description": "Enable autoscaling",
"title": "Backstage Autoscaling",
"type": "boolean"
},
"maxReplicas": {
"default": 100,
"title": "Maximum number of Backstage pod replicas that the autoscaler is allowed to scale up to",
"type": "integer"
},
"minReplicas": {
"default": 1,
"title": "Minimum number of Backstage pod replicas that the autoscaler is allowed to scale down to",
"type": "integer"
},
"targetCPUUtilizationPercentage": {
"default": 80,
"title": "Percentage of CPU that each Backstage pod should be using on average before the autoscaler decides to scale",
"type": "integer"
},
"targetMemoryUtilizationPercentage": {
"title": "Percentage of memory that each Backstage pod should be using on average before the autoscaler decides to scale",
"type": "integer"
}
},
"title": "Autoscaling parameters",
"type": "object"
},
"command": {
"default": [
"node",
@ -1011,7 +1043,7 @@
"description": "EnvVar represents an environment variable present in a Container.",
"properties": {
"name": {
"description": "Name of the environment variable. Must be a C_IDENTIFIER.",
"description": "Name of the environment variable. May consist of any printable ASCII characters except '='.",
"type": "string"
},
"value": {
@ -1129,9 +1161,9 @@
"x-kubernetes-patch-strategy": "merge"
},
"envFrom": {
"description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
"description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
"items": {
"description": "EnvFromSource represents the source of a set of ConfigMaps",
"description": "EnvFromSource represents the source of a set of ConfigMaps or Secrets",
"properties": {
"configMapRef": {
"description": "ConfigMapEnvSource selects a ConfigMap to populate the environment variables with.\n\nThe contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.",
@ -1148,7 +1180,7 @@
"type": "object"
},
"prefix": {
"description": "An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.",
"description": "Optional text to prepend to the name of each environment variable. May consist of any printable ASCII characters except '='.",
"type": "string"
},
"secretRef": {
@ -1403,6 +1435,10 @@
}
},
"type": "object"
},
"stopSignal": {
"description": "StopSignal defines which signal will be sent to a container when it is being stopped. If not specified, the default is defined by the container runtime in use. StopSignal can only be set for Pods with a non-empty .spec.os.name",
"type": "string"
}
},
"type": "object"
@ -2249,7 +2285,7 @@
"description": "EnvVar represents an environment variable present in a Container.",
"properties": {
"name": {
"description": "Name of the environment variable. Must be a C_IDENTIFIER.",
"description": "Name of the environment variable. May consist of any printable ASCII characters except '='.",
"type": "string"
},
"value": {
@ -2389,6 +2425,42 @@
"title": "Backstage container environment variables from existing Secrets",
"type": "array"
},
"extraPorts": {
"default": [],
"items": {
"description": "ContainerPort represents a network port in a single container.",
"properties": {
"containerPort": {
"description": "Number of port to expose on the pod's IP address. This must be a valid port number, 0 < x < 65536.",
"format": "int32",
"type": "integer"
},
"hostIP": {
"description": "What host IP to bind the external port to.",
"type": "string"
},
"hostPort": {
"description": "Number of port to expose on the host. If specified, this must be a valid port number, 0 < x < 65536. If HostNetwork is specified, this must match ContainerPort. Most containers do not need this.",
"format": "int32",
"type": "integer"
},
"name": {
"description": "If specified, this must be an IANA_SVC_NAME and unique within the pod. Each named port in a pod must have a unique name. Name for the port that can be referred to by services.",
"type": "string"
},
"protocol": {
"description": "Protocol for port. Must be UDP, TCP, or SCTP. Defaults to \"TCP\".",
"type": "string"
}
},
"required": [
"containerPort"
],
"type": "object"
},
"title": "Extra ports to expose in the Backstage container",
"type": "array"
},
"extraVolumeMounts": {
"default": [],
"items": {
@ -3253,7 +3325,7 @@
"description": "Represents a Glusterfs mount that lasts the lifetime of a pod. Glusterfs volumes do not support ownership management or SELinux relabeling.",
"properties": {
"endpoints": {
"description": "endpoints is the endpoint name that details Glusterfs topology. More info: https://examples.k8s.io/volumes/glusterfs/README.md#create-a-pod",
"description": "endpoints is the endpoint name that details Glusterfs topology.",
"type": "string"
},
"path": {
@ -4092,7 +4164,7 @@
"description": "EnvVar represents an environment variable present in a Container.",
"properties": {
"name": {
"description": "Name of the environment variable. Must be a C_IDENTIFIER.",
"description": "Name of the environment variable. May consist of any printable ASCII characters except '='.",
"type": "string"
},
"value": {
@ -4210,9 +4282,9 @@
"x-kubernetes-patch-strategy": "merge"
},
"envFrom": {
"description": "List of sources to populate environment variables in the container. The keys defined within a source must be a C_IDENTIFIER. All invalid keys will be reported as an event when the container is starting. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
"description": "List of sources to populate environment variables in the container. The keys defined within a source may consist of any printable ASCII characters except '='. When a key exists in multiple sources, the value associated with the last source will take precedence. Values defined by an Env with a duplicate key will take precedence. Cannot be updated.",
"items": {
"description": "EnvFromSource represents the source of a set of ConfigMaps",
"description": "EnvFromSource represents the source of a set of ConfigMaps or Secrets",
"properties": {
"configMapRef": {
"description": "ConfigMapEnvSource selects a ConfigMap to populate the environment variables with.\n\nThe contents of the target ConfigMap's Data field will represent the key-value pairs as environment variables.",
@ -4229,7 +4301,7 @@
"type": "object"
},
"prefix": {
"description": "An optional identifier to prepend to each key in the ConfigMap. Must be a C_IDENTIFIER.",
"description": "Optional text to prepend to the name of each environment variable. May consist of any printable ASCII characters except '='.",
"type": "string"
},
"secretRef": {
@ -4484,6 +4556,10 @@
}
},
"type": "object"
},
"stopSignal": {
"description": "StopSignal defines which signal will be sent to a container when it is being stopped. If not specified, the default is defined by the container runtime in use. StopSignal can only be set for Pods with a non-empty .spec.os.name",
"type": "string"
}
},
"type": "object"
@ -5475,6 +5551,35 @@
"title": "Node labels for pod assignment",
"type": "object"
},
"pdb": {
"additionalProperties": false,
"properties": {
"create": {
"default": false,
"description": "Create a PDB",
"title": "Backstage PDB",
"type": "boolean"
},
"maxUnavailable": {
"default": "",
"title": "Backstage PDB maxUnavailable",
"type": [
"string",
"integer"
]
},
"minAvailable": {
"default": "",
"title": "Backstage PDB minAvailable",
"type": [
"string",
"integer"
]
}
},
"title": "PDB parameters",
"type": "object"
},
"podAnnotations": {
"additionalProperties": {
"type": "string"
@ -6107,11 +6212,11 @@
"type": "integer"
},
"nodeAffinityPolicy": {
"description": "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.",
"description": "NodeAffinityPolicy indicates how we will treat Pod's nodeAffinity/nodeSelector when calculating pod topology spread skew. Options are: - Honor: only nodes matching nodeAffinity/nodeSelector are included in the calculations. - Ignore: nodeAffinity/nodeSelector are ignored. All nodes are included in the calculations.\n\nIf this value is nil, the behavior is equivalent to the Honor policy.",
"type": "string"
},
"nodeTaintsPolicy": {
"description": "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy. This is a beta-level feature default enabled by the NodeInclusionPolicyInPodTopologySpread feature flag.",
"description": "NodeTaintsPolicy indicates how we will treat node taints when calculating pod topology spread skew. Options are: - Honor: nodes without taints, along with tainted nodes for which the incoming pod has a toleration, are included. - Ignore: node taints are ignored. All nodes are included.\n\nIf this value is nil, the behavior is equivalent to the Ignore policy.",
"type": "string"
},
"topologyKey": {
@ -6400,7 +6505,7 @@
}
],
"default": "http-backend",
"description": "The port where the metrics are exposed. If using OpenTelemetry as [documented here](https://backstage.io/docs/tutorials/setup-opentelemetry/), then the port needs to be explicitely specificed. OpenTelemetry's default port is 9464.",
"description": "The port where the metrics are exposed. If using OpenTelemetry as [documented here](https://backstage.io/docs/tutorials/setup-opentelemetry/), then the port needs to be explicitly specified. OpenTelemetry's default port is 9464.",
"title": "ServiceMonitor endpoint port"
}
},
@ -7015,6 +7120,31 @@
"title": "Extra ports to expose in the Backstage service",
"type": "array"
},
"ipFamilies": {
"default": [],
"description": "Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services",
"items": {
"enum": [
"IPv4",
"IPv6"
],
"type": "string"
},
"title": "Backstage service IP families",
"type": "array"
},
"ipFamilyPolicy": {
"default": "",
"description": "Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services",
"enum": [
"",
"SingleStack",
"PreferDualStack",
"RequireDualStack"
],
"title": "Backstage service IP family policy",
"type": "string"
},
"loadBalancerIP": {
"default": "",
"description": "Ref: https://kubernetes.io/docs/concepts/services-networking/service/#loadbalancer",

View File

@ -275,6 +275,67 @@
}
}
},
"autoscaling": {
"title": "Autoscaling parameters",
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": {
"description": "Enable autoscaling",
"title": "Backstage Autoscaling",
"type": "boolean",
"default": false
},
"minReplicas": {
"title": "Minimum number of Backstage pod replicas that the autoscaler is allowed to scale down to",
"type": "integer",
"default": 1
},
"maxReplicas": {
"title": "Maximum number of Backstage pod replicas that the autoscaler is allowed to scale up to",
"type": "integer",
"default": 100
},
"targetCPUUtilizationPercentage": {
"title": "Percentage of CPU that each Backstage pod should be using on average before the autoscaler decides to scale",
"type": "integer",
"default": 80
},
"targetMemoryUtilizationPercentage": {
"title": "Percentage of memory that each Backstage pod should be using on average before the autoscaler decides to scale",
"type": "integer"
}
}
},
"pdb": {
"title": "PDB parameters",
"type": "object",
"additionalProperties": false,
"properties": {
"create": {
"description": "Create a PDB",
"title": "Backstage PDB",
"type": "boolean",
"default": false
},
"minAvailable": {
"title": "Backstage PDB minAvailable",
"type": [
"string",
"integer"
],
"default": ""
},
"maxUnavailable": {
"title": "Backstage PDB maxUnavailable",
"type": [
"string",
"integer"
],
"default": ""
}
}
},
"containerPorts": {
"title": "Container ports on the Deployment",
"type": "object",
@ -404,6 +465,14 @@
]
]
},
"extraPorts": {
"title": "Extra ports to expose in the Backstage container",
"type": "array",
"items": {
"$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/master/_definitions.json#/definitions/io.k8s.api.core.v1.ContainerPort"
},
"default": []
},
"extraVolumeMounts": {
"title": "Backstage container additional volume mounts",
"type": "array",
@ -457,10 +526,10 @@
"$ref": "https://raw.githubusercontent.com/yannh/kubernetes-json-schema/master/master/_definitions.json#/definitions/io.k8s.api.core.v1.Probe",
"default": {
"httpGet": {
"path": "/.backstage/health/v1/readiness",
"port": 7007,
"scheme": "HTTP"
}
"path": "/.backstage/health/v1/readiness",
"port": 7007,
"scheme": "HTTP"
}
},
"examples": [
{
@ -722,6 +791,28 @@
"type": "object"
},
"default": []
},
"ipFamilyPolicy": {
"title": "Backstage service IP family policy",
"description": "Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services",
"type": "string",
"default": "",
"enum": [
"",
"SingleStack",
"PreferDualStack",
"RequireDualStack"
]
},
"ipFamilies": {
"title": "Backstage service IP families",
"description": "Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack/#services",
"type": "array",
"items": {
"type": "string",
"enum": ["IPv4", "IPv6"]
},
"default": []
}
}
},
@ -876,11 +967,15 @@
},
"port": {
"default": "http-backend",
"description": "The port where the metrics are exposed. If using OpenTelemetry as [documented here](https://backstage.io/docs/tutorials/setup-opentelemetry/), then the port needs to be explicitely specificed. OpenTelemetry's default port is 9464.",
"description": "The port where the metrics are exposed. If using OpenTelemetry as [documented here](https://backstage.io/docs/tutorials/setup-opentelemetry/), then the port needs to be explicitly specified. OpenTelemetry's default port is 9464.",
"title": "ServiceMonitor endpoint port",
"anyOf": [
{ "type": "string" },
{ "type": "integer" }
{
"type": "string"
},
{
"type": "integer"
}
]
}
}
@ -888,4 +983,4 @@
}
}
}
}
}

View File

@ -133,6 +133,22 @@ backstage:
# <br /> E.g: `pullSecrets: [myRegistryKeySecretName]`
pullSecrets: []
# -- Pod Disruption Budget configuration
# ref: https://kubernetes.io/docs/tasks/run-application/configure-pdb/
pdb:
create: false
minAvailable: ""
maxUnavailable: ""
# -- Autoscaling configuration.
# <br /> Ref: https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
# -- Container ports on the Deployment
containerPorts:
backend: 7007
@ -158,6 +174,9 @@ backstage:
# -- Backstage container environment variables from existing Secrets
extraEnvVarsSecrets: []
# -- Backstage container additional ports
extraPorts: []
# -- Backstage container additional volume mounts
extraVolumeMounts: []
@ -349,6 +368,16 @@ service:
# -- Extra ports to expose in the Backstage service (normally used with the `sidecar` value)
extraPorts: []
# -- IP Family Policy
#
# <br /> Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack
ipFamilyPolicy: ""
# -- IP Families
#
# <br /> Ref: https://kubernetes.io/docs/concepts/services-networking/dual-stack
ipFamilies: []
## @section NetworkPolicy parameters
##
networkPolicy:
@ -466,5 +495,5 @@ metrics:
path: /metrics
# -- ServiceMonitor endpoint port
# <br /> The port where the metrics are exposed. If using OpenTelemetry as [documented here](https://backstage.io/docs/tutorials/setup-opentelemetry/), then the port needs to be explicitely specificed. OpenTelemetry's default port is 9464.
# <br /> The port where the metrics are exposed. If using OpenTelemetry as [documented here](https://backstage.io/docs/tutorials/setup-opentelemetry/), then the port needs to be explicitly specified. OpenTelemetry's default port is 9464.
port: http-backend