Deployment options phase 4: containers¶
Master plan: PLAN-deployment-options.md.
Planning effort¶
The master plan asks for medium effort. This plan was written in a low-effort session, below that. The survey checked every claim below against this tree, Kolla's source and the image registry on the day, so it was not cut short, but the review should be done at medium. Review effort: medium. The page is short and mostly says what does not exist. The claims about Kolla's images are the ones a reader can act on wrongly.
Scope¶
In scope:
docs/deployment/containers.md, the third page in the section, and its entry indocs/deployment/order.yml. Master plan question 4 settled on one short page.- Correcting what this repository says about Kolla's Kerbside
images, wherever it says it (finding 1). That covers the master
plan,
docs/deployment/kolla-ansible.md, and the index row. - Making the Containers row of the
docs/index.mdDeployment Options table a link. - One comment on #553, the image issue, recording what the survey found (step 4b).
Out of scope:
- Publishing an image, a production compose file, or a Helm chart. These are #553 and the master plan's Future work. This phase documents their absence and does not fill it (decision 2).
- Changing
demo/. It isPLAN-demo-install.md's, which is complete. Its walkthrough ininstallation.mdis linked, not restated. installation.md's "Deploying for real" table. Phase 6 owns it.
What the survey found¶
Checked on 2026-10-28. The master plan's claims that were wrong are corrected at source in this phase's planning commit, as noted under each finding. A step does not need to redo them.
- Kolla publishes Kerbside images, built from
develop. - quay.io's
openstack.kollaorganisation haskerbside-apiandkerbside-proxy. Each carries twelve tags:masterand2026.2, fordebian-trixie,rocky-10andubuntu-noble, each also as-aarch64.master-debian-trixiewas last pushed on 2026-10-28. - Kolla master's
kolla/common/sources.yaml:111-114buildskerbside-basefrom git athttps://github.com/shakenfist/kerbside, referencedevelop. So these images carry whatever Kerbside'sdevelopheld when Kolla last built, not a release. Kerbside's own install advice is to take a tagged release (installation.md"Installing with pip"). - The images
(
kolla/docker/kerbside/kerbside-{base,api,proxy}/Dockerfile.j2) are thin. Each is Kolla'sopenstack-basewith akerbsideuser and Kerbside pip-installed. Each runs askerbside. Each starts through Kolla'skolla_start, which reads aconfig.jsonthat a Kolla-Ansible role normally writes. The images hold no Kerbside configuration and no entrypoint of Kerbside's own. -
The master plan's inventory says "Kolla's image is the only published Kerbside image, and it is built around Kolla's
config.jsonandkolla_startconventions". #553's body adds that it "is not usable outside a Kolla deployment". The first is true but misses where the image is published and what it contains. The second is stronger than the code supports: the image can start with a hand-writtenconfig.json, but nothing designs it for that and nothing tests it. The master plan's inventory row is corrected. #553 is step 4b's. -
docs/deployment/kolla-ansible.mdoverstates what has to be built. Its line 16 says "images built from kerbside-patches", and its "What it leaves to you" (around line 75) says images are left to the operator, with kerbside-patches holding the build scripts. Kolla publisheskerbside-apiandkerbside-proxyitself (finding 1). The image the role also needs,nova-libvirt-spice, is in Kolla master (kolla/docker/nova/nova-libvirt-spice/) but is not on quay.io: its repository query is refused, wherenova-libvirt's succeeds. So "build your own" is true of libvirt and not of Kerbside. Step 4a corrects the page. The master plan needs no change here. -
demo/is already candid about why it is not production.installation.md's "What the demo is not" (line 343) lists the shortcuts: no real authentication, a self-signed CA, loopback only, two processes in one container, a plaintext backend leg, and a static source.demo/README.md"Things worth knowing" and the comments indemo/Dockerfile,demo/docker-compose.ymlanddemo/entrypoint.shgive the reasons. What none of them says is what a production-shaped container deployment would do instead. The page adds that, and links the list rather than restating it (decision 3). The things a production compose would have to settle that the demo does not are: - The image. The demo builds one at
docker compose build, from PyPI, with build dependencies left in. Its comments give the reason:mysqlclienthas no wheel. - The split. The daemon and the Rust proxy it launches share
API_SOCKET_PATH, so they share a container. The API reaches the daemon only through the database, so it can run anywhere. - Configuration and secrets. These arrive as
KERBSIDE_*environment variables, askerbside.iniand assources.yaml. -
The certificate lifecycle. The demo's certificates last 30 days, and the demo regenerates them inside the container.
-
Nothing exists for Kubernetes. There is no chart, manifest or operator anywhere in the tree, and no mention of Kubernetes or Helm in
docs/outside the plans and the index row. -
The
demo-composelane is as the index says: advisory, on push and pull requests, path-filtered (.github/workflows/demo-compose.yml;docs/testing.md:97). Its run builds withKERBSIDE_SOURCE=/src. The PyPI default the demo documents is not run by any lane, anddocker-compose.ymlsays so itself. -
Scaffolding is ready.
docs/deployment/order.ymlhas two entries, and the TLS claim guard scansdocs/deployment/*.md.
Decisions¶
-
One short page with the standard four headings. "Who this is for" answers the Kubernetes and compose question directly in its first paragraph: there is no first-party image (#553), no production compose file, and nothing for Kubernetes. "What it deploys" covers the two things that do exist, the demo stack and Kolla's published images, and says plainly what each is for.
-
No production compose file, even as an example. A compose file needs an image to name. The only candidates are the demo's locally built one, which its own comments say is not for production, and Kolla's, which are built from
developand started bykolla_start. An example built on either would be a second, untested deployment mechanism with a page vouching for it. The page says what such a file would have to settle (finding 3), and #553 is where the file belongs once an image exists. This is the decision a reviewer is most likely to dispute, because a sketch is cheap to write and operators ask for one. -
Link the demo's limitations, do not restate them.
installation.md's "What the demo is not" is the list, anddemo/README.mdgives the reasons. The page adds only the four things in finding 3 that neither says. For the processes, the settings and the certificates, it linksinstallation.md's "What a running Kerbside needs" andmanual.md, as phase 2 decided for the by-hand page. -
Kolla's images are described accurately and not recommended outside Kolla. The page says where they are published, that they are built from Kerbside's
develop, how they start, and that nothing runs them outside Kolla-Ansible. It gives no recipe for running them standalone. The step verifies thekolla_startandconfig.jsonclaims against Kolla's source, and whether Kolla's 2026.2 branch also builds fromdevelop, rather than inferring either. -
kolla-ansible.mdgets the image correction in the same step, because it is the same fact on a neighbouring page (finding 2). That is a sentence or two on line 16 and in "What it leaves to you", and nothing else on that page changes. -
docs/index.md: the Containers row becomes a link, and its description gains no new claims. The page carries the detail.
Step plan¶
| Step | Effort | Model | Isolation | Brief for sub-agent |
|---|---|---|---|---|
| 4a | medium | opus | none | Write docs/deployment/containers.md, add - containers.md: Containers to docs/deployment/order.yml after kolla-ansible.md, correct docs/deployment/kolla-ansible.md's image claims, and make docs/index.md's Containers row a link. Read first: this plan (all of it), docs/deployment/manual.md and docs/deployment/kolla-ansible.md (form and tone, and the four ## headings in order: ## Who this is for, ## What it deploys, ## How to use it, ## Status and limitations, the last a Not covered \| Why table), docs/installation.md "What a running Kerbside needs" and "Try it: the demo stack", including "What the demo is not", demo/README.md, and the comments in demo/Dockerfile, demo/docker-compose.yml and demo/entrypoint.sh. For Kolla, clone https://opendev.org/openstack/kolla shallow into your scratch directory, at master and at stable/2026.2 if that branch exists. Read only. Check: kolla/common/sources.yaml's kerbside-base entry on each branch; kolla/docker/kerbside/*/Dockerfile.j2; and how kolla_start and config.json work (kolla/docker/base/start.sh, set_configs.py, and KOLLA_CONFIG_STRATEGY). For the registry, curl -s 'https://quay.io/api/v1/repository/openstack.kolla/kerbside-api?includeTags=true' (and kerbside-proxy, nova-libvirt-spice, nova-libvirt), parsed with python3 -I. Who this is for: the operator who wants Kerbside in containers, compose or Kubernetes. Answer directly: no first-party image (link #553), no production compose file, no Kubernetes support. Point to the by-hand page (manual.md) and the Kolla-Ansible page for the mechanisms that exist. What it deploys: the demo stack (three services, its image built locally) by link, and Kolla's published images, described per decision 4: registry, tags, built from develop (and say what that means against installation.md's release advice), kolla_start, no Kerbside configuration in the image. How to use it: the demo, by link only. Then a ### on what a production-shaped container deployment has to settle, per finding 3 and decisions 2 and 3: the image, the split (say exactly which processes share a container and why, citing API_SOCKET_PATH in docs/configuration.md), configuration and secrets, and the certificate lifecycle. Do not restate "What the demo is not": link it. Then a ### on Kubernetes: nothing exists, and it waits on #553. Status and limitations: at least no first-party image; the PyPI-default demo is run by no lane (finding 5); Kolla's images are built from develop and untested outside Kolla-Ansible; and no Kubernetes. In kolla-ansible.md, correct line 16 and the "What it leaves to you" images bullet per finding 2. Kerbside's images are published by Kolla; nova-libvirt-spice has to be built. Check the latter against quay on the day. In docs/index.md, link the Containers row to deployment/containers.md and change nothing else in it. State backend TLS only conditionally, as rust/kerbside-proxy/src/backend.rs behaves. Run python3 tools/check-backend-tls-claims.py, timeout 900 python3 tools/mutate-backend-tls-claims.py, timeout 900 tox -epy3 -- kerbside.tests.unit.test_docs_links and pre-commit run --all-files (after git add -N on the new page). Check every #anchor by hand: the link test strips anchors (#490). Commit subject: "Document Kerbside in containers." |
| 4b | low | (management session) | n/a | Post one comment on #553. It is published, so confirm the wording with Mikal first. Draft: Kolla now publishes kerbside-api and kerbside-proxy on quay.io (openstack.kolla, master and 2026.2 tags, three distributions, two architectures). They are built from Kerbside's develop branch, per Kolla's sources.yaml, not from a release. So "not usable outside a Kolla deployment" is better put as "not designed or tested for use outside Kolla": the image starts through kolla_start and a config.json that Kolla-Ansible writes. Link docs/deployment/containers.md, or this phase's pull request until it merges. Record the comment's URL in the execution notes. |
Risks and mitigations¶
| Risk | Mitigation |
|---|---|
| A reader takes Kolla's published images as a supported way to run Kerbside outside Kolla. | Decision 4: the page gives no standalone recipe. It says the images are built from develop, and its limitations table says nothing tests them outside Kolla-Ansible. The management session reads the image paragraph for anything that reads as an endorsement before committing 4a. |
| The registry facts age: tags, distributions, the build reference. | The page dates them, and names Kolla's sources.yaml as the authority on what is built. The definition of done re-queries quay on the day. |
| The page restates "What the demo is not" anyway. | Decision 3. The definition of done checks that the page links that section and that none of its six row labels appears on the page as a heading or a table row. |
The kolla-ansible.md correction swings too far and says no images need building. |
Finding 2 separates the two cases. The management session checks the nova-libvirt-spice claim against quay before committing. |
Definition of done¶
-
docs/deployment/containers.mdexists with exactly the four##headings, in order:grep '^## ' docs/deployment/containers.md. -
docs/deployment/order.ymllistsmanual.md,kolla-ansible.mdandcontainers.md, in that order, and nothing else. - The page links #553 and
installation.md's#what-the-demo-is-not:grep -c 'issues/553\|what-the-demo-is-not' docs/deployment/containers.mdis at least 2. - No row label of "What the demo is not" appears on the page as a heading or a table row's first cell. Checked by reading.
- The page says Kolla's images are built from
develop, and that matches Kolla master'ssources.yamlon the day. - Every registry fact the page states matches a quay.io query made on the day, and the page dates them.
-
kolla-ansible.mdno longer says Kerbside's images have to be built, and still saysnova-libvirt-spicedoes:grep -n 'built from kerbside-patches' docs/deployment/kolla-ansible.mdprints nothing. - The master plan's inventory row for the container image names
quay.io and
develop. - The Containers row of
docs/index.mdlinksdeployment/containers.md. - Every anchor in the changed pages resolves. Checked by hand, because the link test strips anchors (#490).
-
tools/check-backend-tls-claims.pyexits 0, andtools/mutate-backend-tls-claims.pystill reports every mutation caught. -
tox -epy3,tox -eflake8andpre-commit run --all-filespass. - The #553 comment from step 4b exists, and its URL is in the execution notes.
Execution notes¶
- Back brief answered on 2026-10-28 (AEDT). Mikal kept decision 2, approved step 4b's comment as drafted, and gave this session permission to push and open the pull request once the definition of done is checked.
- Step 4a re-queried quay.io on 2026-10-28. The x86-64 tags were
pushed that day, and the
-aarch64tags a week or so earlier. Kolla'sstable/2026.2also buildskerbside-basefromdevelop. - The review checked the claims step 4a flagged as inferred.
Kolla-Ansible sets
KOLLA_CONFIG_STRATEGYfor every container (ansible/group_vars/all/common.yml). kerbside-patches documents thenova-libvirt-spicebuild indocs/building.mdrather than holding a script for it, so the page links that. - Step 4b posted the approved comment on #553 on 2026-10-28: https://github.com/shakenfist/kerbside/issues/553#issuecomment-6460770776
- Definition of done checked on 2026-10-28.
tox -epy3passed 556 tests, and flake8, pre-commit and the TLS claim guard passed. The mutation tool caught all 12 mutations, and all 27 local anchors in the three changed pages resolve. quay.io and Kolla'ssources.yamlwere re-queried that day and match the page.
Back brief¶
Before executing any step of this plan, back brief the operator on your understanding of the plan and how the work you intend to do aligns with it. Two points need Mikal's answer before 4a runs:
- Decision 2: no production compose file, even as an example.
- Step 4b's comment wording, which is published on #553.