Skip to content

ClusterTrustBundle v1 support - #1924

Merged
Eitan Yarmush (EItanya) merged 1 commit into
agent-substrate:mainfrom
howardjohn:ctb/v1
Oct 1, 2026
Merged

Eitan Yarmush (EItanya) merged 1 commit into
agent-substrate:mainfrom
howardjohn:ctb/v1

Conversation

@howardjohn

Copy link
Copy Markdown
Collaborator

Relates to #1819

This is the followup to #1829 which did PCR.

It's a good idea to open an issue first for discussion.

  • Tests pass
  • Appropriate changes to documentation are included in the PR

@ridhoq

Ridwan Hoq (ridhoq) commented Sep 27, 2026 •

Copy link
Copy Markdown

Hi John Howard (@howardjohn), I opened #1898 for this v1-only CTB failure and have a parallel draft implementation in #1916 (based on your PR #1829). Your PR appears to cover the core compatibility path, so I don’t think mine needs to merge.

The main differences in our draft that may be useful here are an early installer check that fails clearly when neither CTB API is served, rather than retrying discovery until the bundle wait times out, and updates to the beta-only wording in docs/api-guide.md and tools/setup-gcp/README.md. Feel free to bring either across if helpful.

@EItanya Eitan Yarmush (EItanya) left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

A couple of comments

  1. What do you think about using v1 as the object we use around the codebase now that it's GA?
  2. Can you also update relevant documentation

@EItanya
Eitan Yarmush (EItanya) added this pull request to the merge queue Oct 1, 2026
Merged via the queue into agent-substrate:main with commit 6904812 Oct 1, 2026
10 checks passed
hajiler pushed a commit to hajiler/substrate that referenced this pull request Oct 22, 2026
…a APIs (agent-substrate#1852)

Fixes agent-substrate#1819

When bootstrap finds an existing cluster without the PodCertificate beta
APIs, its reconcile path turns them on in place. That works: the APIs
are served once the update finishes. On 1.36 node pools it is only half
the repair, and nothing said so. Pod certificate projection is a kubelet
feature, gated through 1.36, so pods scheduled onto nodes that were
already running fail with `MountVolume.SetUp failed: unimplemented`
while the control plane looks healthy.

**What changes**

- After a successful beta-API update, setup-gcp warns once per node pool
below 1.37 and logs the two commands that fix it:
- `gcloud container node-pools create <pool>-2 …`, with the machine
type, disk, node count and nested virtualization copied from the old
pool;
- `gcloud container node-pools delete <pool> …` for once workloads have
moved.

The warning also says to carry over anything else customized on the old
pool (taints, service account, autoscaling). The pool's version decides
this, not the control plane's, since a 1.37 control plane can still run
1.36 nodes.
- The README warning is rewritten to match, building on the `v1`
discovery wording from agent-substrate#1924. It drops the claim that enabling the APIs
on an existing cluster doesn't make them served, which didn't hold up in
testing.
- `hack/ate-dev-env.sh.example` had the same claim in a comment; fixed
there too.

**Why a new pool, not an in-place node recreation**

The issue proposed recreating nodes, and the obvious command is
upgrading a pool to the version it already runs. GKE skips that: in
testing, the `UPGRADE_NODES` operation finished in 4 seconds and no node
was replaced. A pool can only be upgraded forward when GKE happens to
offer a newer patch. A new pool is the one GKE operation certain to
produce new kubelets.

Replacing the pool is left to the user rather than done automatically,
because it moves running workloads. A flag to do it could be a follow-up
if that would be useful.

**Verified end to end** on a throwaway 1.36.4 cluster created without
the beta APIs:

1. This branch's `create cluster` reconcile path enabled the APIs and
logged the warning for `default-pool`.
2. A pod with a pod certificate volume on the existing node failed with
`MountVolume.SetUp failed … unimplemented`.
3. The logged `node-pools create` command, pasted as printed, created a
pool whose kubelet issued a PodCertificateRequest for the same pod (the
mount then waited on `credential bundle is not issued yet`, as expected
with no signer running).
4. The logged `node-pools delete` command removed the old pool.

- [x] Tests pass (`go test ./tools/setup-gcp/...`)
- [x] Appropriate changes to documentation are included in the PR
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/api-machinery area/dev-infra area/node area/security Security related issue/pr kind/feature An enhancement / feature request or implementation

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants