Skip to content

Feat/scs minor versions#259

Draft
jschoone wants to merge 11 commits intomainfrom
feat/scs-minor-versions
Draft

Feat/scs minor versions#259
jschoone wants to merge 11 commits intomainfrom
feat/scs-minor-versions

Conversation

@jschoone
Copy link
Copy Markdown
Contributor

What this PR does / why we need it:

Which issue(s) this PR fixes (optional, in fixes #<issue number>(, fixes #<issue_number>, ...) format, will close the issue(s) when PR gets merged):
Fixes #

Special notes for your reviewer:

Please confirm that if this PR changes any image versions, then that's the sole change this PR makes.

TODOs:

  • squash commits
  • include documentation
  • add unit tests

@jschoone jschoone added the Container Issues or pull requests relevant for Team 2: Container Infra and Tooling label Feb 21, 2026
@jschoone jschoone requested a review from Nils98Ar February 22, 2026 07:54
@jschoone jschoone marked this pull request as draft February 22, 2026 07:56
@jschoone
Copy link
Copy Markdown
Contributor Author

Most things work so far, still in heavy testing.
Replaces #248, #252, #255 if everything's fine

@jschoone
Copy link
Copy Markdown
Contributor Author

  • Matrix should be added to the docs automatically

@jschoone
Copy link
Copy Markdown
Contributor Author

The stack.yaml is a merge of csctl and versions.yaml
The old files can still be readded to the older versions to keep them backwards compatible also to keep csctl working, but I think using oras etc directly in a script is a much more lightweight solution

Replace the previous build system (csctl, Makefile, Python scripts, Go release
notes) with a streamlined set of bash scripts and a justfile.

New tooling:
- hack/build.sh: build + publish + --install-cso flag with next-steps output
- hack/update.sh: unified version/addon updater with image-manager maintenance
- hack/generate-resources.sh: ClusterStack + Cluster YAML generator with
  .release/ auto-detection
- hack/generate-image-manifests.sh: ORC and image-manager format generator
- hack/show-matrix.sh: version/addon matrix display with --markdown flag
- justfile: task runner with dev, install-cso, generate-*, matrix recipes
- Containerfile + flake.nix: reproducible tooling environment

Removed:
- hack/ensure-*.sh, hack/generate_version.py, hack/kind-dev.sh
- hack/generate_openstack_image_manager_yaml.sh
- hack/tools/release/notes.go

Assisted-by: Claude Code
Signed-off-by: Jan Schoone <jan.schoone@uhurutec.com>
…ries

Reorganize all cluster stacks into self-contained per-minor-version directories:

  providers/<provider>/<stack>/1-XX/
    stack.yaml          # metadata: provider, name, k8s version, addon pins
    cluster-class/      # Helm chart producing ClusterClass
    cluster-addon/      # Helm chart with CNI, CCM, CSI, metrics-server
    node-images/        # image build definitions (OpenStack only)

Each directory is fully independent -- no inheritance or sharing between
minor versions. This supports different CAPI API versions (v1beta1 for 1-32,
v1beta2 for 1-35) and version-specific addon pins (CCM 2.34.x for K8s 1.34).

Stacks created:
- openstack/scs: 1-32 (v1beta1, snake_case), 1-33 (v1beta1, camelCase),
  1-34 (copy of 1-33), 1-35 (v1beta2, unified variables)
- docker/scs: 1-32 through 1-35

Also adds providers/openstack/scs/image-manager.yaml (aggregated image
references for all OpenStack minor versions).

Removes:
- providers/openstack/scs2/ (consolidated into openstack/scs)
- Old flat directory structure (csctl.yaml, versions.yaml, etc.)

Assisted-by: Claude Code
Signed-off-by: Jan Schoone <jan.schoone@uhurutec.com>
Add providers/openstack/hcp/ with versions 1-33, 1-34, and 1-35.

The HCP stack runs the Kubernetes control plane as pods in the management
cluster using the teutonet Hosted Control Plane provider
(HostedControlPlaneTemplate, controlplane.cluster.x-k8s.io/v1alpha1).
Only worker nodes are created as OpenStack VMs.

Key differences from the scs stack:
- No machineInfrastructure for control plane (no CP VMs)
- Worker-prefixed variables (workerFlavor, workerRootDisk, etc.)
- Gateway API integration (gatewayName/gatewayNamespace variables)
- disableAPIServerFloatingIP: true, apiServerLoadBalancer: none by default
- Same addons as scs (Cilium, CCM, CSI, metrics-server)

Based on origin/hcp branch, adapted to per-minor-version structure.

Assisted-by: Claude Code
Signed-off-by: Jan Schoone <jan.schoone@uhurutec.com>
Rewrite all documentation to reflect the new per-Kubernetes-minor-version
directory layout, OCI-based workflow, and v1beta2 ClusterClass variables.

Tooling changes:
- hack/show-matrix.sh: Add --markdown flag for GFM table output
- hack/docugen.py: Add --matrix flag to embed version matrix in docs
- hack/config-template.md: Update template for v1beta2, add !!matrix!!
- justfile: Fix generate-docs to iterate all stacks with correct args

New documentation:
- docs/quickstart.md: Universal quickstart (OpenStack, Docker, HCP)
- docs/providers/openstack/hcp.md: HCP architecture and configuration
- docs/providers/openstack/scs-configuration.md: v1beta2 variable reference
- docs/providers/docker/scs-configuration.md: Docker stack variable reference

Removed:
- docs/providers/openstack/quickstart.md (replaced by docs/quickstart.md)
- docs/providers/openstack/configuration.md (replaced by scs-configuration.md)

Assisted-by: Claude Code
Signed-off-by: Jan Schoone <jan.schoone@uhurutec.com>
Re-add csctl.yaml files adapted for the per-minor-version structure.
Each version directory now contains its own csctl.yaml with the correct
provider type, cluster stack name, and Kubernetes minor version.

Assisted-by: Claude Code
Signed-off-by: Jan Schoone <jan.schoone@uhurutec.com>
@jschoone jschoone force-pushed the feat/scs-minor-versions branch from 6218088 to 9af6ce4 Compare February 25, 2026 11:53
Signed-off-by: Nils Arnold <arnold@aov.de>
Signed-off-by: Nils Arnold <arnold@aov.de>
Signed-off-by: Nils Arnold <arnold@aov.de>
Signed-off-by: Nils Arnold <arnold@aov.de>
Signed-off-by: Nils Arnold <arnold@aov.de>
Copy link
Copy Markdown
Member

@Nils98Ar Nils98Ar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@jschoone @garloff

I have tested the scripts and cluster stack, added scs2 changes, updates and some fixes + cilium native routing and kube-proxy replacement (starting with K8s 1.35). Our dev clusters are running on this cluster-stack in with K8s version 1.35 now.

The most important for updating and releasing new cluster stacks are now:

sudo nix develop
source .envrc
./hack/update.sh
./hack/build.sh --all --publish

@Nils98Ar Nils98Ar marked this pull request as ready for review April 15, 2026 11:28
@Nils98Ar Nils98Ar marked this pull request as draft April 15, 2026 11:29
@Nils98Ar
Copy link
Copy Markdown
Member

Nils98Ar commented Apr 15, 2026

Our cluster manifests look something like this, so this is what I used to test the cluster stacks (i have replaced some values with dummys/examples/placeholders):

---
apiVersion: cluster.x-k8s.io/v1beta2
kind: Cluster
metadata:
  name: "cluster-1"
  namespace: "tenant-1"
  labels:
    managed-secret: clouds-yaml
spec:
  clusterNetwork:
    pods:
      cidrBlocks:
        - 10.251.0.0/16
    serviceDomain: cluster.local
    services:
      cidrBlocks:
        - 10.252.0.0/16
  topology:
    variables:
      - name: networkExternalID
        value: "external-network-id"
      - name: nodeCIDR
        value: "10.253.2.0/24"
      - name: dnsNameservers
        value: ["9.9.9.9","149.112.112.112"]
      - name: apiServerAllowedCIDRs
        value: ["192.168.178.0/24"]
      - name: apiServerLoadBalancer
        value: "octavia-amphora"
      - name: registryMirrors
        value: [{hostnameUpstream: registry-1.docker.io, urlUpstream: 'https://registry-1.docker.io', urlMirror: 'https://mirror.foo.bar/v2/docker.io'}, {hostnameUpstream: index.docker.io, urlUpstream: 'https://registry-1.docker.io', urlMirror: 'https://mirror.foo.bar/v2/docker.io'}, {hostnameUpstream: docker.io, urlUpstream: 'https://registry-1.docker.io', urlMirror: 'https://mirror.foo.bar/v2/docker.io'}, {hostnameUpstream: gcr.io, urlUpstream: 'https://gcr.io', urlMirror: 'https://mirror.foo.bar/v2/gcr.io'}, {hostnameUpstream: ghcr.io, urlUpstream: 'https://ghcr.io', urlMirror: 'https://mirror.foo.bar/v2/ghcr.io'}, {hostnameUpstream: k8s.gcr.io, urlUpstream: 'https://k8s.gcr.io', urlMirror: 'https://mirror.foo.bar/v2/k8s.gcr.io'}, {hostnameUpstream: quay.io, urlUpstream: 'https://quay.io', urlMirror: 'https://mirror.foo.bar/v2/quay.io'}, {hostnameUpstream: registry.gitlab.com, urlUpstream: 'https://registry.gitlab.com', urlMirror: 'https://mirror.foo.bar/v2/registry.gitlab.com'}, {hostnameUpstream: registry.k8s.io, urlUpstream: 'https://registry.k8s.io', urlMirror: 'https://mirror.foo.bar/v2/registry.k8s.io'}]
    classRef:
      name: openstack-scs-1-35-v1
      namespace: cluster-stacks
    version: v1.35.3
    controlPlane:
      replicas: 3
      variables:
        overrides:
          - name: flavor
            value: "SCS-2V-4-20s"
          - name: serverGroupID
            value: "<cluster-1-controller-group-id>"
          - name: rootDisk
            value: 0
    workers:
      machineDeployments:
        - class: default-worker
          failureDomain: nova
          name: worker
          replicas: 3
          variables:
            overrides:
              - name: flavor
                value: "SCS-4V-16-100s"
              - name: serverGroupID
                value: "<cluster-1-worker-group-id>"
              - name: rootDisk
                value: 0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Container Issues or pull requests relevant for Team 2: Container Infra and Tooling

Projects

Status: Backlog

Development

Successfully merging this pull request may close these issues.

2 participants