Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
35 commits
Select commit Hold shift + click to select a range
62e51d6
add new test cases
xdc0527 Jan 26, 2026
bd5327b
support same priority
xdc0527 Jan 29, 2026
016317a
refactor
xdc0527 Feb 3, 2026
9d140af
refactor advisor
xdc0527 Feb 3, 2026
ee97bd0
add more tests
xdc0527 Feb 4, 2026
072b2c8
refactor code
xdc0527 Feb 5, 2026
658818b
add missing file
xdc0527 Feb 9, 2026
5b51e32
args --mb-extra-group-priorities=machine=9000 --mb-group-priority-uni…
h-w-chen Feb 10, 2026
76c1eb1
feat(fetcher): add checkpoint support for inner reporter plugins
luomingmeng Mar 31, 2026
37b712e
feat(*): add switch to support disabling some reporters
fantastic-hf Apr 7, 2026
097c148
feat(*): add switch to support disabling cnr lifecycle
fantastic-hf Apr 7, 2026
1267850
minor refactor: functions naming combined groups
h-w-chen Apr 7, 2026
bbec2f6
fix(*): do not return error when reporter of gvk not found
fantastic-hf Apr 7, 2026
eae0f32
feat: support setting of cpu burst only for main container
JustinChengLZ Apr 8, 2026
7320721
Merge pull request #1114 from fantastic-hf/dev/reporters
luomingmeng Apr 8, 2026
f4d9f38
Merge pull request #1115 from fantastic-hf/dev/cnrlifecycle
luomingmeng Apr 8, 2026
b31c94e
refactor: policy uses the advisor able to process groups of identical…
h-w-chen Apr 7, 2026
55ffd45
feat(qrm): support set memory.high to throttle reclaimed_cores
cheney-lin Apr 1, 2026
6546378
Merge pull request #1125 from cheney-lin/dev/mem_guard
xu282934741 Apr 13, 2026
927cc35
Merge pull request #1121 from JustinChengLZ/dev/device-affinity-stron…
luomingmeng Apr 20, 2026
abcb4f9
feat(gpu): start device topology registry in base plugin
luomingmeng Mar 26, 2026
c4e3a35
Merge pull request #1111 from h-w-chen/dev/mbm-polify-db-uce
luomingmeng Apr 21, 2026
1f061d6
feat(sriov): skip dynamic VF allocation by pod annotations
junyu-peng Mar 27, 2026
7df6384
fix(vpa-status): skip inactive pods when checking recommendation applied
luomingmeng Apr 16, 2026
710c9be
Merge pull request #1116 from luomingmeng/dev/fix-reporter-plugin-man…
luomingmeng Apr 22, 2026
e96b596
feat(vpa): add NoPodsMatched condition for VPA controller
luomingmeng Apr 21, 2026
7e636b0
Merge pull request #1112 from junyu-peng/dev/sriov
xu282934741 Apr 23, 2026
eef39fd
Merge pull request #1108 from luomingmeng/dev/fix-gpu-base-plugin-run
xu282934741 Apr 23, 2026
8885128
Merge pull request #1129 from luomingmeng/dev/refactor-vpa-apply-cond…
luomingmeng Apr 23, 2026
217669d
Merge pull request #1123 from JustinChengLZ/dev/cpu-burst-no-sidecar
xu282934741 Apr 23, 2026
78a50ee
feat(qosaware): revise memory headroom policy to consider actual memo…
jinxin32 Mar 26, 2026
5593598
feat(qosaware): add request based ratio in crd
jinxin32 Apr 15, 2026
80d9615
Merge pull request #1128 from jinxin32/memory_headroom
xu282934741 Apr 23, 2026
41f84fe
feat(gpu): implement topology hints for associated devices
luomingmeng Apr 16, 2026
2d2b3c0
fix(gpu): filter out unhealthy GPUs when generating topology hints
luomingmeng Apr 20, 2026
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
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ const (
defaultFreeBasedRatio = 0.6
defaultStaticBasedCapacity = 20 << 30 // 20GB
defaultCacheBasedRatio = 0
defaultRequestBasedRatio = 0.1
defaultMaxOversoldRate = 2.0
)

Expand All @@ -35,6 +36,7 @@ type UtilBasedOptions struct {
FreeBasedRatio float64
StaticBasedCapacity float64
CacheBasedRatio float64
RequestBasedRatio float64
MaxOversoldRate float64
}

Expand All @@ -44,6 +46,7 @@ func NewUtilBasedOptions() *UtilBasedOptions {
FreeBasedRatio: defaultFreeBasedRatio,
StaticBasedCapacity: defaultStaticBasedCapacity,
CacheBasedRatio: defaultCacheBasedRatio,
RequestBasedRatio: defaultRequestBasedRatio,
MaxOversoldRate: defaultMaxOversoldRate,
}
}
Expand All @@ -57,6 +60,8 @@ func (o *UtilBasedOptions) AddFlags(fs *pflag.FlagSet) {
"the static oversold memory size by bytes")
fs.Float64Var(&o.CacheBasedRatio, "memory-headroom-cache-based-ratio", o.CacheBasedRatio,
"the rate of cache oversold, 0 means disable cache oversold")
fs.Float64Var(&o.RequestBasedRatio, "memory-headroom-request-based-ratio", o.RequestBasedRatio,
"the rate of reserved memory for request, 0 means disable reserved memory")
fs.Float64Var(&o.MaxOversoldRate, "memory-headroom-max-oversold-rate", o.MaxOversoldRate,
"the max oversold rate of memory headroom to the memory limit of reclaimed_cores cgroup")
}
Expand All @@ -66,6 +71,7 @@ func (o *UtilBasedOptions) ApplyTo(c *memoryheadroom.MemoryUtilBasedConfiguratio
c.FreeBasedRatio = o.FreeBasedRatio
c.StaticBasedCapacity = o.StaticBasedCapacity
c.CacheBasedRatio = o.CacheBasedRatio
c.RequestBasedRatio = o.RequestBasedRatio
c.MaxOversoldRate = o.MaxOversoldRate
return nil
}
4 changes: 4 additions & 0 deletions cmd/katalyst-agent/app/options/qrm/cpu_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ type CPUDynamicPolicyOptions struct {
EnableCPUBurst bool
EnableDefaultDedicatedCoresCPUBurst bool
EnableDefaultSharedCoresCPUBurst bool
EnableCPUBurstForMainContainerOnly bool
*irqtuner.IRQTunerOptions
*hintoptimizer.HintOptimizerOptions
}
Expand Down Expand Up @@ -140,6 +141,8 @@ func (o *CPUOptions) AddFlags(fss *cliflag.NamedFlagSets) {
o.EnableDefaultSharedCoresCPUBurst, "if set true, it will enable cpu burst for shared cores by default")
fs.BoolVar(&o.EnableDefaultDedicatedCoresCPUBurst, "enable-default-dedicated-cores-cpu-burst",
o.EnableDefaultDedicatedCoresCPUBurst, "if set true, it will enable cpu burst for dedicated cores by default")
fs.BoolVar(&o.EnableCPUBurstForMainContainerOnly, "enable-cpu-burst-for-main-container-only",
o.EnableCPUBurstForMainContainerOnly, "if set true, it will enable cpu burst for main container only")
o.HintOptimizerOptions.AddFlags(fss)
o.IRQTunerOptions.AddFlags(fss)
}
Expand All @@ -164,6 +167,7 @@ func (o *CPUOptions) ApplyTo(conf *qrmconfig.CPUQRMPluginConfig) error {
conf.EnableCPUBurst = o.EnableCPUBurst
conf.EnableDefaultDedicatedCoresCPUBurst = o.EnableDefaultDedicatedCoresCPUBurst
conf.EnableDefaultSharedCoresCPUBurst = o.EnableDefaultSharedCoresCPUBurst
conf.EnableCPUBurstForMainContainerOnly = o.EnableCPUBurstForMainContainerOnly
if err := o.HintOptimizerOptions.ApplyTo(conf.HintOptimizerConfiguration); err != nil {
return err
}
Expand Down
4 changes: 4 additions & 0 deletions cmd/katalyst-agent/app/options/qrm/mb_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ type MBOptions struct {
CrossDomainGroups []string
ResetResctrlOnly bool
LocalIsVictimAndTotalIsAllRead bool
ExtraGroupPriorities map[string]int
}

func NewMBOptions() *MBOptions {
Expand Down Expand Up @@ -89,6 +90,8 @@ func (o *MBOptions) AddFlags(fss *cliflag.NamedFlagSets) {
o.ResetResctrlOnly, "not to run mb plugin really, and only reset to ensure resctrl FS in default status")
fs.BoolVar(&o.LocalIsVictimAndTotalIsAllRead, "mb-local-is-victim",
o.LocalIsVictimAndTotalIsAllRead, "turn resctrl local as victim")
fs.StringToIntVar(&o.ExtraGroupPriorities, "mb-extra-group-priorities",
o.ExtraGroupPriorities, "extra resctrl groups with priorities")
}

func (o *MBOptions) ApplyTo(conf *qrm.MBQRMPluginConfig) error {
Expand All @@ -103,5 +106,6 @@ func (o *MBOptions) ApplyTo(conf *qrm.MBQRMPluginConfig) error {
conf.DomainGroupAwareCapacityPCT = o.DomainGroupAwareCapacityPCT
conf.ResetResctrlOnly = o.ResetResctrlOnly
conf.LocalIsVictimAndTotalIsAllRead = o.LocalIsVictimAndTotalIsAllRead
conf.ExtraGroupPriorities = o.ExtraGroupPriorities
return nil
}
4 changes: 4 additions & 0 deletions cmd/katalyst-agent/app/options/qrm/sriov_plugin.go
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ type SriovStaticPolicyOptions struct {
}

type SriovDynamicPolicyOptions struct {
PodRequiredAnnotations map[string]string
LargeSizeVFQueueCount int
LargeSizeVFCPUThreshold int
LargeSizeVFFailOnExhaustion bool
Expand All @@ -69,6 +70,7 @@ func NewSriovOptions() *SriovOptions {
MaxBondingVFQueueCount: math.MaxInt32,
},
SriovDynamicPolicyOptions: SriovDynamicPolicyOptions{
PodRequiredAnnotations: map[string]string{},
LargeSizeVFQueueCount: 32,
LargeSizeVFCPUThreshold: 24,
LargeSizeVFFailOnExhaustion: true,
Expand All @@ -90,6 +92,7 @@ func (o *SriovOptions) AddFlags(fss *cliflag.NamedFlagSets) {
fs.StringToStringVar(&o.ExtraAnnotations, "sriov-vf-extra-annotations", o.ExtraAnnotations, "Extra annotations for sriov vf")
fs.IntVar(&o.MinBondingVFQueueCount, "static-min-bonding-vf-queue-count", o.MinBondingVFQueueCount, "Min queue count of bonding VF can be allocated in static policy")
fs.IntVar(&o.MaxBondingVFQueueCount, "static-max-bonding-vf-queue-count", o.MaxBondingVFQueueCount, "Max queue count of bonding VF can be allocated in static policy")
fs.StringToStringVar(&o.PodRequiredAnnotations, "dynamic-pod-vf-required-annotations", o.PodRequiredAnnotations, "Required annotations for pod to dynamic allocate VF")
fs.IntVar(&o.LargeSizeVFQueueCount, "dynamic-large-size-vf-queue-count", o.LargeSizeVFQueueCount, "Queue count for VF to be identified as large size VF in dynamic policy")
fs.IntVar(&o.LargeSizeVFCPUThreshold, "dynamic-large-size-vf-cpu-threshold", o.LargeSizeVFCPUThreshold, "Threshold of cpu quantity to allocate large size VF in dynamic policy")
fs.BoolVar(&o.LargeSizeVFFailOnExhaustion, "dynamic-large-size-vf-fail-on-exhaustion", o.LargeSizeVFFailOnExhaustion, "Should fail or not when large size VF is exhausted in dynamic policy")
Expand All @@ -109,6 +112,7 @@ func (s *SriovOptions) ApplyTo(config *qrmconfig.SriovQRMPluginConfig) error {
}
config.MinBondingVFQueueCount = s.MinBondingVFQueueCount
config.MaxBondingVFQueueCount = s.MaxBondingVFQueueCount
config.PodRequiredAnnotations = s.PodRequiredAnnotations
config.LargeSizeVFQueueCount = s.LargeSizeVFQueueCount
config.LargeSizeVFCPUThreshold = s.LargeSizeVFCPUThreshold
config.LargeSizeVFFailOnExhaustion = s.LargeSizeVFFailOnExhaustion
Expand Down
6 changes: 6 additions & 0 deletions cmd/katalyst-agent/app/options/reporter/reporter_base.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ const (
type GenericReporterOptions struct {
CollectInterval time.Duration
InnerPlugins []string
AgentReporters []string
RefreshLatestCNRPeriod time.Duration
DefaultCNRLabels map[string]string
}
Expand All @@ -43,6 +44,7 @@ type GenericReporterOptions struct {
func NewGenericReporterOptions() *GenericReporterOptions {
return &GenericReporterOptions{
InnerPlugins: []string{"*"},
AgentReporters: []string{"*"},
CollectInterval: defaultCollectInterval,
RefreshLatestCNRPeriod: defaultRefreshLatestCNRPeriod,
DefaultCNRLabels: make(map[string]string),
Expand All @@ -61,6 +63,9 @@ func (o *GenericReporterOptions) AddFlags(fss *cliflag.NamedFlagSets) {
fs.StringSliceVar(&o.InnerPlugins, "reporter-plugins", o.InnerPlugins, fmt.Sprintf(""+
"A list of reporter plugins to enable. '*' enables all on-by-default reporter plugins, 'foo' enables the reporter plugin "+
"named 'foo', '-foo' disables the reporter plugin named 'foo'"))
fs.StringSliceVar(&o.AgentReporters, "agent-reporters", o.AgentReporters, fmt.Sprintf(""+
"A list of agent reporters to enable. '*' enables all on-by-default reporters, 'foo' enables the reporter "+
"named 'foo', '-foo' disables the reporter named 'foo'"))
fs.StringToStringVar(&o.DefaultCNRLabels, "default-cnr-labels", o.DefaultCNRLabels,
"the default labels of cnr created by agent, this config must be consistent with the label-selector in katalyst-controller.")
}
Expand All @@ -69,6 +74,7 @@ func (o *GenericReporterOptions) AddFlags(fss *cliflag.NamedFlagSets) {
func (o *GenericReporterOptions) ApplyTo(c *reporterconfig.GenericReporterConfiguration) error {
c.CollectInterval = o.CollectInterval
c.InnerPlugins = o.InnerPlugins
c.AgentReporters = o.AgentReporters
c.RefreshLatestCNRPeriod = o.RefreshLatestCNRPeriod
c.DefaultCNRLabels = o.DefaultCNRLabels
return nil
Expand Down
26 changes: 14 additions & 12 deletions cmd/katalyst-controller/app/controller/lifecycle.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,18 +41,20 @@ func StartLifeCycleController(ctx context.Context, controlCtx *katalystbase.Gene
err error
)

cnrLifecycle, err = lifecycle.NewCNRLifecycle(ctx,
conf.GenericConfiguration,
conf.GenericControllerConfiguration,
conf.ControllersConfiguration.CNRLifecycleConfig,
controlCtx.Client,
controlCtx.KubeInformerFactory.Core().V1().Nodes(),
controlCtx.InternalInformerFactory.Node().V1alpha1().CustomNodeResources(),
controlCtx.EmitterPool.GetDefaultMetricsEmitter(),
)
if err != nil {
klog.Errorf("failed to new CNR lifecycle controller")
return false, err
if conf.LifeCycleConfig.EnableCNRLifecycle {
cnrLifecycle, err = lifecycle.NewCNRLifecycle(ctx,
conf.GenericConfiguration,
conf.GenericControllerConfiguration,
conf.ControllersConfiguration.CNRLifecycleConfig,
controlCtx.Client,
controlCtx.KubeInformerFactory.Core().V1().Nodes(),
controlCtx.InternalInformerFactory.Node().V1alpha1().CustomNodeResources(),
controlCtx.EmitterPool.GetDefaultMetricsEmitter(),
)
if err != nil {
klog.Errorf("failed to new CNR lifecycle controller")
return false, err
}
}

if conf.LifeCycleConfig.EnableCNCLifecycle {
Expand Down
5 changes: 5 additions & 0 deletions cmd/katalyst-controller/app/options/lifecycle.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ type HealthzOptions struct {
type LifeCycleOptions struct {
EnableHealthz bool
EnableCNCLifecycle bool
EnableCNRLifecycle bool

*HealthzOptions
}
Expand All @@ -56,6 +57,7 @@ func NewLifeCycleOptions() *LifeCycleOptions {
return &LifeCycleOptions{
EnableHealthz: false,
EnableCNCLifecycle: true,
EnableCNRLifecycle: true,
HealthzOptions: &HealthzOptions{
DryRun: false,
NodeSelector: "",
Expand Down Expand Up @@ -83,6 +85,8 @@ func (o *LifeCycleOptions) AddFlags(fss *cliflag.NamedFlagSets) {
"whether to enable the healthz controller")
fs.BoolVar(&o.EnableCNCLifecycle, "cnc-lifecycle-enabled", o.EnableCNCLifecycle,
"whether to enable the cnc lifecycle controller")
fs.BoolVar(&o.EnableCNRLifecycle, "cnr-lifecycle-enabled", o.EnableCNRLifecycle,
"whether to enable the cnr lifecycle controller")

fs.BoolVar(&o.DryRun, "healthz-dry-run", o.DryRun,
"a bool to enable and disable dry-run logic of healthz controller.")
Expand Down Expand Up @@ -117,6 +121,7 @@ func (o *LifeCycleOptions) AddFlags(fss *cliflag.NamedFlagSets) {
func (o *LifeCycleOptions) ApplyTo(c *controller.LifeCycleConfig) error {
c.EnableHealthz = o.EnableHealthz
c.EnableCNCLifecycle = o.EnableCNCLifecycle
c.EnableCNRLifecycle = o.EnableCNRLifecycle

c.DryRun = o.DryRun

Expand Down
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ require (
github.com/google/uuid v1.3.0
github.com/h2non/gock v1.2.0
github.com/klauspost/cpuid/v2 v2.2.6
github.com/kubewharf/katalyst-api v0.5.11-0.20260324091059-cae1d07d9882
github.com/kubewharf/katalyst-api v0.5.11-0.20260423040236-f1a2330d266e
github.com/moby/sys/mountinfo v0.6.2
github.com/montanaflynn/stats v0.7.1
github.com/opencontainers/runc v1.1.6
Expand Down
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -574,8 +574,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kubewharf/katalyst-api v0.5.11-0.20260324091059-cae1d07d9882 h1:4KYYk/mAJAOIYDW5V+43wnjnP8p3bwHXAkAcw/AbzuQ=
github.com/kubewharf/katalyst-api v0.5.11-0.20260324091059-cae1d07d9882/go.mod h1:BZMVGVl3EP0eCn5xsDgV41/gjYkoh43abIYxrB10e3k=
github.com/kubewharf/katalyst-api v0.5.11-0.20260423040236-f1a2330d266e h1:/0LP1rzsXEI09g3eqUZCJcyv/XGU8MofdFyi7NBtZA0=
github.com/kubewharf/katalyst-api v0.5.11-0.20260423040236-f1a2330d266e/go.mod h1:BZMVGVl3EP0eCn5xsDgV41/gjYkoh43abIYxrB10e3k=
github.com/kubewharf/kubelet v1.24.6-kubewharf-pre.2 h1:2KLMzgntDypiFJRX4fSQJCD+a6zIgHuhcAzd/7nAGmU=
github.com/kubewharf/kubelet v1.24.6-kubewharf-pre.2/go.mod h1:MxbSZUx3wXztFneeelwWWlX7NAAStJ6expqq7gY2J3c=
github.com/kyoh86/exportloopref v0.1.7/go.mod h1:h1rDl2Kdj97+Kwh4gdz3ujE7XHmH51Q0lUiZ1z4NLj8=
Expand Down
19 changes: 16 additions & 3 deletions pkg/agent/qrm-plugins/cpu/dynamicpolicy/cpuburst/manager.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import (

"github.com/kubewharf/katalyst-api/pkg/consts"
"github.com/kubewharf/katalyst-core/pkg/agent/qrm-plugins/cpu/util"
qrmutil "github.com/kubewharf/katalyst-core/pkg/agent/qrm-plugins/util"
"github.com/kubewharf/katalyst-core/pkg/config"
"github.com/kubewharf/katalyst-core/pkg/config/agent/dynamic"
"github.com/kubewharf/katalyst-core/pkg/metaserver"
Expand Down Expand Up @@ -90,10 +91,15 @@ func (m *managerImpl) UpdateCPUBurst(conf *config.Configuration, dynamicConfig *
continue
}

var mainContainerName string
if conf.EnableCPUBurstForMainContainerOnly {
mainContainerName = qrmutil.GetMainContainer(pod, conf.MainContainerAnnotationKey)
}

switch cpuBurstPolicy {
case consts.PodAnnotationCPUEnhancementCPUBurstPolicyClosed:
// For closed policy, we just set the cpu burst value to be 0.
if err = m.updateCPUBurstByPercent(0, pod); err != nil {
if err = m.updateCPUBurstByPercent(0, pod, mainContainerName); err != nil {
errList = append(errList, fmt.Errorf("error setting cpu burst for policy %s for pod %s: %v",
consts.PodAnnotationCPUEnhancementCPUBurstPolicyClosed, pod.Name, err))
}
Expand All @@ -107,7 +113,7 @@ func (m *managerImpl) UpdateCPUBurst(conf *config.Configuration, dynamicConfig *
continue
}

if err = m.updateCPUBurstByPercent(cpuBurstPercent, pod); err != nil {
if err = m.updateCPUBurstByPercent(cpuBurstPercent, pod, mainContainerName); err != nil {
errList = append(errList, fmt.Errorf("error setting cpu burst for policy %s for pod %s: %v",
consts.PodAnnotationCPUEnhancementCPUBurstPolicyStatic, pod.Name, err))
}
Expand All @@ -123,13 +129,20 @@ func (m *managerImpl) UpdateCPUBurst(conf *config.Configuration, dynamicConfig *

// updateCPUBurstByPercent updates the value of cpu burst for static policy by taking the
// cpu quota from cgroup and calculating the cpu burst value by taking cpu quota * percent / 100.
func (m *managerImpl) updateCPUBurstByPercent(percent float64, pod *v1.Pod) error {
// If the main container name is not empty, we update the cpu burst only for that container,
// otherwise we update the cpu burst for all containers.
func (m *managerImpl) updateCPUBurstByPercent(percent float64, pod *v1.Pod, mainContainerName string) error {
var errList []error
podUID := string(pod.GetUID())
podName := pod.Name

for _, container := range pod.Spec.Containers {
containerName := container.Name
// skip updating the container if the container is not the main container
if mainContainerName != "" && containerName != mainContainerName {
continue
}

containerID, err := m.metaServer.GetContainerID(podUID, containerName)
if err != nil {
general.Errorf("get container id failed, pod: %s, podName: %s, container: %s(%s), err: %v", podUID, podName, containerName, containerID, err)
Expand Down
Loading