OpenKeel: the sovereign French Cloud solution of the inherent group, with a European reach Discover inherent

Deployment

okadm: plug-and-play deployment

An OpenKeel production or lab cluster in one command.

Start with a lab

With no cluster configured, okadm offers to create a kind cluster. With --ingress, the Skyline console is served at skyline.127.0.0.1.nip.io. With --demo, it also creates the domain and project demo, ready to explore: a network and its router, a VM behind a load balancer, a container, floating IPs, and sample rated data when CloudKitty is installed.

okadm plan    --mode lab
okadm install --mode lab --create-kind --ingress --demo
export OS_CLOUD=openkeel
ok server list

ok and okadm: two commands, two jobs

ok: the OpenStack client

  • The commands of python-openstackclient 10.3.1 and its plugins
  • Same arguments, output formats, error messages and exit codes
  • Reads clouds.yaml, OS_* and --os-* like the original
export OS_CLOUD=openkeel
ok server list
ok loadbalancer create ...

okadm: the life cycle

  • plan, install, upgrade, status, uninstall
  • client-go and the Helm SDK built in: neither kubectl nor helm needed
  • Embedded release manifest, component-by-component upgrade
okadm plan --mode lab
okadm install --mode lab \
  --create-kind --ingress --demo

okadm install: the parameters

The flags of okadm install and their role. okadm upgrade takes the same ones for what it does (version, components, values, --grafana, --ingress); the cluster is chosen like kubectl does (--kubeconfig, $KUBECONFIG, --context, in-cluster account).

ParameterDefaultRole
--modeproductionproduction (3 nodes or more, role labels, three replicas, autoscaling) or lab (one node or more, one replica, small volumes, fallback backends)
--versionlatest of the manifestOpenKeel version to install (okadm versions lists them)
--componentsall but the optional onesComponents to install, their dependencies added (nova brings Keystone, Placement, Glance, Neutron, Cinder); optional: Ironic, ovn-bgp-agent, CloudKitty, Magnum, and Designate in production
--no-configurator—Leaves out openkeel-configurator, otherwise installed with OpenKeel in both modes
--domainlab: openkeel.example.comPublic DNS domain of the APIs and the console; required in production
--storage-classproduction: longhorn; lab: the cluster defaultBlock StorageClass of the databases and volumes
-f, --values—Values file, repeatable (umbrella layout, one section per component): wins over every default
--create-kind—Lab without a cluster: creates the kind cluster openkeel without asking (--kind-name to rename it)
--install-prerequisiteson when okadm creates the cluster, and in productionInstalls the operators the cluster lacks; =false only checks them
--ingress—Publishes the APIs and the Skyline console: lab, Traefik on 127.0.0.1:80/443 and *.127.0.0.1.nip.io (--ingress-http-port, --ingress-https-port, --ingress-listen-address); production, the cluster's IngressClass (--ingress-class), Traefik installed when there is none
--grafana—Observability stack: Prometheus Operator, Loki, Alloy, Grafana and the OpenKeel dashboards; kept by later runs
--ceph-s3—Rook, a Ceph cluster and its RGW gateway (S3 and Swift APIs) authenticated by Keystone
--demo—Creates the domain and project demo with a VM, a load balancer and a container (below); --demo-external-network (default public) names the network of its router and floating IPs
--no-default-flavors, --no-default-share-type—Skip the flavors m1.tiny to m1.xlarge and Manila's share type default
--no-base-image, --no-public-network—Lab: skip the Alpine image in Glance and the shared external network public (203.0.113.0/24)
--timeout15mHow long each step may wait for readiness
--dry-run—Prints the steps and renders every chart, changes nothing
--progressautolive (the running step redrawn with its state) or plain (a line every 30 s, for CI)
--chartthe chart built into okadmLocal umbrella chart, to test a chart change without rebuilding okadm

okadm plan runs the same checks without writing anything; okadm status, okadm access (URLs, accounts, port-forwards), okadm upgrade and okadm uninstall follow the installation.

okadm install: the steps

Each step is idempotent: running okadm install again changes nothing when everything is in place, and resumes an interrupted install.

  1. 1

    okadm plan

    Checks the Kubernetes version, nodes, operators, StorageClass; prints the command that fixes each gap

  2. 2

    kind cluster

    In a lab without a cluster: created through the kind library, ports 80 and 443 with --ingress

  3. 3

    Operators

    Installs the missing prerequisites, waits for CRDs and Deployments

  4. 4

    Helm charts

    Embedded umbrella chart, split: openkeel-infra then one release per component

  5. 5

    Data

    MariaDB Galera in TLS, RabbitMQ and vhost; database, accounts and secrets per component; the internal CA and certificates

  6. 6

    Components

    openkeel-* releases in dependency order, schema migrations

  7. 7

    Flavors and image

    m1.tiny to m1.xlarge; Alpine 3.24 cloud-init image in Glance

  8. 8

    Access

    Skyline console URL, Keystone, admin account, exported clouds.yaml

What okadm builds, in production and in a lab

The automated steps of okadm install, in order. Each waits for what it creates (CRDs Established, Deployments Available, Helm releases and their migration Jobs) and is unchanged when the cluster already matches.

StepProductionLab
ClusterThe existing cluster: 3 Ready nodes or more, hardened role labels (control plane, compute, containers, network, storage), zones checkedCreated with the kind library when there is none (--create-kind): one node, kindnet, local-path; with --ingress, ports 80 and 443 forwarded; the OpenKeel images of the local container engine loaded into the node
OperatorsInstalled when missing: cert-manager, MariaDB and RabbitMQ operators, KubeVirt and CDI (no emulation), metrics-server (kubelet certificates verified), Traefik behind a LoadBalancer when no IngressClass is usableThe same, plus PowerDNS and ExternalDNS; KubeVirt emulates without /dev/kvm; metrics-server with --kubelet-insecure-tls; Traefik on hostPorts
Namespace, Multus, CRDsNamespace openkeel (Pod Security baseline enforced, restricted warned), Multus thick plugin, CRDs OpenKeelTenant and OpenKeelCustomerThe same, plus the openkeel-ovn placeholder attachment (the lab has no Kube-OVN)
Observability (--grafana)Prometheus Operator, Loki on S3, Alloy, Grafana, before the data services whose monitors need their CRDsThe same stack with one replica each
Data servicesopenkeel-infra: MariaDB Galera and RabbitMQ in TLS (chart sizes, 3 replicas), a database, accounts and secrets per component, the internal CA; RabbitMQ's topology operator made to trust it; every object waited for ReadyOne replica, MariaDB 5 GiB, RabbitMQ 2 GiB; the lab's NetworkPolicy fixes for kindnet
Platform glue—CDI StorageProfile for local-path, CDI upload proxy CA for Glance, OVN Northbound and Southbound databases (ovn-central) for Neutron
ComponentsOne Helm release per component, in dependency order, chart defaults (3 replicas, autoscaling), node placement by role labels; openkeel-configuratorEvery replica at 1, no autoscaling, volumes ReadWriteOnce at most 5 GiB, fallback backends (Manila dummy driver, Zun on runc without Kata, Nova emulated)
Catalog contentFlavors m1.tiny to m1.xlarge; Manila share type defaultThe same, plus the Alpine 3.24.3 cloud-init image (checked with SHA-512) and the shared external network public (203.0.113.0/24)
Object storage (--ceph-s3)Rook, Ceph and RGW (S3 and Swift) authenticated by Keystone: 3 monitors, pools replicated 3 times across hosts, 2 gatewaysThe same with one monitor, one replica and one gateway, the OSD on a loop device of the kind node
Publishing (--ingress)Ingresses of the APIs on the cluster's IngressClass, <service>.<domain>Traefik, skyline.127.0.0.1.nip.io and the APIs on *.127.0.0.1.nip.io
Demo (--demo)The demo project on the external network given by --demo-external-networkThe demo project on public; with CloudKitty, sample rated data
SummaryEvery step done, unchanged or failed with its cause; target, mode and components recorded in the ConfigMap openkeel-okadm-state; an interrupted run resumes where it stoppedThe same

Operators and prerequisites

Installed by okadm in a lab; in production, okadm plan checks them and prints the command for the tested version.

  • cert-managerv1.21.3
  • MariaDB operator26.10.2
  • RabbitMQ cluster operatorv2.23.2
  • Messaging topology operatorv1.20.5
  • metrics-serverv0.9.0
  • Multus CNI (thick)v4.3.1
  • KubeVirtv1.9.1
  • CDIv1.66.1
  • Traefik (--ingress)chart 41.7.1

Production: checked by okadm plan

  • Kube-OVN ≥ 1.16
  • Longhorn (block CSI and RWX)
  • Medik8s ≥ 0.12
  • Rook-Ceph for S3 and Swift
  • KubeVirt ≥ 1.9, CDI ≥ 1.66
  • MariaDB and RabbitMQ operators
  • cert-manager ≥ 1.16 (internal PKI)

After the install: ready to test

Flavors created by default (hw_rng:allowed and resources:DISK_GB=0, root disks are PVCs) and an Alpine 3.24.3 cloud-init image registered in Glance, checked with SHA-512.

NamevCPURAMDisk
m1.tiny1512 MB1 GB
m1.small12 GB20 GB
m1.medium24 GB40 GB
m1.large48 GB80 GB
m1.xlarge816 GB160 GB

Console: skyline.127.0.0.1.nip.io with --ingress, otherwise kubectl port-forward svc/openkeel-skyline-api 9998. Account admin, project admin, domain Default; password in the openkeel-keystone-admin secret.

The demo mode: okadm install --demo

--demo ends the install with a complete project to explore in Skyline and with the CLIs. It needs Keystone, Glance, Cinder, Neutron, ovn-octavia-provider, Nova and Zun; what already exists under its name is kept, so running it again completes an interrupted demo.

ResourceWhat okadm creates
Domain demoThrough the OpenKeelCustomer demo (reconciled by keystone-customers): the domain, its manager and the project
User demoManager of the domain and of the project, with the password of the user admin (secret openkeel-keystone-admin); admin gets the admin role in the project
Project demoIts default security group opens ICMP, SSH and HTTP
Networkdemo-net and demo-subnet (192.168.0.0/24, DHCP), router demo-router to the external network
VM demo-vmFlavor m1.tiny, the Alpine base image, a 20 GB data volume demo-vm-data, user alpine (password alpine) made by cloud-init for the console and SSH, a floating IP
Load balancer demo-lbOVN load balancer, TCP 80, the VM as member, a floating IP on its VIP
Container nginxZun container with a 1 GB volume on /data
Rated data (with CloudKitty)One frame per day from the first day of last month to yesterday, a VM deleted last month, floating IPs, the image: Skyline's FinOps / GreenOps page shows both months; then the project is rated every hour

In a lab, floating IPs come from TEST-NET-3 (203.0.113.0/24), documentation addresses never routed, and the lab's OVN has no data plane: the VM boots (emulated) and its console works, but nothing can reach it over the network.