Kubernetes on OpenStack

Connect a self-managed Kubernetes cluster to the OpenStack cloud it runs on, so node lifecycle, volumes, load balancers and credentials follow your Keystone model. This page covers the integration method, prerequisites, build sequence, mapping, security, testing and failure points.

On this page

How Kubernetes on OpenStack connects cluster and cloud

The supported method for connecting a Kubernetes cluster on OpenStack virtual machines to the cloud is cloud-provider-openstack, which provides the cloud controller manager and the CSI drivers for block and file storage. Once it is in place, the cluster requests nodes metadata, volumes and load balancers through the OpenStack APIs instead of relying on hand-maintained objects on each VM. The team running the platform still owns the decisions about which components are enabled, which OpenStack projects the cluster may use, and how credentials are issued and rotated. The cloud controller manager keeps Kubernetes node objects aligned with OpenStack compute instances, including addresses, zones and deleted instances. It also reconciles Services of type LoadBalancer into Octavia load balancers. Storage follows a separate path: the Cinder CSI driver provisions block volumes for PersistentVolumeClaims, and the Manila CSI driver covers shared file systems where your Manila back end supports the access modes your workloads need. Confirm which volume types, availability zones and Manila share types your release supports, and check the exact configuration keys in the upstream cloud-provider-openstack documentation for the release you plan to run. Authentication to OpenStack is a different problem from authentication of human users to Kubernetes. The cloud components call Keystone with a credential that must be scoped to the right project and given only the roles they need. Decide early whether to use application credentials or a dedicated service user, how the credential is stored in the cluster, and who can read it. Keystone federation can supply the identities that operators use, but it does not replace the service credential the controllers need. Confirm which Keystone authentication methods your release accepts and how credential rotation is handled without restarting the controllers. Barbican is the OpenStack key manager, and it matters if you plan to protect Kubernetes Secrets with a key held outside the cluster. Kubernetes stores Secrets unencrypted in etcd unless encryption at rest is configured, and an external KMS provider is one way to supply the key. Whether Barbican can serve as that KMS provider for your release, and how its key rotation interacts with etcd backups and restores, must be confirmed before the design is approved. Also confirm the Octavia, Cinder and Manila quotas, endpoint catalog entries and network permissions the components need, and test each integration on a non-production project before production cutover.

What the OpenStack cloud and the cluster must provide first

Kubernetes on OpenStack depends on the cloud for identity, networking, load balancing, storage and secrets, so these needs must be confirmed before the cluster design is fixed. Each card names one component, the decision it affects and what to check in your environment. Start with the list of OpenStack services your cloud actually runs.

Supported release and confirmed services

Plan against a currently maintained OpenStack release. The 2026.1 Gazpacho and 2026.2 Hibiscus releases are the current references, and the 2026.1 deployment guides cover Kolla-Ansible, which deploys OpenStack in Docker containers, and OpenStack-Ansible, which deploys in LXC containers or on bare metal. Confirm which OpenStack services your cloud actually runs, including Octavia, Cinder, Manila and Barbican, because the cluster design depends on each one. Barbican is needed only if you want a KMS plugin for encrypting Secrets.

Keystone endpoint and service account

The cloud controller manager, the CSI drivers and the load balancer automation call OpenStack APIs under an identity, so the cluster needs a reachable Keystone endpoint and a dedicated service account. Scope that account's roles to the single project that hosts the cluster and avoid domain-wide grants. Record which roles each component needs so access can be reviewed later. Confirm that every node can reach the endpoint and that the account can authenticate before installation starts.

Neutron networks and Octavia load balancers

Nodes need Neutron networks and subnets that reach the API endpoint, the image registry and the storage backends. Services of type LoadBalancer need Octavia, which the cloud provider uses to create load balancers for Kubernetes Service objects. Confirm that Octavia is deployed, that the project has enough quota for listeners and members, and that the control plane load balancer on TCP port 6443 can sit on a network reachable from every control plane node. Settle the subnet layout before the first node is created.

Cinder and Manila storage backends

Pod volumes come from the Cinder CSI driver as block volumes, and shared file access comes from Manila for workloads that need read-write access from several pods. Confirm which Cinder volume types exist, which availability zones they serve and whether the backend supports the access modes your workloads require. Manila shares need a file-share backend and a network path from the nodes. Decide early which storage class is the default, because the choice affects every claim that omits a class.

Control plane design and API load balancing

Choose stacked etcd, where etcd runs on the control plane nodes, or external etcd on its own cluster. Either topology needs at least three control plane nodes and a TCP load balancer in front of kube-apiserver on port 6443, as the kubeadm high availability guide describes. etcd should have an odd number of members, and the Kubernetes documentation recommends five members in production. Use server groups with an anti-affinity policy so control plane VMs do not share a hypervisor, and confirm your compute placement supports it.

Certificate trust and private image access

Nodes, the cloud provider and the CSI components must trust the certificate authority that signs each OpenStack endpoint, or they fail on the first API call. Add that CA to the node trust stores and the cloud provider configuration, then test each endpoint from a node before installation. For air-gapped sites, mirror every control plane and add-on image to a private registry, then run kubeadm config images list and point kubeadm init at that registry. Confirm the mirror is refreshed for each patch release you plan to adopt.

Which OpenStack service backs each Kubernetes feature

Each Kubernetes feature that reaches into infrastructure depends on one OpenStack service, and that mapping decides which credentials, quotas and failure domains you must plan before the cluster is built. The cloud controller manager from cloud-provider-openstack registers Kubernetes nodes with Nova instances, reads node metadata such as addresses and zones, and provisions load balancers when a cluster asks for them. Storage, identity and secret encryption are handled by separate services, so a gap in any one of them shows up as a different kind of failure. Start by writing down, for each feature, which OpenStack service it calls and which project and account it uses.

The Container Storage Interface drivers handle persistent storage. The Cinder CSI driver provisions PersistentVolumes from Cinder volumes, which suits block storage for single-attach workloads such as databases. The Manila CSI driver provides shares for workloads that need shared file access. Many operators back Cinder with Ceph, and the Ceph documentation on block devices explains that Ceph can supply Glance images, Cinder volumes and Nova guest disks from one cluster. Confirm with your storage team which Cinder backend, pool and replication settings sit behind each storage class, because those settings govern performance and recovery more than the Kubernetes manifest does.

Octavia serves Services of type LoadBalancer, so every exposed Service may create a load balancer, a listener and a pool in your project. Confirm which Octavia provider and flavors your cloud offers, and set quotas for load balancers and floating IP addresses before teams start creating Services. Keystone authenticates every call the cloud provider makes. Use a dedicated service identity with an application credential scoped to the cluster's project, grant it only the roles the controller manager, CSI drivers and Octavia integration need, and plan how that credential is rotated. Keystone federation governs human access and is a separate decision.

Barbican is the OpenStack key manager and can supply keys for encrypting Kubernetes Secrets at rest. This matters because Kubernetes stores Secrets unencrypted in etcd by default, so encryption must be configured on purpose. Confirm with your OpenStack release and your Kubernetes distribution whether the KMS integration you plan to use supports Barbican, and which key lifecycle controls apply. Decide who can create and rotate the key, where its backup is held, and how you will restore etcd if the key is unavailable. Test a restore, because encrypted etcd snapshots are only useful if the matching key can still be retrieved.

Kubernetes on OpenStack build sequence, step by step

This sequence takes a Kubernetes cluster from confirmed OpenStack service access to a tested platform that uses Cinder, Octavia, Keystone and Barbican through cloud-provider-openstack. Each step ends with a check, so a failed gate stops the build before storage, load balancing or encryption depends on it.

  1. Confirm OpenStack endpoints and service identity

    Confirm that the Keystone service catalog lists working endpoints for Nova, Neutron, Glance, Cinder and Octavia in the target region, then create a dedicated identity for the cluster. Use a Keystone application credential or a service user limited to the roles the cloud provider needs, and record who owns its rotation. Authenticate with that identity from an administration host, list the catalog, and create and delete a test instance and volume. The step is complete when every call succeeds with that identity and none of them require administrator rights.

  2. Build the highly available control plane

    Build the control plane following the kubeadm high availability guide, with at least three control plane nodes and a TCP load balancer in front of kube-apiserver on port 6443. Choose stacked etcd for a smaller footprint or an external etcd cluster for separate lifecycle control. Plan an odd number of etcd members, with five the production recommendation in the Kubernetes documentation. Schedule etcdctl snapshot save backups to a location outside the cluster, and rehearse an etcdutl restore in a scratch environment. Check that every control plane node reports Ready, and that a snapshot restores cleanly in the rehearsal.

  3. Configure cloud-provider-openstack with secured credentials

    Configure cloud-provider-openstack so the cloud controller manager can read instance and zone data from OpenStack. Store the Keystone credentials in a Kubernetes Secret, and limit read access to that Secret with RBAC. Kubernetes stores Secrets unencrypted in etcd by default, so treat this Secret as sensitive until encryption at rest is in place in a later step. Take the exact manifests and configuration keys from the upstream documentation for the Kubernetes release you choose. Check that the controller manager logs show successful authentication to the OpenStack APIs.

  4. Verify node registration, provider IDs and labels

    Join the worker nodes and confirm that each one registers with the cloud provider, receives a provider ID, and carries the zone and region labels that scheduling and storage rules depend on. Confirm that kubelet versions fall within the version skew policy, which allows kubelets to be up to three minor versions older than kube-apiserver. Also confirm that node names match the instance names in OpenStack, so support staff can trace a node to its virtual machine. Check the output of kubectl get nodes with wide output and describe for a sample of nodes. Every node should show a provider ID and the expected labels before you move on.

  5. Install Cinder CSI and test PVC binding

    Install the Cinder CSI driver, then create a StorageClass that points to a Cinder volume type your cloud operator has approved. Create a test PersistentVolumeClaim, attach it to a pod, write a file, and confirm the data survives a pod restart. If workloads need shared file storage with ReadWriteMany access, confirm the Manila service, share types and network access with your cloud operator, then add the Manila CSI driver as a separate step. Check that the claim reaches Bound, the data reads back correctly, and the Cinder volume is cleaned up in OpenStack after deletion, as your reclaim policy dictates.

  6. Verify Octavia load balancers from a test Service

    Create a test Service of type LoadBalancer and confirm that cloud-provider-openstack provisions an Octavia load balancer with a listener, a pool and healthy member nodes. Send a request to the external address and confirm the response comes from the test pod. Then delete the Service and confirm that the load balancer and its associated resources are released in OpenStack. Ask your cloud operator in advance about floating IP quotas, provider network choice and load balancer capacity, because these limits often surface at this step. The check passes when the load balancer shows an active status, the health monitor passes, and deletion leaves no orphaned resources.

  7. Enable Barbican-backed encryption at rest

    If your policy requires encryption of Secrets at rest, configure an encryption provider for etcd that uses a key management service. Barbican can serve as the key store, but confirm the supported integration path and configuration keys for your Kubernetes release in the upstream documentation before you commit to it. Define who owns the keys, how they rotate, and how key material is protected in backups, since losing the key can make encrypted data unrecoverable. Check that a newly created Secret is stored in encrypted form in etcd, that existing Secrets are re-encrypted, and that a restore test succeeds with the keys available.

  8. Run upgrade and failure drills before handover

    Before the platform goes into service, run the drills that will matter in production. Test loss of a control plane node, loss of an etcd member, a restore from snapshot, and draining a worker that hosts volumes. Rehearse one minor version upgrade, applying the version skew policy: kube-apiserver first and only one minor version at a time, then kube-controller-manager, kube-scheduler and the kubelets. Align the OpenStack upgrade plan with the cluster plan, so both platforms move in a supported order. The step is complete when each drill has a recorded result, the runbook reflects what you learned, and the application stays available throughout.

How Keystone identities and OpenStack resources map to Kubernetes

This table compares each OpenStack identity or resource with the Kubernetes object or setting that consumes it in a cloud provider integration. The OpenStack side shows what you create or grant, the Kubernetes side shows what the cluster sees, and the last column lists what to verify for your release. Most integration failures start on the OpenStack side, with a missing role, an unmatched name or an unset option.

MappingOpenStack sideKubernetes sideWhat to confirm
Keystone projectProject that owns the cluster's compute, network and storage resourcesCloud scope in the provider configuration that the controllers queryProject ID or name in the config matches where the nodes run
Service user or application credentialIdentity the provider authenticates as to KeystoneCredentials held in the cloud provider configuration secretSupported credential types, expiry and rotation process for your Keystone version
Keystone rolesRole assignments on the project that grant API accessPermissions the cloud controller and CSI components need in OpenStackMinimum role set for each component in the upstream cloud-provider-openstack docs
Nova instancesVirtual machines booted in the projectKubernetes Nodes, with providerID set from the instance identityproviderID format and node name handling for your provider version
Cinder volume typesBlock storage backends offered to the projectStorageClass parameters that select the volume type for the Cinder CSI driverExact parameter keys, volume binding and reclaim behavior in the Cinder CSI docs
Manila share typesFile share backends and the protocols each one offersFile StorageClasses that reference a share type through CSI parametersShare type names, protocol support and the Manila CSI driver release
Octavia flavors or providerLoad balancer provider and optional flavor available to the projectService annotations that select provider, flavor or subnet for type LoadBalancerAnnotation names, supported options and the Octavia provider enabled in your cloud
Barbican secretsSecret store holding the key material used for encryptionEncryption provider configuration for Secrets encryption at rest in etcdBarbican-backed KMS plugin version and its support status in your release

Design decisions to settle before the build starts

The first decision is where etcd runs. The kubeadm high availability guide describes a stacked topology, where etcd members share nodes with the control plane, and an external topology, where etcd runs on its own cluster. Stacked control planes need fewer machines and fewer handoffs, which suits one team that owns both layers. External etcd suits larger estates or cases where a separate team operates the data store and its backups. Either way, etcd needs an odd number of members, and Kubernetes documentation recommends five members in production. Confirm with your platform team which OpenStack instances, placement rules and volume types the five members will use, because an etcd member on a slow Cinder volume can degrade the whole control plane.

Storage decisions shape the CSI configuration more than any other single setting. Storage classes in the cluster reference Cinder volume types, so each volume type you expose becomes a choice that developers will make, usually without reading the backend notes. List the volume types before the build, record which backend and performance characteristics sit behind each one, and retire any type you do not intend to support. If your OpenStack deployment uses Ceph, Ceph block devices can back Cinder volumes, so pool design and failure domains sit underneath every volume type. Manila is needed only when pods must share a filesystem across replicas. Ask application owners which workloads write to a common path from several pods before you deploy Manila, and plan its backup and capacity separately.

Tenancy comes next. A single OpenStack project for the cluster is simpler to bootstrap and gives one set of quotas, but every cluster, load balancer and volume then draws from one pool of capacity and one set of role assignments. Multi-project designs separate production from non-production and make ownership clearer, but they make quota design explicit. Each project needs compute, network, volume, load balancer and security group quotas sized for autoscaling and for the extra nodes a rolling upgrade temporarily requires. Octavia load balancers and Cinder volumes consume quota as Kubernetes creates Services and PersistentVolumeClaims, so a quota that fits day one may block the next upgrade. Ask your OpenStack administrators to confirm quotas in writing and to name who approves increases.

The upgrade plan has to track two release trains. Kubernetes releases about three times a year on a cycle of roughly 14 weeks, and the project maintains the three most recent minor releases. The version skew policy requires kube-apiserver to move one minor version at a time, ahead of kube-controller-manager, kube-scheduler and kubelets, and allows kubelets to be up to three minor versions older than kube-apiserver. That gives you room to stage node upgrades, but it is not a reason to fall behind. OpenStack supports upgrades between SLURP releases as well as between adjacent releases. The 2026.1 Gazpacho and 2025.1 Epoxy releases are SLURP releases, and 2027.1 Indri is also SLURP and in development. Map each Kubernetes minor version you plan to run against the OpenStack release beneath it, and confirm the cloud provider and CSI versions that release train supports.

Hardening Keystone credentials, KMS and storage access

Each control below narrows what a compromised workload, node or operator account can reach in the OpenStack cloud. Start with credentials and secrets, then tighten workloads, node network paths and audit evidence. Run a CIS Kubernetes Benchmark assessment as part of the hardening step, using the benchmark as a consensus configuration guide and recording each deviation with its reason.

Secrets and restricted RBAC

Cloud credentials used by the cloud controller manager, the Cinder and Manila CSI drivers and Octavia are stored as Kubernetes Secrets, usually in kube-system or a dedicated namespace. Secrets are stored unencrypted in etcd by default, so access control is the first barrier. Grant get on named Secrets only, and treat list and watch with care, because both return Secret contents. Verify each service account's permissions with kubectl auth can-i before go-live.

Scoped application credentials

Give cloud integration components Keystone application credentials limited to the projects they manage, and keep administrator accounts out of cluster Secrets. Application credentials can carry a subset of roles and an expiry date, which makes rotation a planned event. Ask your Keystone administrators which roles the cloud provider, CSI drivers and load balancer components need in each project, and record that list as part of the design.

Encryption at rest with Barbican

Enable encryption at rest for Secrets through the kube-apiserver encryption configuration, selecting a key provider that holds the key outside etcd. Barbican is a candidate key source where your OpenStack cloud provides it, which places key custody in the cloud key service. Confirm with your distribution and cloud provider documentation that the key provider integration is supported in your versions. Plan key rotation and a documented recovery path, since lost key material makes encrypted Secrets unreadable.

Pod Security Standards per namespace

Pod Security Standards define the Privileged, Baseline and Restricted profiles, enforced per namespace by Pod Security Admission. Label each namespace that runs workloads with at least the Baseline profile, and Restricted where the images support non-root execution and dropped capabilities. Start with warn and audit labels to see which pods would fail, then move to enforce. Document the namespaces that need a looser profile for their controllers, such as kube-system.

Node reach to projects and networks

Nodes need network access to the Keystone endpoint, the Cinder, Manila and Octavia APIs and the subnets used by load balancers. Other project networks should be unreachable from a node. Scope the node's OpenStack credentials and security group rules to the endpoints and subnets the cluster uses. Confirm the provider network and security group rules that the cloud controller manager and Octavia require, then test from a debug pod that other tenant networks cannot be reached.

Audit logs and certificate lifecycle

Plan a kube-apiserver audit policy and retention period so authentication, RBAC changes and Secret access events leave the cluster. Enable the logging your Keystone and OpenStack service APIs provide, and forward both sets of events to the same store. Inventory every certificate for the API server, etcd, kubelets and OpenStack HTTPS endpoints, record expiry dates, and assign an owner and renewal procedure before go-live.

How to test the integration end to end

An end-to-end test plan for Kubernetes on OpenStack should exercise every point where the cluster calls OpenStack, and each test needs a stated expected result before it runs. Run the plan in a test project that mirrors production networks, flavors, security groups and the cloud provider configuration, so that results carry over. Start with node lifecycle. Replace one worker VM through the Nova API, then confirm that the cloud controller manager registers the new Node object, applies the expected labels and removes the stale Node after the old instance is deleted. Repeat the check for a control plane node if your topology allows it, since losing etcd membership is a different failure from losing a worker.

Storage tests come next. Create a PersistentVolumeClaim backed by the Cinder CSI driver, mount it in a pod, and drain the node that holds the pod. Confirm that the volume detaches from the old instance in OpenStack, reattaches to the replacement node and remains readable with the same data. If you use Manila for shared file systems, mount the same share from two pods scheduled on different nodes, write from one and read from the other, and verify the access rules and mount options match what your storage team approved. Record any delay between drain and reattachment, because it becomes the basis for your recovery expectations.

Service tests cover Octavia. Create a Service of type LoadBalancer, confirm that the load balancer, listeners, pools and health monitor appear in OpenStack, and send traffic through the external address. Then delete the Service and check that every related Octavia object and any floating IP is removed, because orphaned load balancers keep consuming quota and can expose stale endpoints. For credential rotation, rotate the Keystone credential that the cloud provider uses, update the cloud configuration secret, and confirm that existing workloads keep serving traffic while new volume and load balancer operations succeed. Confirm the exact rotation steps with the release documentation for your provider version before you schedule the test.

Two tests protect recovery. Take an etcd snapshot with etcdctl snapshot save, restore it into an isolated environment with etcdutl, and verify that workloads, Services and Secrets are present. Secrets are readable only if the encryption key is still available, so confirm that the Barbican-backed KMS plugin can reach its key in the restore environment. For the upgrade rehearsal, check the version skew policy and the cloud provider's compatibility notes for the target Kubernetes minor version. Upgrade kube-apiserver first, then the controller manager, scheduler and kubelets in the order the policy requires, and rerun the node, storage and load balancer tests afterward.

Write acceptance criteria into the scope before any work starts, including the expected result, the owner and the pass or fail rule for each test. Keep the evidence for every run: command output, controller logs, OpenStack API records, configuration versions and timestamps. This evidence supports compliance readiness work, since assessors will ask how access, encryption and recovery were verified. DeployOpen prepares these systems and records, but independent auditors and certification bodies decide whether controls meet a framework's requirements.

Common failures when Kubernetes meets OpenStack APIs

This table lists the failures teams most often hit when cloud-provider-openstack, Cinder and Octavia integrations run against Kubernetes. Each row gives the likely cause, the first place to look and the fix, so you can triage quickly. Treat every fix as a starting point and confirm it against the upstream release notes for your exact Kubernetes and provider versions before changing production.

FailureLikely causeFix direction
Nodes stuck NotReady or without providerIDThe cloud controller manager cannot authenticate to Keystone or cannot reach the endpoint, often because the CA bundle is missing or untrustedCheck controller logs for authentication and TLS errors, correct the application credential or trust store, and confirm the endpoint certificate chain is installed where the controller runs
PersistentVolumeClaims stay PendingCinder project quota is exhausted, the StorageClass names a volume type that does not exist in the target region, or the CSI driver version does not match the clusterCompare quota usage with the claim size, verify the volume type with the cloud administrator, and align the CSI driver release with the Kubernetes minor version listed in the upstream compatibility matrix
LoadBalancer Services stuck in pendingOctavia quota is reached, the Service points to the wrong network or subnet, or security group rules block the health check or listener trafficReview Octavia quota, set the subnet or network annotation explicitly where the cluster has several, and confirm security group rules allow the listener port and node health check traffic
Provider stops working after credential expiryApplication credentials or service account passwords expire or are rotated without updating the cluster secret used by the providerTrack credential expiry dates, rotate the secret used by the cloud controller and CSI components together, and restart affected controllers so they reload the new value
Load balancer health checks fail after an upgradeChanged Octavia defaults, new health monitor settings or security group changes made during the cluster upgrade, or a provider release that handles node addresses differentlyCompare health monitor settings and security groups before and after the upgrade, pin the health monitor configuration in Service annotations where needed, and read the provider release notes for the target version
Barbican encryption keys unavailable when the API server startsThe API server is configured to use a KMS plugin backed by Barbican, and the key or the Barbican endpoint is not reachable at boot timeConfirm the key exists and the KMS plugin's Keystone credentials are valid, make sure Barbican is up before the control plane restarts, and test a restart in a non-production cluster first
Provider and CSI versions drift from KubernetesUpgrades of the Kubernetes control plane or nodes proceed without matching upgrades of the cloud provider and CSI components, so APIs and flags no longer line upMaintain a version matrix for Kubernetes, cloud-provider-openstack and the Cinder and Manila CSI drivers, upgrade one minor version at a time, and confirm each pairing in the upstream release notes and the Kubernetes version skew policy

Questions teams ask before running Kubernetes on OpenStack

What drives the cost of running Kubernetes on OpenStack?

Cost follows scope more than any single component. The main drivers are the number of clusters, the storage backends (Cinder volumes, Manila shares or Ceph-backed block storage), whether Octavia load balancers serve cluster services, whether Barbican provides key management for Secrets encryption, and the high availability design. A kubeadm highly available control plane needs at least three control plane nodes and a TCP load balancer in front of kube-apiserver on port 6443, and an external etcd cluster adds its own members. Upgrade cadence also matters, since Kubernetes ships about three minor releases a year. Existing OpenStack maturity affects effort most: a well-run cloud on a current release with clear quotas shortens discovery. Ask for a quote that itemizes each driver so you can change one without rewriting the whole plan.

How long does a Kubernetes on OpenStack project take?

No duration is given here, because the timeline depends on the scope in the written quote. A single cluster on a healthy, current cloud is a different job from several clusters with multiple storage backends, key management integration and highly available etcd. Fixed-scope engagements agree scope, deliverables and timelines in writing before work starts, so ask for the schedule as milestones with the client dependencies named. Those dependencies usually include access approval, network changes and change windows, and they often set the calendar more than the build itself. Ask the partner which milestones depend on your inputs, and what acceptance tests close each milestone.

What does the client need to provide for this engagement?

The client provides access, decisions and an accountable owner. Typically this means OpenStack administrator access or dedicated service accounts scoped to the projects that will host clusters, with credentials handled under your own policy. Network decisions cover addressing, routing, security groups and how the API endpoint and load balancers are exposed. DNS decisions cover cluster and service names and who controls the zones. You also need agreed change windows for control plane work, because upgrades and etcd restores touch every workload. Finally, name one owner for the cloud who can approve changes to quotas, images and storage, and who answers design questions that have no obvious answer. Without that owner, decisions tend to wait.

Can our own team run Kubernetes on OpenStack without a partner?

Yes, a capable platform team can do it alone, using the upstream documentation and a lab that mirrors your OpenStack release, networks and storage. The kubeadm high availability guide and the cloud provider documentation cover the build steps, and the Kubernetes authentication and Secrets guidance cover identity and encryption. The usual gap is OpenStack operations depth: diagnosing Neutron networking, Octavia listener behavior, Cinder or Ceph performance and Keystone authentication failures under load. If that depth is thin, a partner can carry the design and build while your team learns to operate the platform. Decide early who will run the clusters after handover, and have that person work in the lab before go-live.

How do fixed-scope projects and upgrade retainers differ?

A fixed-scope engagement buys a defined outcome, such as built, hardened and documented clusters on your OpenStack, with scope, deliverables and timelines agreed in writing before work starts. A retainer buys ongoing capacity for support, Kubernetes and OpenStack upgrades and continuous testing, and it is billed as a recurring arrangement separate from any one project. The decision turns on who does the work after go-live. Kubernetes ships about three minor releases a year, and the version skew policy requires kube-apiserver to move one minor version at a time, so upgrades recur. Many teams run the build as fixed-scope and add a retainer for upgrades. Ask each quote to state what ends at acceptance and what continues afterward.

Which OpenStack release should we target for Kubernetes?

Build against an OpenStack release your cloud already runs, and prefer a SLURP release as the long-term base. According to the OpenStack releases site, 2026.1 Gazpacho is a SLURP release that came out on 2026-04-01, and 2026.2 Hibiscus followed on 2026-09-30. 2025.1 Epoxy and 2025.2 Flamingo remain in the maintained phase. Stable branches are maintained for roughly 18 months, and afterward only SLURP releases may enter an unmaintained phase before end of life, so plan upgrades between SLURP releases where you can. Before setting a target, confirm your current release, which cloud-provider-openstack version matches it, and whether your load balancer and storage services are on supported releases.

How should we protect Secrets and etcd in this design?

Encrypt Secrets at rest and back up etcd before go-live. Kubernetes stores Secrets unencrypted in etcd by default, so configure encryption at rest for the API server and restrict list and watch access with least-privilege RBAC. If key management runs through Barbican, confirm the key provider configuration and key rotation process against the cloud-provider-openstack and Kubernetes documentation for your versions. For etcd, the Kubernetes documentation calls for an odd number of members, recommends five members in production and requires a backup plan. Take snapshots with etcdctl snapshot save and restore with etcdutl. Until a backup has been restored in the lab, treat it as unverified, so schedule restore drills and record the results.

How DeployOpen scopes and supports Kubernetes on OpenStack

DeployOpen plans, implements, hardens and supports self-hosted open-source platforms inside your own infrastructure, including the OpenStack cloud and the Kubernetes cluster that runs on it. The work starts with a written scope that names each integration, from the cloud controller manager to Barbican KMS, before any build begins. Engagements are fixed-scope, and ongoing support is available as a retainer.

How we scope

  • The written scope names each integration in use: cloud controller manager, Cinder or Manila CSI, Octavia, Keystone and Barbican.
  • We record the target OpenStack release, Kubernetes version and control plane topology, including stacked or external etcd.
  • Scope also states who confirms the cloud account, network, project quotas and storage backend before build.

How we build

  • Existing OpenStack services and identity are verified first, then control plane and cluster build, then cloud integrations and storage.
  • etcd runs as an odd-numbered quorum, and backups are proven with a test restore using etcdutl.
  • Credentials and secrets are configured for encryption at rest and least-privilege RBAC before any workload is deployed.

How we hand over

  • Handover includes configuration as code, cluster runbooks, storage class and load balancer notes for your team.
  • Test evidence covers cluster upgrade rehearsal, etcd restore results and the Pod Security Standards each namespace enforces.
  • Knowledge transfer sessions walk your engineers through the OpenStack and Kubernetes integration decisions, with the reasons recorded.

How we support

  • Ongoing support can run as a retainer covering Kubernetes patching, OpenStack release tracking and integration checks.
  • Upgrade plans follow the Kubernetes version skew policy and the OpenStack upgrade path between adjacent or SLURP releases.
  • Changes to the OpenStack cloud or Kubernetes cluster are tested in a staging environment agreed in the scope before production.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.