clusterloader2/testing/experimental/storage/pod-startup/config.yaml (175 lines of code) (raw):
# ASSUMPTIONS:
# - Number of nodes should be divisible by NODES_PER_NAMESPACE (default 100).
# - If using Persistent Volumes, the default storage class must have volumeBindingMode: Immediate
# Cluster Variables
# Cater for the case where the number of nodes is less than nodes per namespace. See https://github.com/kubernetes/perf-tests/issues/887
{{$NODES_PER_NAMESPACE := MinInt .Nodes (DefaultParam .NODES_PER_NAMESPACE 100)}}
# Test Variales
{{$PODS_PER_NODE := DefaultParam .PODS_PER_NODE 1}}
{{$DEPLOYMENT_TEMPLATE_PATH := .DEPLOYMENT_TEMPLATE_PATH }}
{{$VOLUMES_PER_POD := DefaultParam .VOLUMES_PER_POD 1}}
{{$VOLUME_TEMPLATE_PATH := .VOLUME_TEMPLATE_PATH}}
# Set this to false if metrics data is not needed.
{{$GATHER_METRICS := DefaultParam .GATHER_METRICS true}}
{{$START_PODS := DefaultParam .START_PODS true}}
{{$PROVISION_VOLUME := DefaultParam .PROVISION_VOLUME false}}
{{$STORAGE_CLASS := DefaultParam .STORAGE_CLASS "csi-gce-pd"}}
# Shortcut for provisioning volumes with some external provisioner. Without it,
# the PV controller must update each PVC before the external provisioner
# starts to work on it, which limits the volume creation rate.
# With it, volume creation starts immediately. This is best
# used together with WAIT_FOR_PVS_CREATED=true and
# WAIT_FOR_PVS_BOUND=false because then test does not to wait for the
# PV controller during volume creation at all.
{{$PROVISIONER := DefaultParam .PROVISIONER ""}}
# When checking PVs, the test by default considers *all* PVs in the cluster,
# whether they were created by the test or not. In other words, the test
# only works in clusters with no PVs. To make it a bit more flexible,
# the value of the expected provisioner can be set here and then only
# PVs with that annotation will be counted.
{{$EXPECTED_PROVISIONER := DefaultParam .EXPECTED_PROVISIONER ""}}
{{$VOL_SIZE := DefaultParam .VOL_SIZE "8Gi"}}
{{$WAIT_FOR_PVS_CREATED := DefaultParam .WAIT_FOR_PVS_CREATED false}}
{{$WAIT_FOR_PVS_BOUND := DefaultParam .WAIT_FOR_PVS_BOUND false}}
{{$WAIT_FOR_PVS_DELETED := DefaultParam .WAIT_FOR_PVS_DELETED false}}
{{$POD_THROUGHPUT := DefaultParam .POD_THROUGHPUT 10}}
# TODO(hantaowang): remove knob after deciding on right values
{{$POD_STARTUP_TIMEOUT := DefaultParam .POD_STARTUP_TIMEOUT "15m"}}
{{$POD_STARTUP_SLO := DefaultParam .POD_STARTUP_SLO 300}}
# Computed Variables
{{$namespaces := DivideInt .Nodes $NODES_PER_NAMESPACE | MaxInt 1}}
{{$podsPerNamespace := MultiplyInt $NODES_PER_NAMESPACE $PODS_PER_NODE}}
{{$volumesPerNamespace := MultiplyInt $podsPerNamespace $VOLUMES_PER_POD}}
{{$totalVols := MultiplyInt $volumesPerNamespace $namespaces}}
{{$guessedStepTime := MultiplyInt $totalVols 2 | MaxInt 60}}
# This is a very conservative estimate of 2 seconds per volume.
{{$StepTimeSeconds := DefaultParam .STEP_TIME_SECONDS $guessedStepTime}}
name: storage
namespace:
number: {{$namespaces}}
tuningSets:
- name: UniformQPS
qpsLoad:
qps: {{$POD_THROUGHPUT}}
steps:
{{ if $GATHER_METRICS }}
# Start measurements
- name: Starting measurement for the entire test
measurements:
- Identifier: APIResponsivenessPrometheus
Method: APIResponsivenessPrometheus
Params:
action: start
- Identifier: APIResponsivenessPrometheusSimple
Method: APIResponsivenessPrometheus
Params:
action: start
- Identifier: PodWithVolumesStartupLatency
Method: PodStartupLatency
Params:
action: start
labelSelector: group = volume-test
threshold: {{$POD_STARTUP_SLO}}s
{{ end }}
{{ if $PROVISION_VOLUME }}
# Provision volumes
- name: Provisioning volumes
phases:
- namespaceRange:
min: 1
max: {{$namespaces}}
replicasPerNamespace: {{$volumesPerNamespace}}
tuningSet: UniformQPS
objectBundle:
- basename: vol
objectTemplatePath: {{$VOLUME_TEMPLATE_PATH}}
templateFillMap:
Group: volume-test
VolSize: {{$VOL_SIZE}}
StorageClass: {{$STORAGE_CLASS}}
Provisioner: {{$PROVISIONER}}
{{ end }}
{{if $WAIT_FOR_PVS_CREATED }}
- name: Waiting for volume creation
measurements:
- Identifier: WaitForPVsToBeCreated
Method: WaitForAvailablePVs
Params:
desiredPVCount: {{$totalVols}}
apiVersion: v1
provisioner: {{$EXPECTED_PROVISIONER}}
timeout: {{$StepTimeSeconds}}s
{{ end }}
{{ if $WAIT_FOR_PVS_BOUND }}
- name: Waiting for PVs to be bound
measurements:
- Identifier: WaitForPVCsToBeBound
Method: WaitForBoundPVCs
Params:
desiredPVCCount: {{$totalVols}}
apiVersion: v1
labelSelector: group = volume-test
timeout: {{$StepTimeSeconds}}s
{{ end }}
{{ if $START_PODS }}
- name: Starting measurement for waiting for deployments
measurements:
- Identifier: WaitForRunningDeployments
Method: WaitForControlledPodsRunning
Params:
action: start
apiVersion: apps/v1
kind: Deployment
labelSelector: group = volume-test
operationTimeout: {{$POD_STARTUP_TIMEOUT}}
# Create deployments
- name: Creating deployments
phases:
- namespaceRange:
min: 1
max: {{$namespaces}}
replicasPerNamespace: {{$podsPerNamespace}}
tuningSet: UniformQPS
objectBundle:
- basename: deployment
objectTemplatePath: {{$DEPLOYMENT_TEMPLATE_PATH}}
templateFillMap:
Group: volume-test
VolumesPerPod: {{$VOLUMES_PER_POD}}
VolSize: {{$VOL_SIZE}}
StorageClass: {{$STORAGE_CLASS}}
Provisioner: {{$PROVISIONER}}
- name: Waiting for deployments to be running
measurements:
- Identifier: WaitForRunningDeployments
Method: WaitForControlledPodsRunning
Params:
action: gather
# Delete deployments
- name: Deleting deployments
phases:
- namespaceRange:
min: 1
max: {{$namespaces}}
replicasPerNamespace: 0
tuningSet: UniformQPS
objectBundle:
- basename: deployment
objectTemplatePath: {{$DEPLOYMENT_TEMPLATE_PATH}}
{{ end }}
{{ if $PROVISION_VOLUME }}
# Delete volumes
- name: Deleting volumes
phases:
- namespaceRange:
min: 1
max: {{$namespaces}}
replicasPerNamespace: 0
tuningSet: UniformQPS
objectBundle:
- basename: vol
objectTemplatePath: {{$VOLUME_TEMPLATE_PATH}}
{{ end }}
{{if $WAIT_FOR_PVS_DELETED }}
- name: Waiting for volume deletion
measurements:
- Identifier: WaitForPVsToBeDeleted
Method: WaitForAvailablePVs
Params:
desiredPVCount: 0
apiVersion: v1
provisioner: {{$EXPECTED_PROVISIONER}}
timeout: {{$StepTimeSeconds}}s
{{ end }}
{{ if $GATHER_METRICS }}
# Collect measurements
- name: Gather test measurements
measurements:
- Identifier: APIResponsivenessPrometheusSimple
Method: APIResponsivenessPrometheus
Params:
action: gather
enableViolations: true
useSimpleLatencyQuery: true
summaryName: APIResponsivenessPrometheus_simple
- Identifier: APIResponsivenessPrometheus
Method: APIResponsivenessPrometheus
Params:
action: gather
- Identifier: PodWithVolumesStartupLatency
Method: PodStartupLatency
Params:
action: gather
{{ end }}