mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-06 10:43:56 +00:00
Add scheduler_perf test case for AssignedPodDelete event handling
This commit is contained in:
parent
c5f2fc05ad
commit
2a08ce5c68
@ -0,0 +1,12 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
generateName: pod-blocker-affinity-
|
||||||
|
labels:
|
||||||
|
color: green
|
||||||
|
type: blocker
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: registry.k8s.io/pause:3.10
|
||||||
|
name: pause
|
||||||
|
terminationGracePeriodSeconds: 0
|
@ -0,0 +1,27 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
generateName: pod-blocker-topology-
|
||||||
|
labels:
|
||||||
|
topology: blue
|
||||||
|
type: blocker
|
||||||
|
spec:
|
||||||
|
topologySpreadConstraints:
|
||||||
|
- maxSkew: 10
|
||||||
|
minDomains: 10000
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
whenUnsatisfiable: DoNotSchedule
|
||||||
|
labelSelector:
|
||||||
|
matchLabels:
|
||||||
|
topology: blue
|
||||||
|
containers:
|
||||||
|
- image: registry.k8s.io/pause:3.10
|
||||||
|
name: pause
|
||||||
|
ports:
|
||||||
|
- hostPort: 8{{ mod .Index 12 }}
|
||||||
|
containerPort: 8{{ mod .Index 12 }}
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 0.35
|
||||||
|
memory: 3Gi
|
||||||
|
terminationGracePeriodSeconds: 0
|
@ -0,0 +1,19 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
generateName: pod-unsched-
|
||||||
|
labels:
|
||||||
|
color: green
|
||||||
|
type: unsched
|
||||||
|
spec:
|
||||||
|
affinity:
|
||||||
|
podAntiAffinity:
|
||||||
|
requiredDuringSchedulingIgnoredDuringExecution:
|
||||||
|
- labelSelector:
|
||||||
|
matchLabels:
|
||||||
|
color: green
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
namespaces: ["blockeraffinity"]
|
||||||
|
containers:
|
||||||
|
- image: registry.k8s.io/pause:3.10
|
||||||
|
name: pause
|
@ -0,0 +1,13 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
generateName: pod-unsched-
|
||||||
|
labels:
|
||||||
|
type: unsched
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: registry.k8s.io/pause:3.10
|
||||||
|
name: pause
|
||||||
|
ports:
|
||||||
|
- hostPort: 8{{ mod .Index 12 }}
|
||||||
|
containerPort: 8{{ mod .Index 12 }}
|
@ -0,0 +1,14 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
generateName: pod-unsched-
|
||||||
|
labels:
|
||||||
|
type: unsched
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: registry.k8s.io/pause:3.10
|
||||||
|
name: pause
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
cpu: 0.2
|
||||||
|
memory: 1Gi
|
@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
generateName: pod-unsched-
|
||||||
|
labels:
|
||||||
|
type: unsched
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: registry.k8s.io/pause:3.10
|
||||||
|
name: pause
|
@ -0,0 +1,19 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
generateName: pod-unsched-
|
||||||
|
labels:
|
||||||
|
topology: blue
|
||||||
|
type: unsched
|
||||||
|
spec:
|
||||||
|
topologySpreadConstraints:
|
||||||
|
- maxSkew: 11
|
||||||
|
minDomains: 10000
|
||||||
|
topologyKey: kubernetes.io/hostname
|
||||||
|
whenUnsatisfiable: DoNotSchedule
|
||||||
|
labelSelector:
|
||||||
|
matchLabels:
|
||||||
|
topology: blue
|
||||||
|
containers:
|
||||||
|
- image: registry.k8s.io/pause:3.10
|
||||||
|
name: pause
|
@ -0,0 +1,14 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Pod
|
||||||
|
metadata:
|
||||||
|
generateName: pod-unsched-
|
||||||
|
labels:
|
||||||
|
type: unsched
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- image: registry.k8s.io/pause:3.10
|
||||||
|
name: pause
|
||||||
|
volumes:
|
||||||
|
- name: vol
|
||||||
|
persistentVolumeClaim:
|
||||||
|
claimName: pvc-{{ .Index }}
|
@ -1548,3 +1548,118 @@
|
|||||||
initNodes: 1000
|
initNodes: 1000
|
||||||
deletingPods: 1000
|
deletingPods: 1000
|
||||||
measurePods: 1000
|
measurePods: 1000
|
||||||
|
|
||||||
|
# This test case is used to measure the performance of queuing hints when handling the AssignedPodDelete events.
|
||||||
|
# First, two groups of blocker pods are created, which will prevents other pods from being scheduled.
|
||||||
|
# Then multiple types of pods are created, and each group is filtered by different plugin.
|
||||||
|
# Next, blocker pods are gradually deleted and previously unscheduled pods can be scheduled.
|
||||||
|
# Plugins covered: InterPodAffinity, NodePorts, NodeResources, NodeVolumeLimits, PodTopologySpread and VolumeRestrictions.
|
||||||
|
- name: EventHandlingPodDelete
|
||||||
|
featureGates:
|
||||||
|
SchedulerQueueingHints: true
|
||||||
|
workloadTemplate:
|
||||||
|
- opcode: createNodes
|
||||||
|
countParam: $initNodes
|
||||||
|
nodeTemplatePath: config/templates/node-default.yaml
|
||||||
|
# Allow max 20 volumes per node.
|
||||||
|
nodeAllocatableStrategy:
|
||||||
|
nodeAllocatable:
|
||||||
|
attachable-volumes-csi-ebs.csi.aws.com: "20"
|
||||||
|
csiNodeAllocatable:
|
||||||
|
ebs.csi.aws.com:
|
||||||
|
count: 20
|
||||||
|
# Create pods that will block other pods from being scheduled.
|
||||||
|
# They'll block using NodePorts, NodeResources, NodeVolumeLimits and PodTopologySpread plugins.
|
||||||
|
- opcode: createPods
|
||||||
|
countParam: $blockerPods
|
||||||
|
podTemplatePath: config/event_handling/poddelete-pod-blocker-topology-ports-resources.yaml
|
||||||
|
persistentVolumeTemplatePath: config/templates/pv-csi.yaml
|
||||||
|
persistentVolumeClaimTemplatePath: config/templates/pvc.yaml
|
||||||
|
namespace: blockertopologyportsresources
|
||||||
|
# Create second group of pods that will block another pods from being scheduled.
|
||||||
|
# They'll block using InterPodAffinity and VolumeRestrictions plugins.
|
||||||
|
- opcode: createPods
|
||||||
|
countParam: $blockerPods
|
||||||
|
podTemplatePath: config/event_handling/poddelete-pod-blocker-affinity.yaml
|
||||||
|
persistentVolumeTemplatePath: config/templates/pv-csi.yaml
|
||||||
|
persistentVolumeClaimTemplatePath: config/templates/pvc-once-pod.yaml
|
||||||
|
namespace: blockeraffinity
|
||||||
|
# Collect metrics from all createPods ops below.
|
||||||
|
- opcode: startCollectingMetrics
|
||||||
|
name: unschedPods
|
||||||
|
namespaces: [blockertopologyportsresources, blockeraffinity, nodeports, noderesources, nodevolumelimits, interpodaffinity]
|
||||||
|
labelSelector:
|
||||||
|
type: unsched
|
||||||
|
# Create pods blocked using PodTopologySpread plugin.
|
||||||
|
# Note: for this plugin, namespace has to match the blocker's namespace,
|
||||||
|
# so has to be "blockertopologyportsresources".
|
||||||
|
- opcode: createPods
|
||||||
|
countParam: $measurePods
|
||||||
|
podTemplatePath: config/event_handling/poddelete-pod-podtopologyspread.yaml
|
||||||
|
skipWaitToCompletion: true
|
||||||
|
namespace: blockertopologyportsresources
|
||||||
|
# Create pods blocked using VolumeRestrictions plugin.
|
||||||
|
# Note: these pods uses PVCs and PVs created for second blocker pods,
|
||||||
|
# so the count needs to be equal to $blockerPods
|
||||||
|
# and namespace has to be "blockeraffinity".
|
||||||
|
- opcode: createPods
|
||||||
|
countParam: $blockerPods
|
||||||
|
podTemplatePath: config/event_handling/poddelete-pod-volumerestrictions.yaml
|
||||||
|
skipWaitToCompletion: true
|
||||||
|
namespace: blockeraffinity
|
||||||
|
# Create pods blocked using NodePorts plugin.
|
||||||
|
- opcode: createPods
|
||||||
|
countParam: $measurePods
|
||||||
|
podTemplatePath: config/event_handling/poddelete-pod-nodeports.yaml
|
||||||
|
skipWaitToCompletion: true
|
||||||
|
namespace: nodeports
|
||||||
|
# Create pods blocked using NodeResources plugin.
|
||||||
|
- opcode: createPods
|
||||||
|
countParam: $measurePods
|
||||||
|
podTemplatePath: config/event_handling/poddelete-pod-noderesources.yaml
|
||||||
|
skipWaitToCompletion: true
|
||||||
|
namespace: noderesources
|
||||||
|
# Create pods blocked using NodeVolumeLimits plugin.
|
||||||
|
- opcode: createPods
|
||||||
|
countParam: $blockerPods
|
||||||
|
podTemplatePath: config/event_handling/poddelete-pod-nodevolumelimits.yaml
|
||||||
|
persistentVolumeTemplatePath: config/templates/pv-csi.yaml
|
||||||
|
persistentVolumeClaimTemplatePath: config/templates/pvc.yaml
|
||||||
|
skipWaitToCompletion: true
|
||||||
|
namespace: nodevolumelimits
|
||||||
|
# Create pods blocked using InterPodAffinity plugin.
|
||||||
|
- opcode: createPods
|
||||||
|
countParam: $measurePods
|
||||||
|
podTemplatePath: config/event_handling/poddelete-pod-interpodaffinity.yaml
|
||||||
|
skipWaitToCompletion: true
|
||||||
|
namespace: interpodaffinity
|
||||||
|
# Wait for unschedulable pods to be processed by the scheduler.
|
||||||
|
- opcode: barrier
|
||||||
|
stageRequirement: Attempted
|
||||||
|
labelSelector:
|
||||||
|
type: unsched
|
||||||
|
# Start deleting blocker pods.
|
||||||
|
- opcode: deletePods
|
||||||
|
deletePodsPerSecond: 100
|
||||||
|
namespace: blockertopologyportsresources
|
||||||
|
labelSelector:
|
||||||
|
type: blocker
|
||||||
|
skipWaitToCompletion: true
|
||||||
|
- opcode: deletePods
|
||||||
|
deletePodsPerSecond: 100
|
||||||
|
namespace: blockeraffinity
|
||||||
|
labelSelector:
|
||||||
|
type: blocker
|
||||||
|
skipWaitToCompletion: true
|
||||||
|
# Wait for previously unschedulable pods to be scheduled.
|
||||||
|
- opcode: barrier
|
||||||
|
labelSelector:
|
||||||
|
type: unsched
|
||||||
|
- opcode: stopCollectingMetrics
|
||||||
|
workloads:
|
||||||
|
- name: 50Nodes_500Pods
|
||||||
|
labels: [performance, short]
|
||||||
|
params:
|
||||||
|
initNodes: 50
|
||||||
|
blockerPods: 480 # Must be slightly below initNodes * 10 to be stable
|
||||||
|
measurePods: 500 # Must be initNodes * 10
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: PersistentVolumeClaim
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
pv.kubernetes.io/bind-completed: "true"
|
||||||
|
spec:
|
||||||
|
accessModes:
|
||||||
|
- ReadWriteOncePod
|
||||||
|
resources:
|
||||||
|
requests:
|
||||||
|
storage: 1Gi
|
@ -155,7 +155,10 @@ func getSpecFromTextTemplateFile(path string, env map[string]any, spec interface
|
|||||||
fm := template.FuncMap{"div": func(a, b int) int {
|
fm := template.FuncMap{"div": func(a, b int) int {
|
||||||
return a / b
|
return a / b
|
||||||
}}
|
}}
|
||||||
tmpl, err := template.New("object").Funcs(fm).Parse(string(content))
|
modFn := template.FuncMap{"mod": func(a, b int) int {
|
||||||
|
return a % b
|
||||||
|
}}
|
||||||
|
tmpl, err := template.New("object").Funcs(fm).Funcs(modFn).Parse(string(content))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -1194,6 +1194,10 @@ func CreatePodWithPersistentVolume(ctx context.Context, client clientset.Interfa
|
|||||||
// PVs are cluster-wide resources.
|
// PVs are cluster-wide resources.
|
||||||
// Prepend a namespace to make the name globally unique.
|
// Prepend a namespace to make the name globally unique.
|
||||||
pv.Name = fmt.Sprintf("%s-%s", namespace, pv.Name)
|
pv.Name = fmt.Sprintf("%s-%s", namespace, pv.Name)
|
||||||
|
pvs := pv.Spec.PersistentVolumeSource
|
||||||
|
if pvs.CSI != nil {
|
||||||
|
pvs.CSI.VolumeHandle = pv.Name
|
||||||
|
}
|
||||||
if bindVolume {
|
if bindVolume {
|
||||||
// bind pv to "pvc-$i"
|
// bind pv to "pvc-$i"
|
||||||
pv.Spec.ClaimRef = &v1.ObjectReference{
|
pv.Spec.ClaimRef = &v1.ObjectReference{
|
||||||
|
Loading…
Reference in New Issue
Block a user