Slide 24
Slide 24 text
コードリーディング
ログから、コードベース (kubelet) で原因分析することに
func (m *podContainerManagerImpl) Destroy(podCgroup CgroupName) error {
…
// Now its safe to remove the pod's cgroup
containerConfig := &CgroupConfig{
Name: podCgroup,
ResourceParameters: &ResourceConfig{},
}
if err := m.cgroupManager.Destroy(containerConfig); err != nil {
klog.InfoS("Failed to delete cgroup paths", "cgroupName", podCgroup, "err", err)
return fmt.Errorf("failed to delete cgroup paths for %v : %v", podCgroup, err)
}
return nil
}
(m *podContainerManagerImpl) Destroy()
[What]
Pod の cgroup path の削除を行う関数
cgroupManager の Destroy()を呼び出す
[次に確認したいこと]
削除対象となる CgroupName はどこで指定されるか?
kubelet のログレベルを上げてみることに
→ 以下のログが追加された
Orphaned pod found, removing pod cgroups
func (kl *Kubelet) cleanupOrphanedPodCgroups(pcm cm.PodContainerManager, cgroupPods
map[types.UID]cm.CgroupName, possiblyRunningPods map[types.UID]sets.Empty) {
// Iterate over all the found pods to verify if they should be running
for uid, val := range cgroupPods {
// if the pod is in the running set, its not a candidate for cleanup
if _, ok := possiblyRunningPods[uid]; ok {
continue
}
…
klog.V(3).InfoS("Orphaned pod found, removing pod cgroups", "podUID", uid)
go pcm.Destroy(val)
}
}
(kl *Kubelet) cleanupOrphanedPodCgroups()
[What]
全 Pod から running 状態ではないと思われるものを削除する
全 Pod の UID に対して、ループ処理
[次に確認したいこと]
削除対象となる map[types.UID]cm.CgroupName はどこで指定されるか?
※ 表示のため、本来のコードから一部変更してます
https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/cm/pod_container_manager_linux.go#L197-L214
https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kubelet_pods.go#L2301-L2330