Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
fe9bdd1
Mark API server errors as transient in csi raw block driver
eltrufas Aug 18, 2025
c2cd8aa
mark device manager as haelthy before it started for the first time
SergeyKanzhelev Nov 5, 2025
d4672d9
Update CHANGELOG/CHANGELOG-1.34.md for v1.34.2
k8s-release-robot Nov 11, 2025
12e3ff4
Fix alpha API warnings for patch version differences
akhilsingh-git Sep 12, 2025
2664ad0
Fallback to live ns lookup on admission if lister cannot find namespace
liggitt Nov 19, 2025
b00d0b5
[Manual bugfix]: unhide the etcd-join phase for v1.34
borovetsav Nov 27, 2025
0eb6c41
Bump dependencies, images and versions used to Go 1.24.10 and distrol…
cpanato Nov 29, 2025
9f4404b
Merge pull request #135506 from cpanato/update-go134
k8s-ci-robot Dec 1, 2025
627803b
Merge pull request #135442 from lalitc375/automated-cherry-pick-of-#1…
k8s-ci-robot Dec 2, 2025
50256f3
fix docker IP address detection for rsync
BenTheElder Dec 3, 2025
38f3932
Merge pull request #135576 from BenTheElder/fix-rsync-1.34
k8s-ci-robot Dec 4, 2025
7d22d65
Merge pull request #135343 from michaelasp/automated-cherry-pick-of-#…
k8s-ci-robot Dec 4, 2025
be4a4f5
Embed proper interface in TransformingStore to ensure DeltaFIFO and R…
Jul 28, 2025
86c4e09
Add unit tests for Data Consistency Detector
Jul 28, 2025
9043cb4
Use transformer in consistency checker
liggitt Nov 26, 2025
58da6ff
Merge pull request #135207 from SergeyKanzhelev/automated-cherry-pick…
k8s-ci-robot Dec 4, 2025
2f17c6c
Merge pull request #135592 from serathius/automated-cherry-pick-of-#1…
k8s-ci-robot Dec 5, 2025
3012c00
Bump dependencies, images and versions used to Go 1.24.11 and distrol…
cpanato Dec 5, 2025
071d411
Merge pull request #135612 from cpanato/update-rel-134
k8s-ci-robot Dec 5, 2025
7124d34
Merge pull request #135482 from borovetsav/fix-kubeadm-control-plane-…
k8s-ci-robot Dec 5, 2025
7c5d1fc
Merge pull request #135064 from eltrufas/automated-cherry-pick-of-#13…
k8s-ci-robot Dec 5, 2025
df11db1
Release commit for Kubernetes v1.34.3
k8s-release-robot Dec 9, 2025
b69621d
Merge tag 'v1.34.3' into bump-1.34.3
jacobsee Dec 19, 2025
a21e22f
UPSTREAM: <drop>: hack/update-vendor.sh, make update and update image
jacobsee Dec 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .go-version
Original file line number Diff line number Diff line change
@@ -1 +1 @@
1.24.9
1.24.11
235 changes: 185 additions & 50 deletions CHANGELOG/CHANGELOG-1.34.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion build/build-image/cross/VERSION
Original file line number Diff line number Diff line change
@@ -1 +1 @@
v1.34.0-go1.24.9-bullseye.0
v1.34.0-go1.24.11-bullseye.0
6 changes: 3 additions & 3 deletions build/common.sh
Original file line number Diff line number Diff line change
Expand Up @@ -97,8 +97,8 @@ readonly KUBE_RSYNC_PORT="${KUBE_RSYNC_PORT:-}"
readonly KUBE_CONTAINER_RSYNC_PORT=8730

# These are the default versions (image tags) for their respective base images.
readonly __default_distroless_iptables_version=v0.7.11
readonly __default_go_runner_version=v2.4.0-go1.24.9-bookworm.0
readonly __default_distroless_iptables_version=v0.7.13
readonly __default_go_runner_version=v2.4.0-go1.24.11-bookworm.0
readonly __default_setcap_version=bookworm-v1.0.6

# These are the base images for the Docker-wrapped binaries.
Expand Down Expand Up @@ -621,7 +621,7 @@ function kube::build::start_rsyncd_container() {
fi

local container_ip
container_ip=$("${DOCKER[@]}" inspect --format '{{ .NetworkSettings.IPAddress }}' "${KUBE_RSYNC_CONTAINER_NAME}")
container_ip=$("${DOCKER[@]}" inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}},{{end}}' "${KUBE_RSYNC_CONTAINER_NAME}" | cut -d',' -f1)

# Sometimes we can reach rsync through localhost and a NAT'd port. Other
# times (when we are running in another docker container on the Jenkins
Expand Down
8 changes: 4 additions & 4 deletions build/dependencies.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ dependencies:
# Golang
# TODO: this should really be eliminated and controlled by .go-version
- name: "golang: upstream version"
version: 1.24.9
version: 1.24.11
refPaths:
- path: .go-version
- path: build/build-image/cross/VERSION
Expand All @@ -134,7 +134,7 @@ dependencies:
match: minimum_go_version=go([0-9]+\.[0-9]+)

- name: "registry.k8s.io/kube-cross: dependents"
version: v1.34.0-go1.24.9-bullseye.0
version: v1.34.0-go1.24.11-bullseye.0
refPaths:
- path: build/build-image/cross/VERSION

Expand Down Expand Up @@ -170,15 +170,15 @@ dependencies:
match: registry\.k8s\.io\/build-image\/debian-base:[a-zA-Z]+\-v((([0-9]+)\.([0-9]+)\.([0-9]+)(?:-([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)

- name: "registry.k8s.io/distroless-iptables: dependents"
version: v0.7.11
version: v0.7.13
refPaths:
- path: build/common.sh
match: __default_distroless_iptables_version=
- path: test/utils/image/manifest.go
match: configs\[DistrolessIptables\] = Config{list\.BuildImageRegistry, "distroless-iptables", "v([0-9]+)\.([0-9]+)\.([0-9]+)"}

- name: "registry.k8s.io/go-runner: dependents"
version: v2.4.0-go1.24.9-bookworm.0
version: v2.4.0-go1.24.11-bookworm.0
refPaths:
- path: build/common.sh
match: __default_go_runner_version=
Expand Down
3 changes: 0 additions & 3 deletions cmd/kubeadm/app/cmd/phases/join/controlplanejoin.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,9 +88,6 @@ func NewEtcdJoinPhase() workflow.Phase {
Example: etcdJoinExample,
InheritFlags: getControlPlaneJoinPhaseFlags("etcd"),
ArgsValidator: cobra.NoArgs,
// TODO: unhide this phase once ControlPlaneKubeletLocalMode goes GA:
// https://github.com/kubernetes/enhancements/issues/4471
Hidden: true,
// Only run this phase as if `ControlPlaneKubeletLocalMode` is activated.
RunIf: func(c workflow.RunData) (bool, error) {
return checkFeatureState(c, features.ControlPlaneKubeletLocalMode, true)
Expand Down
2 changes: 1 addition & 1 deletion openshift-hack/images/hyperkube/Dockerfile.rhel
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,4 @@ COPY --from=builder /tmp/build/* /usr/bin/
LABEL io.k8s.display-name="OpenShift Kubernetes Server Commands" \
io.k8s.description="OpenShift is a platform for developing, building, and deploying containerized applications." \
io.openshift.tags="openshift,hyperkube" \
io.openshift.build.versions="kubernetes=1.34.2"
io.openshift.build.versions="kubernetes=1.34.3"
21 changes: 11 additions & 10 deletions pkg/kubelet/cm/devicemanager/plugin/v1beta1/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,8 @@ type server struct {
chandler ClientHandler
clients map[string]Client

// isStarted indicates whether the service has started successfully.
isStarted bool
// lastError records the last runtime error. A server is considered healthy till an actual error occurs.
lastError error

api.UnsafeRegistrationServer
}
Expand Down Expand Up @@ -119,7 +119,7 @@ func (s *server) Start() error {
defer s.wg.Done()
s.setHealthy()
if err = s.grpc.Serve(ln); err != nil {
s.setUnhealthy()
s.setUnhealthy(err)
klog.ErrorS(err, "Error while serving device plugin registration grpc server")
}
}()
Expand Down Expand Up @@ -210,18 +210,19 @@ func (s *server) Name() string {
}

func (s *server) Check(_ *http.Request) error {
if s.isStarted {
return nil
}
return fmt.Errorf("device plugin registration gRPC server failed and no device plugins can register")
return s.lastError
}

// setHealthy sets the health status of the gRPC server.
func (s *server) setHealthy() {
s.isStarted = true
s.lastError = nil
}

// setUnhealthy sets the health status of the gRPC server to unhealthy.
func (s *server) setUnhealthy() {
s.isStarted = false
func (s *server) setUnhealthy(err error) {
if err == nil {
s.lastError = fmt.Errorf("device registration error: device plugin registration gRPC server failed and no device plugins can register")
return
}
s.lastError = fmt.Errorf("device registration error: device plugin registration gRPC server failed and no device plugins can register: %w", err)
}
15 changes: 7 additions & 8 deletions pkg/volume/csi/csi_block.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,6 @@ package csi
import (
"context"
"errors"
"fmt"
"os"
"path/filepath"

Expand Down Expand Up @@ -171,8 +170,8 @@ func (m *csiBlockMapper) stageVolumeForBlock(
if csiSource.NodeStageSecretRef != nil {
nodeStageSecrets, err = getCredentialsFromSecret(m.k8s, csiSource.NodeStageSecretRef)
if err != nil {
return "", fmt.Errorf("failed to get NodeStageSecretRef %s/%s: %v",
csiSource.NodeStageSecretRef.Namespace, csiSource.NodeStageSecretRef.Name, err)
return "", volumetypes.NewTransientOperationFailure(log("failed to get NodeStageSecretRef %s/%s: %v",
csiSource.NodeStageSecretRef.Namespace, csiSource.NodeStageSecretRef.Name, err))
}
}

Expand Down Expand Up @@ -223,11 +222,11 @@ func (m *csiBlockMapper) publishVolumeForBlock(
volAttribs := csiSource.VolumeAttributes
podInfoEnabled, err := m.plugin.podInfoEnabled(string(m.driverName))
if err != nil {
return "", errors.New(log("blockMapper.publishVolumeForBlock failed to assemble volume attributes: %v", err))
return "", volumetypes.NewTransientOperationFailure(log("blockMapper.publishVolumeForBlock failed to assemble volume attributes: %v", err))
}
volumeLifecycleMode, err := m.plugin.getVolumeLifecycleMode(m.spec)
if err != nil {
return "", errors.New(log("blockMapper.publishVolumeForBlock failed to get VolumeLifecycleMode: %v", err))
return "", volumetypes.NewTransientOperationFailure(log("blockMapper.publishVolumeForBlock failed to get VolumeLifecycleMode: %v", err))
}
if podInfoEnabled {
volAttribs = mergeMap(volAttribs, getPodInfoAttrs(m.pod, volumeLifecycleMode))
Expand All @@ -237,7 +236,7 @@ func (m *csiBlockMapper) publishVolumeForBlock(
if csiSource.NodePublishSecretRef != nil {
nodePublishSecrets, err = getCredentialsFromSecret(m.k8s, csiSource.NodePublishSecretRef)
if err != nil {
return "", errors.New(log("blockMapper.publishVolumeForBlock failed to get NodePublishSecretRef %s/%s: %v",
return "", volumetypes.NewTransientOperationFailure(log("blockMapper.publishVolumeForBlock failed to get NodePublishSecretRef %s/%s: %v",
csiSource.NodePublishSecretRef.Namespace, csiSource.NodePublishSecretRef.Name, err))
}
}
Expand Down Expand Up @@ -304,7 +303,7 @@ func (m *csiBlockMapper) SetUpDevice() (string, error) {
attachID := getAttachmentName(csiSource.VolumeHandle, csiSource.Driver, nodeName)
attachment, err = m.k8s.StorageV1().VolumeAttachments().Get(context.TODO(), attachID, meta.GetOptions{})
if err != nil {
return "", errors.New(log("blockMapper.SetupDevice failed to get volume attachment [id=%v]: %v", attachID, err))
return "", volumetypes.NewTransientOperationFailure(log("blockMapper.SetupDevice failed to get volume attachment [id=%v]: %v", attachID, err))
}
}

Expand Down Expand Up @@ -366,7 +365,7 @@ func (m *csiBlockMapper) MapPodDevice() (string, error) {
attachID := getAttachmentName(csiSource.VolumeHandle, csiSource.Driver, nodeName)
attachment, err = m.k8s.StorageV1().VolumeAttachments().Get(context.TODO(), attachID, meta.GetOptions{})
if err != nil {
return "", errors.New(log("blockMapper.MapPodDevice failed to get volume attachment [id=%v]: %v", attachID, err))
return "", volumetypes.NewTransientOperationFailure(log("blockMapper.MapPodDevice failed to get volume attachment [id=%v]: %v", attachID, err))
}
}

Expand Down
41 changes: 41 additions & 0 deletions pkg/volume/csi/csi_block_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package csi

import (
"context"
"errors"
"fmt"
"os"
"path/filepath"
Expand Down Expand Up @@ -491,6 +492,46 @@ func TestBlockMapperMapPodDeviceNoClientError(t *testing.T) {
}
}

func TestBlockMapperMapPodDeviceGetStageSecretsError(t *testing.T) {
transientError := volumetypes.NewTransientOperationFailure("")
plug, tmpDir := newTestPlugin(t, nil)
defer func() {
if err := os.RemoveAll(tmpDir); err != nil {
t.Error(err)
}
}()

csiMapper, _, pv, err := prepareBlockMapperTest(plug, "test-pv", t)
if err != nil {
t.Fatalf("Failed to make a new Mapper: %v", err)
}

// set a stage secret for the pv
pv.Spec.PersistentVolumeSource.CSI.NodePublishSecretRef = &api.SecretReference{
Name: "foo",
Namespace: "default",
}
pvName := pv.GetName()
nodeName := string(plug.host.GetNodeName())

csiMapper.csiClient = setupClient(t, true)

attachID := getAttachmentName(csiMapper.volumeID, string(csiMapper.driverName), nodeName)
attachment := makeTestAttachment(attachID, nodeName, pvName)
attachment.Status.Attached = true
if _, err = csiMapper.k8s.StorageV1().VolumeAttachments().Create(context.Background(), attachment, metav1.CreateOptions{}); err != nil {
t.Fatalf("failed to setup VolumeAttachment: %v", err)
}
t.Log("created attachment ", attachID)

_, err = csiMapper.MapPodDevice()
if err == nil {
t.Errorf("test should fail, but no error occurred")
} else if !errors.As(err, &transientError) {
t.Errorf("expected a transient error but got %v", err)
}
}

func TestBlockMapperTearDownDevice(t *testing.T) {
plug, tmpDir := newTestPlugin(t, nil)
defer os.RemoveAll(tmpDir)
Expand Down
Loading