mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-04 12:18:16 +00:00 
			
		
		
		
	Merge pull request #127825 from macsko/add_pod_update_event_handling_scheduler_perf_test_case
Add scheduler_perf test case for pod update events handling
This commit is contained in:
		@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Node
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: unschedulable-node
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  unschedulable: true
 | 
				
			||||||
 | 
					status:
 | 
				
			||||||
 | 
					  capacity:
 | 
				
			||||||
 | 
					    pods: "90000"
 | 
				
			||||||
 | 
					    cpu: "4"
 | 
				
			||||||
 | 
					    memory: 32Gi
 | 
				
			||||||
 | 
					  conditions:
 | 
				
			||||||
 | 
					    - status: "True"
 | 
				
			||||||
 | 
					      type: Ready
 | 
				
			||||||
 | 
					  phase: Running
 | 
				
			||||||
@@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Node
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: node-with-taint
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  taints:
 | 
				
			||||||
 | 
					    - key: toleration
 | 
				
			||||||
 | 
					      effect: NoSchedule
 | 
				
			||||||
 | 
					status:
 | 
				
			||||||
 | 
					  capacity:
 | 
				
			||||||
 | 
					    pods: "90000"
 | 
				
			||||||
 | 
					    cpu: "4"
 | 
				
			||||||
 | 
					    memory: 32Gi
 | 
				
			||||||
 | 
					  conditions:
 | 
				
			||||||
 | 
					    - status: "True"
 | 
				
			||||||
 | 
					      type: Ready
 | 
				
			||||||
 | 
					  phase: Running
 | 
				
			||||||
@@ -0,0 +1,13 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-blocker-{{ .Index }}
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
 | 
					    resources:
 | 
				
			||||||
 | 
					      requests:
 | 
				
			||||||
 | 
					        cpu: 0.0001
 | 
				
			||||||
 | 
					        memory: 1Mi
 | 
				
			||||||
 | 
					  nodeName: scheduler-perf-node
 | 
				
			||||||
@@ -0,0 +1,15 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-blocker-{{ .Index }}
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    color: green-{{ .Index }}
 | 
				
			||||||
 | 
					    topology: blue
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
 | 
					    resources:
 | 
				
			||||||
 | 
					      requests:
 | 
				
			||||||
 | 
					        cpu: 0.0001
 | 
				
			||||||
 | 
					        memory: {{ div 30000 .Count }}Mi
 | 
				
			||||||
@@ -0,0 +1,19 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  generateName: pod-interpodaffinity-
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    color: green-{{ .Index }}
 | 
				
			||||||
 | 
					    type: unsched
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  affinity:
 | 
				
			||||||
 | 
					    podAntiAffinity:
 | 
				
			||||||
 | 
					      requiredDuringSchedulingIgnoredDuringExecution:
 | 
				
			||||||
 | 
					      - labelSelector:
 | 
				
			||||||
 | 
					          matchLabels:
 | 
				
			||||||
 | 
					            color: green-{{ .Index }}
 | 
				
			||||||
 | 
					        topologyKey: kubernetes.io/hostname
 | 
				
			||||||
 | 
					        namespaces: [blocker]
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-noderesources-{{ .Index }}
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    type: unsched
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
 | 
					    resources:
 | 
				
			||||||
 | 
					      requests:
 | 
				
			||||||
 | 
					        cpu: 0.0001
 | 
				
			||||||
 | 
					        memory: {{ div 30000 .Count }}Mi
 | 
				
			||||||
@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-nodeunschedulable-{{ .Index }}
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    type: unsched
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  tolerations:
 | 
				
			||||||
 | 
					  - key: node.kubernetes.io/unschedulable
 | 
				
			||||||
 | 
					    operator: Exists
 | 
				
			||||||
 | 
					    effect: NoSchedule
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-nodeunschedulable-{{ .Index }}
 | 
				
			||||||
 | 
					  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-podtopologyspread-
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    type: unsched
 | 
				
			||||||
 | 
					    topology: blue
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  topologySpreadConstraints:
 | 
				
			||||||
 | 
					    - maxSkew: {{ .Count }}
 | 
				
			||||||
 | 
					      minDomains: 100
 | 
				
			||||||
 | 
					      topologyKey: kubernetes.io/hostname
 | 
				
			||||||
 | 
					      whenUnsatisfiable: DoNotSchedule
 | 
				
			||||||
 | 
					      labelSelector:
 | 
				
			||||||
 | 
					        matchLabels:
 | 
				
			||||||
 | 
					          topology: blue
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-schedulinggates-{{ .Index }}
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    type: unsched
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
@@ -0,0 +1,12 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-schedulinggates-{{ .Index }}
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    type: unsched
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  schedulingGates:
 | 
				
			||||||
 | 
					  - name: test.k8s.io/hold
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
@@ -0,0 +1,14 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-tainttoleration-{{ .Index }}
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    type: unsched
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  tolerations:
 | 
				
			||||||
 | 
					  - key: toleration
 | 
				
			||||||
 | 
					    operator: Exists
 | 
				
			||||||
 | 
					    effect: NoSchedule
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
@@ -0,0 +1,10 @@
 | 
				
			|||||||
 | 
					apiVersion: v1
 | 
				
			||||||
 | 
					kind: Pod
 | 
				
			||||||
 | 
					metadata:
 | 
				
			||||||
 | 
					  name: pod-tainttoleration-{{ .Index }}
 | 
				
			||||||
 | 
					  labels:
 | 
				
			||||||
 | 
					    type: unsched
 | 
				
			||||||
 | 
					spec:
 | 
				
			||||||
 | 
					  containers:
 | 
				
			||||||
 | 
					  - image: registry.k8s.io/pause:3.10
 | 
				
			||||||
 | 
					    name: pause
 | 
				
			||||||
@@ -1663,3 +1663,124 @@
 | 
				
			|||||||
      initNodes: 50
 | 
					      initNodes: 50
 | 
				
			||||||
      blockerPods: 480 # Must be slightly below initNodes * 10 to be stable
 | 
					      blockerPods: 480 # Must be slightly below initNodes * 10 to be stable
 | 
				
			||||||
      measurePods: 500 # Must be initNodes * 10
 | 
					      measurePods: 500 # Must be initNodes * 10
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# This test case is used to measure the performance of queuing hints when handling the pod update events: 
 | 
				
			||||||
 | 
					# UpdatePodLabel, UpdatePodScaleDown, UpdatePodTolerations and UpdatePodSchedulingGatesEliminated.
 | 
				
			||||||
 | 
					# It has a few stages, but general idea is to make a node and block some pods on it
 | 
				
			||||||
 | 
					# or to create additional blocker pods that will prevent the other ones from being scheduled.
 | 
				
			||||||
 | 
					# Then, updating the blocker pods or the unschedulable pods themselves generate cluster events,
 | 
				
			||||||
 | 
					# that through QHints make the pods schedulable. 
 | 
				
			||||||
 | 
					# Plugins covered: InterPodAffinity, NodeResources, NodeUnschedulable, PodTopologySpread, SchedulingGates and TaintToleration.
 | 
				
			||||||
 | 
					- name: EventHandlingPodUpdate
 | 
				
			||||||
 | 
					  featureGates:
 | 
				
			||||||
 | 
					    SchedulerQueueingHints: true
 | 
				
			||||||
 | 
					    InPlacePodVerticalScaling: true
 | 
				
			||||||
 | 
					  workloadTemplate:
 | 
				
			||||||
 | 
					  # Collect metrics from all createPods ops that initially create unschedulable pods (type: unsched).
 | 
				
			||||||
 | 
					  - opcode: startCollectingMetrics
 | 
				
			||||||
 | 
					    namespaces: [nodeunschedulable, tainttoleration, blocker, interpodaffinity, noderesources, schedulinggates]
 | 
				
			||||||
 | 
					    labelSelector:
 | 
				
			||||||
 | 
					      type: unsched
 | 
				
			||||||
 | 
					  # Create one unschedulable node.
 | 
				
			||||||
 | 
					  - opcode: createNodes
 | 
				
			||||||
 | 
					    count: 1
 | 
				
			||||||
 | 
					    nodeTemplatePath: config/event_handling/podupdate-node-unschedulable.yaml
 | 
				
			||||||
 | 
					  # Created pods blocked using NodeUnschedulable plugin.
 | 
				
			||||||
 | 
					  - opcode: createPods
 | 
				
			||||||
 | 
					    countParam: $measurePods
 | 
				
			||||||
 | 
					    podTemplatePath: config/event_handling/podupdate-pod-nodeunschedulable.yaml
 | 
				
			||||||
 | 
					    skipWaitToCompletion: true
 | 
				
			||||||
 | 
					    namespace: nodeunschedulable
 | 
				
			||||||
 | 
					  # Create one node with NoSchedule taint.
 | 
				
			||||||
 | 
					  - opcode: createNodes
 | 
				
			||||||
 | 
					    count: 1
 | 
				
			||||||
 | 
					    nodeTemplatePath: config/event_handling/podupdate-node-with-taint.yaml
 | 
				
			||||||
 | 
					  # Created pods blocked using TaintToleration plugin.
 | 
				
			||||||
 | 
					  - opcode: createPods
 | 
				
			||||||
 | 
					    countParam: $measurePods
 | 
				
			||||||
 | 
					    podTemplatePath: config/event_handling/podupdate-pod-tainttoleration.yaml
 | 
				
			||||||
 | 
					    skipWaitToCompletion: true
 | 
				
			||||||
 | 
					    namespace: tainttoleration
 | 
				
			||||||
 | 
					  # Wait for unschedulable pods to be processed by the scheduler.
 | 
				
			||||||
 | 
					  - opcode: barrier
 | 
				
			||||||
 | 
					    stageRequirement: Attempted
 | 
				
			||||||
 | 
					  # Update pods blocked using NodeUnschedulable plugin to make them schedulable.
 | 
				
			||||||
 | 
					  - opcode: updateAny
 | 
				
			||||||
 | 
					    countParam: $measurePods
 | 
				
			||||||
 | 
					    templatePath: config/event_handling/podupdate-pod-nodeunschedulable-update.yaml
 | 
				
			||||||
 | 
					    updatePerSecond: 100
 | 
				
			||||||
 | 
					    namespace: nodeunschedulable
 | 
				
			||||||
 | 
					  # Update pods blocked using TaintToleration plugin to make them schedulable.
 | 
				
			||||||
 | 
					  - opcode: updateAny
 | 
				
			||||||
 | 
					    countParam: $measurePods
 | 
				
			||||||
 | 
					    templatePath: config/event_handling/podupdate-pod-tainttoleration-update.yaml
 | 
				
			||||||
 | 
					    updatePerSecond: 100
 | 
				
			||||||
 | 
					    namespace: tainttoleration
 | 
				
			||||||
 | 
					  # Wait for NodeUnschedulable and TaintToleration pods to be scheduled.
 | 
				
			||||||
 | 
					  - opcode: barrier
 | 
				
			||||||
 | 
					  # Create schedulable nodes.
 | 
				
			||||||
 | 
					  - opcode: createNodes
 | 
				
			||||||
 | 
					    count: 1
 | 
				
			||||||
 | 
					    nodeTemplatePath: config/templates/node-with-name.yaml
 | 
				
			||||||
 | 
					  # Create pods that will block other pods from being scheduled.
 | 
				
			||||||
 | 
					  # They'll block using InterPodAffinity, NodeResources and PodTopologySpread plugins.
 | 
				
			||||||
 | 
					  # All blocker pods are scheduled before proceeding.
 | 
				
			||||||
 | 
					  - opcode: createPods
 | 
				
			||||||
 | 
					    countParam: $blockerPods
 | 
				
			||||||
 | 
					    podTemplatePath: config/event_handling/podupdate-pod-blocker.yaml
 | 
				
			||||||
 | 
					    namespace: blocker
 | 
				
			||||||
 | 
					  # Created pods blocked using InterPodAffinity plugin.
 | 
				
			||||||
 | 
					  - opcode: createPods
 | 
				
			||||||
 | 
					    countParam: $measurePods
 | 
				
			||||||
 | 
					    podTemplatePath: config/event_handling/podupdate-pod-interpodaffinity.yaml
 | 
				
			||||||
 | 
					    skipWaitToCompletion: true
 | 
				
			||||||
 | 
					    namespace: interpodaffinity
 | 
				
			||||||
 | 
					  # Created pods blocked using NodeResources plugin.
 | 
				
			||||||
 | 
					  - opcode: createPods
 | 
				
			||||||
 | 
					    countParam: $measurePods
 | 
				
			||||||
 | 
					    podTemplatePath: config/event_handling/podupdate-pod-noderesources.yaml
 | 
				
			||||||
 | 
					    skipWaitToCompletion: true
 | 
				
			||||||
 | 
					    namespace: noderesources
 | 
				
			||||||
 | 
					  # Created pods blocked using PodTopologySpread plugin.
 | 
				
			||||||
 | 
					  # Count has to match $blockerPods as pod uses it as a maxSkew value, 
 | 
				
			||||||
 | 
					  # that must be equal to number of blocker pods.
 | 
				
			||||||
 | 
					  - opcode: createPods
 | 
				
			||||||
 | 
					    countParam: $blockerPods
 | 
				
			||||||
 | 
					    podTemplatePath: config/event_handling/podupdate-pod-podtopologyspread.yaml
 | 
				
			||||||
 | 
					    skipWaitToCompletion: true
 | 
				
			||||||
 | 
					    namespace: blocker
 | 
				
			||||||
 | 
					  # Created pods blocked using SchedulingGates plugin.
 | 
				
			||||||
 | 
					  - opcode: createPods
 | 
				
			||||||
 | 
					    countParam: $measurePods
 | 
				
			||||||
 | 
					    podTemplatePath: config/event_handling/podupdate-pod-schedulinggates.yaml
 | 
				
			||||||
 | 
					    skipWaitToCompletion: true
 | 
				
			||||||
 | 
					    namespace: schedulinggates
 | 
				
			||||||
 | 
					  # Wait for unschedulable pods to be processed by the scheduler.
 | 
				
			||||||
 | 
					  - opcode: barrier
 | 
				
			||||||
 | 
					    stageRequirement: Attempted
 | 
				
			||||||
 | 
					    labelSelector:
 | 
				
			||||||
 | 
					      type: unsched
 | 
				
			||||||
 | 
					  # Update blocker pods' labels and scale down their resource requests 
 | 
				
			||||||
 | 
					  # to make the unschedulable pods schedulable.
 | 
				
			||||||
 | 
					  - opcode: updateAny
 | 
				
			||||||
 | 
					    countParam: $blockerPods
 | 
				
			||||||
 | 
					    templatePath: config/event_handling/podupdate-pod-blocker-update.yaml
 | 
				
			||||||
 | 
					    updatePerSecond: 100
 | 
				
			||||||
 | 
					    namespace: blocker
 | 
				
			||||||
 | 
					  # Update pods blocked by SchedulingGates by removing the gate from themselves.
 | 
				
			||||||
 | 
					  - opcode: updateAny
 | 
				
			||||||
 | 
					    countParam: $measurePods
 | 
				
			||||||
 | 
					    templatePath: config/event_handling/podupdate-pod-schedulinggates-update.yaml
 | 
				
			||||||
 | 
					    updatePerSecond: 100
 | 
				
			||||||
 | 
					    namespace: schedulinggates
 | 
				
			||||||
 | 
					  # Wait for previously unschedulable pods to be scheduled.
 | 
				
			||||||
 | 
					  - opcode: barrier
 | 
				
			||||||
 | 
					    labelSelector:
 | 
				
			||||||
 | 
					      type: unsched
 | 
				
			||||||
 | 
					  - opcode: stopCollectingMetrics
 | 
				
			||||||
 | 
					  workloads:
 | 
				
			||||||
 | 
					  - name: 1Node_1000Pods
 | 
				
			||||||
 | 
					    labels: [performance, short]
 | 
				
			||||||
 | 
					    params:
 | 
				
			||||||
 | 
					      blockerPods: 1000
 | 
				
			||||||
 | 
					      measurePods: 1000
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user