背景
k8s 1.34 稳定了一个 OrderedNamespaceDeletion 特性,默认且锁定为开启
解决删除 namespace 时候可能先删除非 pod 资源然后再删除 pod(比如先删除 networkpolicy 再删除 pod 可能导致 pod 被非预期访问到)可能会有安全问题
源码
pkg/controller/namespace/deletion/namespaced_resources_deleter.go 中
删除所有资源
func (d *namespacedResourcesDeleter) deleteAllContent(ctx context.Context, ns *v1.Namespace) (int64, error) {
...
if _, hasPods := groupVersionResources[podsGVR]; hasPods && utilfeature.DefaultFeatureGate.Enabled(features.OrderedNamespaceDeletion) {
...
删除pod
gvrDeletionMetadata, err := d.deleteAllContentForGroupVersionResource(ctx, podsGVR, namespace, namespaceDeletedAt)
...
检查是否有剩余的pod
if numRemainingTotals.gvrToNumRemaining[podsGVR] > 0 {
...
如果有则先不删除其他资源
return estimate, utilerrors.NewAggregate(errs)
}
}
...
遍历所有资源
for gvr := range groupVersionResources {
过滤掉pod资源
if utilfeature.DefaultFeatureGate.Enabled(features.OrderedNamespaceDeletion) && gvr.Group == podsGVR.Group &&
gvr.Version == podsGVR.Version && gvr.Resource == podsGVR.Resource {
continue
}
删除非pod资源
gvrDeletionMetadata, err := d.deleteAllContentForGroupVersionResource(ctx, gvr, namespace, namespaceDeletedAt)
...
}
...
}