diff --git a/pkg/kubelet/container/runtime.go b/pkg/kubelet/container/runtime.go index 3727b2d1b09..e04b5fa192f 100644 --- a/pkg/kubelet/container/runtime.go +++ b/pkg/kubelet/container/runtime.go @@ -337,6 +337,8 @@ type ContainerResources struct { } // Status represents the status of a container. +// +// Status does not contain VolumeMap because CRI API is unaware of volume names. type Status struct { // ID of the container. ID ContainerID diff --git a/pkg/kubelet/kubelet_pods.go b/pkg/kubelet/kubelet_pods.go index a193730d0bd..b35642f3310 100644 --- a/pkg/kubelet/kubelet_pods.go +++ b/pkg/kubelet/kubelet_pods.go @@ -1976,6 +1976,9 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon ImageID: cs.ImageRef, ContainerID: cid, } + if oldStatus != nil { + status.VolumeMounts = oldStatus.VolumeMounts // immutable + } switch { case cs.State == kubecontainer.ContainerStateRunning: status.State.Running = &v1.ContainerStateRunning{StartedAt: metav1.NewTime(cs.StartedAt)} @@ -2117,6 +2120,22 @@ func (kl *Kubelet) convertToAPIContainerStatuses(pod *v1.Pod, podStatus *kubecon Image: container.Image, State: defaultWaitingState, } + // status.VolumeMounts cannot be propagated from kubecontainer.Status + // because the CRI API is unaware of the volume names. + if utilfeature.DefaultFeatureGate.Enabled(features.RecursiveReadOnlyMounts) { + for _, vol := range container.VolumeMounts { + volStatus := v1.VolumeMountStatus{ + Name: vol.Name, + MountPath: vol.MountPath, + ReadOnly: vol.ReadOnly, + } + if vol.ReadOnly { + rroMode := v1.RecursiveReadOnlyDisabled + volStatus.RecursiveReadOnly = &rroMode // Disabled or Enabled + } + status.VolumeMounts = append(status.VolumeMounts, volStatus) + } + } oldStatus, found := oldStatuses[container.Name] if found { if oldStatus.State.Terminated != nil {