cgroup をマウントして 利用することがほとんどな印象 プロセス /sys/fs/cgroup cpu cpu devices devices cgroup cgroup プロセス 階層1 階層N mount mount プロセス memory memory cgroup 階層2 mount blkio blkio cgroup プロセス 階層N-1 mount …
{ … // 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
map[types.UID]cm.CgroupName err error ) if kl.cgroupsPerQOS { pcm := kl.containerManager.NewPodContainerManager() cgroupPods, err = pcm.GetAllPodsFromCgroups() … // Remove any cgroups in the hierarchy for pods that are definitely no longer // running (not in the container runtime). if kl.cgroupsPerQOS { pcm := kl.containerManager.NewPodContainerManager() klog.V(3).InfoS("Clean up orphaned pod cgroups") kl.cleanupOrphanedPodCgroups(pcm, cgroupPods, possiblyRunningPods) } } (kl *Kubelet) HandlePodCleanups() [What] 不要な Pod などを削除することで、ユーザーが指定する望ましい状態になるように 調整する kubelet の main sync loop 内から呼び出される [次に確認したいこと] 全 Pod を取得する GetAllPodsFromCgroups() のロジックは? コードリーディング ※ 表示のため、本来のコードから一部変更してます https://github.com/kubernetes/kubernetes/blob/master/pkg/kubelet/kubelet_pods.go#L1006-L1280