Skip to content

[pull] master from kubernetes:master - #1924

Open
pull[bot] wants to merge 8896 commits into
next-stack:masterfrom
kubernetes:master
Open

pull[bot] wants to merge 8896 commits into
next-stack:masterfrom
kubernetes:master

Conversation

@pull

@pull pull Bot commented Oct 24, 2021 •

Copy link
Copy Markdown

See Commits and Changes for more details.


Created by pull[bot]

Can you help keep this open source service alive? 💖 Please sponsor : )

@pull pull Bot added the ⤵️ pull label Oct 24, 2021
kubernetes-prow[bot] and others added 29 commits August 22, 2026 15:13
nodeup: publish and prefer an xz-compressed binary
Signed-off-by: Moshe Vayner <moshe@vayner.me>
chore(channels): bump k8s and ubuntu ami versions in alpha channel
Adds AWSBinariesLocation and GCEBinariesLocation to CloudConfiguration in v1alpha2
and wires up conversions so that BinariesLocation does not get dropped when
the cluster spec is written to the state store as v1alpha2.
Avoid client-side throttle bootstrap node lookups
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
Remove support for Kopeio networking
…ider

Signed-off-by: Moshe Vayner <moshe@vayner.me>
feat(akamai): add default network CIDR and test for Linode cloud provider
…ation

Signed-off-by: Moshe Vayner <moshe@vayner.me>
…port

feat(akamai): add Akamai (Linode) support to kOps controller configuration
…s length and character restrictions

Right now a relatively longer cluster name such as `kops.linode.example.com` fails with:
```
W0824 13:25:09.744461   64892 executor.go:142] error running task "Volume/d.etcd-main.kops.linode.example.com" (9m58s remaining to succeed): error creating Akamai (Linode) volume "d.etcd-main.kops.linode.example.com": [400] [label] Must only use ascii letters, numbers, underscores, and dashes; [label] Length must be 1-32 characters
```
So adding a logic to limit the label length for volumes by invoking the `NormalizeLinodeLabel` function and truncating the returned result to 32 chars max.

Signed-off-by: Moshe Vayner <moshe@vayner.me>
fix(akamai): normalize volume labels to comply with Akamai Cloud API's length and character restrictions
Signed-off-by: Moshe Vayner <moshe@vayner.me>
Adds file hashes for v1.34.11, v1.35.8 and v1.36.4.

Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
Promotes #18738: Kubernetes 1.34.11/1.35.8/1.36.4 and the Ubuntu 22.04
AMI bump to serial 20260731.

Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
chore(channels): promote alpha to stable
Neither is referenced by a Makefile target, a GitHub Actions workflow, or a
Prow presubmit job.

go_install_from_commit.sh additionally uses the pre-modules "go get -d", so it
would fail if anything did call it. The cfn-lint Dockerfile pins an old Python
base image and its .cfnlintrc.yaml has no consumer.
verify-gofumpt.sh and update-gofumpt.sh are not referenced by any Makefile
target, GitHub Actions workflow, or Prow presubmit job, so gofumpt has not run
in CI or in "make verify" for some time.

Having gone unrun, the two scripts had also drifted apart: the verify script
installed a much newer gofumpt than the update script, so applying the
formatting locally would not have produced what the verify script checked.

No go.mod change is needed. gofumpt remains an indirect dependency of
golangci-lint in hack/go.mod.
generate_cni_hashes truncates its output file with "cat >" before appending
each version, so calling it twice with the same arguments regenerated identical
content. Removing the second call leaves pkg/assets/assetdata/cni-1.3.yaml
unchanged.
bazel was removed from the repo; only go mod is needed to run "make gomod".
CODEGEN_VERSION pins k8s.io/code-generator, which had drifted well behind the
k8s.io/* libraries in go.mod. Nothing fails when it drifts, because the
generators are fetched over the network with "go run ...@$(CODEGEN_VERSION)"
rather than resolved through go.mod, so make gomod cannot see it.

Bump it to the version the staging libraries are on, and keep it there when
they move.
The ko version was a separate literal in the Makefile, in
hack/dev-push-kops-controller.sh, and in discovery/dev/tasks/deploy-to-k8s, so
bumping it meant finding all three.

Make the Makefile the source of truth and have the two scripts read it back
out, following the existing idiom of grepping a file for a version string that
the Makefile already uses for KOPS_CI_VERSION.
The run.go setting had fallen a minor behind the go directive in go.mod. It was
not held back by a golangci-lint compatibility constraint: the pinned
golangci-lint accepts 1.26 and reports no new issues, so this was just drift.
Both protobuf targets ran goimports@latest, so their output depended on
whichever goimports happened to be current rather than the one the rest of the
repo formats with.

Run it out of the hack module instead, which is where goimports is already
pinned for make goimports and verify-goimports.
Both scenarios installed the ginkgo CLI with @latest before cloning the
upstream repo whose tests they then run. The CLI version was therefore
unrelated to the ginkgo library those tests compile against, and could skew
from it whenever upstream ginkgo released.

Move the install after the clone and drop @latest so it resolves from the
cloned repo's go.mod, which is the version its tests are built against. This
also tracks automatically as the deployed driver version moves, matching how
these scripts already derive the branch to clone from the running cluster.
tools/metal/storage/go.mod declared the same module path as
tools/metal/dhcp, so the storage module's own packages under pkg/ were
imported through a path that names the dhcp tool. tools/metal/dhcp contains
only main.go and has no pkg/ of its own, so the imports resolved within the
storage module and nothing broke, but the two modules would collide as soon as
either imported the other.

Name the module after its directory and update its internal imports to match.

Verified with GOOS=linux go build ./... and go vet ./... in both modules.
Building for darwin fails on an unrelated pre-existing syscall.Stat_t.Ctim
reference in fsobjectstore.go; this tool targets Linux.
kubernetes-prow[bot] and others added 30 commits October 9, 2026 04:49
Test, vet, and lint nested Go modules in CI
…llback

kubetest2: Give AWS e2e bastions instance-type fallbacks
scalability: capture kubelet heap profiles after the test
tests/e2e/scalability: configure watch progress notify interval for scale clusters
Bumps [actions/upload-artifact](https://github.com/actions/upload-artifact) from 7.0.1 to 7.0.2.
- [Release notes](https://github.com/actions/upload-artifact/releases)
- [Commits](actions/upload-artifact@043fb46...cf430e0)

---
updated-dependencies:
- dependency-name: actions/upload-artifact
  dependency-version: 7.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
…ctions/upload-artifact-7.0.2

build(deps): bump actions/upload-artifact from 7.0.1 to 7.0.2
Move olemarkus and zetaab to emeritus approvers
Signed-off-by: Ciprian Hacman <ciprian@hakman.dev>
tests/e2e: add agent-sandbox benchmark scenario
kops update cluster --instance-group-roles and the first step of kops reconcile cluster build the model from only the instance groups being updated. The IAM builder used that list to decide whether a role needs the warm pool lifecycle hook permissions, so updating only the control plane removed them from the nodes and new warm pool instances were terminated. Use all instance groups instead.

Also add a test harness that runs an update of only some instance groups of an integration test cluster and checks its terraform output against the expected output of the full update.
aws: Keep warm pool permissions when updating only the control plane
…groups

Where the API load balancer was placed depended on the instance groups
being updated:

- On Azure, an internal load balancer goes in the subnet of the control
  plane, so updating only the nodes failed with "no suitable subnets
  found".
- On Hetzner, the load balancer goes in the location of the first
  instance group, so updating only instance groups in another location
  moved it, and an update that matched no instance groups crashed.

These now use all instance groups. On AWS, the same list of control
plane instance groups is used to prefer their subnets for the API and
bastion load balancers.
Every GCE cluster with an API load balancer also has an internal one,
and it was built only from the instance groups being updated. Updating
only the nodes tried to remove the control plane from its backend
service, which fails because kOps can't change an existing backend
service, and left out its forwarding rules and addresses. On clusters
with dns: none, the boot configuration of the nodes then also lacked
the address of the API server.

The load balancer is now built from all instance groups. Its backend
services refer to the managed instance groups of the instance groups
that are not being updated, so these are added as tasks that never
run, the same way that --phase keeps the tasks of the other phases.

The checks for APIServer and etcd instance groups had the same problem.
Updating only the control plane or only the nodes of a cluster with
APIServer instance groups removed their network tag from the API
firewall rules, and updating only the control plane added the control
plane to the public load balancer, which should only send traffic to
the APIServer instance groups.
…oups

The nvidia and gVisor addons were only added to the bootstrap channel
when an instance group that uses them was being updated. Updating only
the control plane, for example in the first step of "kops reconcile
cluster", removed them from the channel. kops-channels doesn't delete
addons that are removed from the channel, so they kept running, but
they weren't updated until the next full update. The new test shares
the cluster setup of runChannelBuilderTest.
systemd 258 removed the CPUAccounting= directive, as CPU accounting is
always enabled on cgroup v2, and newer versions warn when a unit still
sets it. MemoryAccounting= is still supported and is kept.
On AWS and GCE, nodeup writes a chrony configuration with
"leapsectz right/UTC" on Debian and RHEL family nodes. On Debian 13 and
Ubuntu 25.10 and later the right/ timezones live in the optional
tzdata-legacy package (split out in tzdata 2023c-6), and Debian's chrony
package dropped its dependency on it in 4.6~pre1-1, when its default
config switched to leapseclist. On nodes without tzdata-legacy, right/UTC
is missing and chronyd logs:

  Timezone right/UTC failed leap second check, ignoring

Ubuntu 24.04 does not log the warning only because its chrony 4.5 package
still depends on tzdata-legacy.

Replacing the directive with leapseclist is not possible everywhere:
leapseclist was added in chrony 4.6 and is a fatal "Invalid directive" on
Debian 11 (4.0), Ubuntu 22.04 (4.2), Debian 12 and Amazon Linux 2023 (4.3),
Ubuntu 24.04 and RHEL/Rocky 8 (4.5), so chronyd would not start there.

The directive is also wrong for the kOps use case. nodeup only writes a
chrony configuration for AWS (169.254.169.123) and GCE (time.google.com),
and both sources smear leap seconds. Google Public NTP always sets the
leap indicator to 0 because the leap second is applied on the server side
using the smear, and the Amazon Time Sync Service does the same over NTP.
The chrony manual states for leapsectz that "clients of leap smearing
servers must not use this directive", and leapseclist behaves the same
way. When the source reports no leap, chrony still schedules a leap second
recorded in its leap database, so with a smeared source the kernel would
insert the second on top of the smear and chrony would then have to
correct the clock back toward the source.

On nodes where right/UTC is missing, chronyd already ignored the
directive, so only the log line changes there. On nodes where it is
present, chronyd no longer schedules leap seconds from tz data and no
longer sets the kernel TAI-UTC offset, so CLOCK_TAI equals CLOCK_REALTIME.
No use of CLOCK_TAI was found in the kOps source. Dropping the directive
is the simplest configuration that is correct for these sources and works
with every chrony version on every supported distribution.
"kops update cluster --instance-group" or "--instance-group-roles",
and the first step of "kops reconcile cluster", build the model from
only the instance groups being updated. UsesSSHBastion, the AWS
GetSecurityGroups and the AWS bastion builder used that list, but the
security groups and the bastion are shared by all instance groups:

- Updates that left out the bastions treated the cluster as having no
  bastion. On AWS, GCE and OpenStack, they allowed SSH from
  spec.sshAccess directly to the instances, and left out the rules
  that allow SSH from the bastions. OpenStack removed these rules right
  away, and AWS removed them with --prune.
- On AWS, the security groups of the roles not being updated, their
  rules, and the bastion load balancer were left out of the update.
  Updating only the APIServer instance groups failed, because their
  launch templates use the security group of the control plane, which
  was not built.

These now use all instance groups.
…date

Fix Azure and Hetzner API load balancers when updating some instance groups
Keep the nvidia and gVisor addons when updating only some instance groups
…l-update

Keep the GCE API load balancer when updating only some instance groups
Fix security groups when updating only some instance groups
Initial support for Ubuntu 26.10 (Stonking Stingray)
Drop CPUAccounting from kubelet unit
Remove leapsectz directive from chrony config
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.