diff --git a/pkg/kubelet/apis/config/v1beta1/defaults_test.go b/pkg/kubelet/apis/config/v1beta1/defaults_test.go index b7ab172929e..1fe5e42e498 100644 --- a/pkg/kubelet/apis/config/v1beta1/defaults_test.go +++ b/pkg/kubelet/apis/config/v1beta1/defaults_test.go @@ -752,6 +752,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) { MemoryThrottlingFactor: utilpointer.Float64Ptr(DefaultMemoryThrottlingFactor), RegisterNode: utilpointer.Bool(true), LocalStorageCapacityIsolation: utilpointer.Bool(true), + PodLogsDir: DefaultPodLogsDir, }, }, { @@ -843,6 +844,7 @@ func TestSetDefaultsKubeletConfiguration(t *testing.T) { MemoryThrottlingFactor: utilpointer.Float64Ptr(DefaultMemoryThrottlingFactor), RegisterNode: utilpointer.Bool(true), LocalStorageCapacityIsolation: utilpointer.Bool(true), + PodLogsDir: DefaultPodLogsDir, }, }, { diff --git a/pkg/kubelet/apis/config/validation/validation.go b/pkg/kubelet/apis/config/validation/validation.go index 75874973ded..0abb20ec6e6 100644 --- a/pkg/kubelet/apis/config/validation/validation.go +++ b/pkg/kubelet/apis/config/validation/validation.go @@ -20,6 +20,7 @@ import ( "fmt" "path/filepath" "time" + "unicode" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilerrors "k8s.io/apimachinery/pkg/util/errors" @@ -300,5 +301,13 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration, featur allErrors = append(allErrors, fmt.Errorf("invalid configuration: pod logs path %q must be normalized", kc.PodLogsDir)) } + // Since pod logs path is used in metrics, make sure it contains only ASCII characters. + for _, c := range kc.PodLogsDir { + if c > unicode.MaxASCII { + allErrors = append(allErrors, fmt.Errorf("invalid configuration: pod logs path %q mut contains ASCII characters only", kc.PodLogsDir)) + break + } + } + return utilerrors.NewAggregate(allErrors) } diff --git a/pkg/kubelet/apis/config/validation/validation_test.go b/pkg/kubelet/apis/config/validation/validation_test.go index b6fedeab77e..8605fbb49d8 100644 --- a/pkg/kubelet/apis/config/validation/validation_test.go +++ b/pkg/kubelet/apis/config/validation/validation_test.go @@ -569,13 +569,6 @@ func TestValidateKubeletConfiguration(t *testing.T) { return conf }, errMsg: "invalid configuration: containerLogMonitorInterval must be a positive time duration greater than or equal to 3s", - }, { - name: "invalid podLogsPath", - configure: func(conf *kubeletconfig.KubeletConfiguration) *kubeletconfig.KubeletConfiguration { - conf.PodLogsDir = "" - return conf - }, - errMsg: "invalid configuration: podLogsPath was not specified", }, { name: "pod logs path must be absolute", configure: func(config *kubeletconfig.KubeletConfiguration) *kubeletconfig.KubeletConfiguration { @@ -590,7 +583,15 @@ func TestValidateKubeletConfiguration(t *testing.T) { return config }, errMsg: `invalid configuration: pod logs path "/path/../" must be normalized`, - }} + }, { + name: "pod logs path is ascii only", + configure: func(config *kubeletconfig.KubeletConfiguration) *kubeletconfig.KubeletConfiguration { + config.PodLogsDir = "/🧪" + return config + }, + errMsg: `invalid configuration: pod logs path "/🧪" mut contains ASCII characters only`, + }, + } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { diff --git a/pkg/kubelet/stats/cadvisor_stats_provider_test.go b/pkg/kubelet/stats/cadvisor_stats_provider_test.go index b3bf1af0e5b..a97a6dcc160 100644 --- a/pkg/kubelet/stats/cadvisor_stats_provider_test.go +++ b/pkg/kubelet/stats/cadvisor_stats_provider_test.go @@ -703,12 +703,11 @@ func TestCadvisorListPodStatsWhenContainerLogFound(t *testing.T) { "/pod0-c1": getTestContainerInfo(seedPod0Container1, pName0, namespace0, cName01), } - podLogsDirectory := "/var/log/pods" containerLogStats0 := makeFakeLogStats(0) containerLogStats1 := makeFakeLogStats(0) fakeStats := map[string]*volume.Metrics{ - kuberuntime.BuildContainerLogsDirectory(podLogsDirectory, prf0.Namespace, prf0.Name, types.UID(prf0.UID), cName00): containerLogStats0, - kuberuntime.BuildContainerLogsDirectory(podLogsDirectory, prf0.Namespace, prf0.Name, types.UID(prf0.UID), cName01): containerLogStats1, + kuberuntime.BuildContainerLogsDirectory(testPodLogDirectory, prf0.Namespace, prf0.Name, types.UID(prf0.UID), cName00): containerLogStats0, + kuberuntime.BuildContainerLogsDirectory(testPodLogDirectory, prf0.Namespace, prf0.Name, types.UID(prf0.UID), cName01): containerLogStats1, } fakeStatsSlice := []*volume.Metrics{containerLogStats0, containerLogStats1} fakeOS := &containertest.FakeOS{} diff --git a/pkg/kubelet/stats/cri_stats_provider_test.go b/pkg/kubelet/stats/cri_stats_provider_test.go index 431a453d9d0..6dc8c6aee6f 100644 --- a/pkg/kubelet/stats/cri_stats_provider_test.go +++ b/pkg/kubelet/stats/cri_stats_provider_test.go @@ -89,7 +89,7 @@ const ( cName9 = "container9-name" ) -const testPodLogDirectory = "/var/log/pods/" +const testPodLogDirectory = "/var/log/kube/pods/" // Use non-default path to ensure stats are collected properly func TestCRIListPodStats(t *testing.T) { ctx := context.Background() diff --git a/pkg/kubelet/stats/host_stats_provider_fake.go b/pkg/kubelet/stats/host_stats_provider_fake.go index a5d6eef0d91..66cdfec2f47 100644 --- a/pkg/kubelet/stats/host_stats_provider_fake.go +++ b/pkg/kubelet/stats/host_stats_provider_fake.go @@ -50,7 +50,7 @@ func NewFakeHostStatsProviderWithData(fakeStats map[string]*volume.Metrics, osIn } func (f *fakeHostStatsProvider) getPodLogStats(podNamespace, podName string, podUID types.UID, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { - path := kuberuntime.BuildPodLogsDirectory("/var/log/pods", podNamespace, podName, podUID) + path := kuberuntime.BuildPodLogsDirectory("/var/log/kube/pods/", podNamespace, podName, podUID) files, err := f.osInterface.ReadDir(path) if err != nil { return nil, err @@ -68,7 +68,7 @@ func (f *fakeHostStatsProvider) getPodLogStats(podNamespace, podName string, pod } func (f *fakeHostStatsProvider) getPodContainerLogStats(podNamespace, podName string, podUID types.UID, containerName string, rootFsInfo *cadvisorapiv2.FsInfo) (*statsapi.FsStats, error) { - path := kuberuntime.BuildContainerLogsDirectory("/var/log/pods", podNamespace, podName, podUID, containerName) + path := kuberuntime.BuildContainerLogsDirectory("/var/log/kube/pods/", podNamespace, podName, podUID, containerName) metricsProvider := NewFakeMetricsDu(path, f.fakeStats[path]) return fakeMetricsProvidersToStats([]volume.MetricsProvider{metricsProvider}, rootFsInfo) }