Skip to content

Commit 9a9d322

Browse files
committed
feat(vpa): use Helm chart for local E2E testing and dev deployment
Replace shell script based kubectl apply deployment with Helm chart for local VPA deployments. This provides: - Consistent deployment via Helm for both local dev and E2E testing - Helm-managed webhook certificate generation - Simplified component selection via Helm values - Feature gates support via extraArgs - Clean uninstall via helm uninstall Changes: - Add values-e2e-local.yaml for local KIND cluster configuration - Modify deploy-for-e2e-locally.sh to use helm install - Update run-e2e-locally.sh to use helm uninstall for cleanup - Add helm to required commands in both scripts Fixes #8984 Signed-off-by: majiayu000 <[email protected]>
1 parent 934a600 commit 9a9d322

File tree

4 files changed

+146
-24
lines changed

4 files changed

+146
-24
lines changed

vertical-pod-autoscaler/hack/deploy-for-e2e-locally.sh

Lines changed: 91 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -67,35 +67,103 @@ esac
6767
export REGISTRY=${REGISTRY:-localhost:5001}
6868
export TAG=${TAG:-latest}
6969

70-
rm -f ${SCRIPT_ROOT}/hack/e2e/vpa-rbac.yaml
71-
patch -c ${SCRIPT_ROOT}/deploy/vpa-rbac.yaml -i ${SCRIPT_ROOT}/hack/e2e/vpa-rbac.diff -o ${SCRIPT_ROOT}/hack/e2e/vpa-rbac.yaml
72-
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/vpa-rbac.yaml
73-
# Other-versioned CRDs are irrelevant as we're running a modern-ish cluster.
74-
kubectl apply -f ${SCRIPT_ROOT}/deploy/vpa-v1-crd-gen.yaml
70+
# Deploy metrics server for E2E tests
7571
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/k8s-metrics-server.yaml
7672

73+
# Build and load Docker images for each component
7774
for i in ${COMPONENTS}; do
75+
COMPONENT_NAME=$i
7876
if [ $i == recommender-externalmetrics ] ; then
79-
i=recommender
77+
COMPONENT_NAME=recommender
8078
fi
81-
if [ $i == admission-controller ] ; then
82-
(cd ${SCRIPT_ROOT}/pkg/${i} && bash ./gencerts.sh e2e || true)
83-
kubectl apply -f ${SCRIPT_ROOT}/deploy/admission-controller-service.yaml
84-
fi
85-
ALL_ARCHITECTURES=${ARCH} make --directory ${SCRIPT_ROOT}/pkg/${i} docker-build REGISTRY=${REGISTRY} TAG=${TAG}
86-
docker tag ${REGISTRY}/vpa-${i}-${ARCH}:${TAG} ${REGISTRY}/vpa-${i}:${TAG}
87-
kind load docker-image ${REGISTRY}/vpa-${i}:${TAG}
79+
ALL_ARCHITECTURES=${ARCH} make --directory ${SCRIPT_ROOT}/pkg/${COMPONENT_NAME} docker-build REGISTRY=${REGISTRY} TAG=${TAG}
80+
docker tag ${REGISTRY}/vpa-${COMPONENT_NAME}-${ARCH}:${TAG} ${REGISTRY}/vpa-${COMPONENT_NAME}:${TAG}
81+
kind load docker-image ${REGISTRY}/vpa-${COMPONENT_NAME}:${TAG}
8882
done
8983

84+
# Prepare Helm values
85+
HELM_CHART_PATH="${SCRIPT_ROOT}/charts/vertical-pod-autoscaler"
86+
VALUES_FILE="${SCRIPT_ROOT}/hack/e2e/values-e2e-local.yaml"
87+
HELM_RELEASE_NAME="vpa"
88+
HELM_NAMESPACE="kube-system"
89+
90+
# Build dynamic Helm set arguments based on components
91+
HELM_SET_ARGS=""
92+
93+
# Enable components based on suite
9094
for i in ${COMPONENTS}; do
91-
if [ $i == recommender-externalmetrics ] ; then
92-
kubectl delete namespace monitoring --ignore-not-found=true
93-
kubectl create namespace monitoring
94-
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/prometheus.yaml
95-
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/prometheus-adapter.yaml
96-
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/metrics-pump.yaml
97-
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/${i}-deployment.yaml
98-
else
99-
REGISTRY=${REGISTRY} TAG=${TAG} ${SCRIPT_ROOT}/hack/vpa-process-yaml.sh ${SCRIPT_ROOT}/deploy/${i}-deployment.yaml | kubectl apply -f -
100-
fi
95+
case $i in
96+
recommender|recommender-externalmetrics)
97+
HELM_SET_ARGS="${HELM_SET_ARGS} --set recommender.enabled=true"
98+
HELM_SET_ARGS="${HELM_SET_ARGS} --set recommender.image.repository=${REGISTRY}/vpa-recommender"
99+
HELM_SET_ARGS="${HELM_SET_ARGS} --set recommender.image.tag=${TAG}"
100+
;;
101+
updater)
102+
HELM_SET_ARGS="${HELM_SET_ARGS} --set updater.enabled=true"
103+
HELM_SET_ARGS="${HELM_SET_ARGS} --set updater.image.repository=${REGISTRY}/vpa-updater"
104+
HELM_SET_ARGS="${HELM_SET_ARGS} --set updater.image.tag=${TAG}"
105+
;;
106+
admission-controller)
107+
HELM_SET_ARGS="${HELM_SET_ARGS} --set admissionController.enabled=true"
108+
HELM_SET_ARGS="${HELM_SET_ARGS} --set admissionController.image.repository=${REGISTRY}/vpa-admission-controller"
109+
HELM_SET_ARGS="${HELM_SET_ARGS} --set admissionController.image.tag=${TAG}"
110+
;;
111+
esac
101112
done
113+
114+
# Add feature gates if specified
115+
if [ -n "${FEATURE_GATES:-}" ]; then
116+
# Add feature gates to each enabled component
117+
for i in ${COMPONENTS}; do
118+
case $i in
119+
recommender|recommender-externalmetrics)
120+
HELM_SET_ARGS="${HELM_SET_ARGS} --set recommender.extraArgs[0]=--feature-gates=${FEATURE_GATES}"
121+
;;
122+
updater)
123+
HELM_SET_ARGS="${HELM_SET_ARGS} --set updater.extraArgs[0]=--feature-gates=${FEATURE_GATES}"
124+
;;
125+
admission-controller)
126+
HELM_SET_ARGS="${HELM_SET_ARGS} --set admissionController.extraArgs[0]=--feature-gates=${FEATURE_GATES}"
127+
;;
128+
esac
129+
done
130+
fi
131+
132+
# Uninstall any existing VPA Helm release
133+
helm uninstall ${HELM_RELEASE_NAME} --namespace ${HELM_NAMESPACE} 2>/dev/null || true
134+
135+
# Install VPA using Helm chart
136+
echo " ** Installing VPA via Helm chart"
137+
helm install ${HELM_RELEASE_NAME} ${HELM_CHART_PATH} \
138+
--namespace ${HELM_NAMESPACE} \
139+
--values ${VALUES_FILE} \
140+
${HELM_SET_ARGS} \
141+
--wait
142+
143+
# Handle external metrics special case
144+
if [[ "${SUITE}" == "recommender-externalmetrics" ]]; then
145+
echo " ** Setting up external metrics infrastructure"
146+
147+
# Apply extra RBAC for external metrics
148+
rm -f ${SCRIPT_ROOT}/hack/e2e/vpa-rbac.yaml
149+
patch -c ${SCRIPT_ROOT}/deploy/vpa-rbac.yaml -i ${SCRIPT_ROOT}/hack/e2e/vpa-rbac.diff -o ${SCRIPT_ROOT}/hack/e2e/vpa-rbac.yaml
150+
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/vpa-rbac.yaml
151+
152+
# Deploy Prometheus and adapter for external metrics
153+
kubectl delete namespace monitoring --ignore-not-found=true
154+
kubectl create namespace monitoring
155+
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/prometheus.yaml
156+
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/prometheus-adapter.yaml
157+
kubectl apply -f ${SCRIPT_ROOT}/hack/e2e/metrics-pump.yaml
158+
159+
# Upgrade Helm release with external metrics configuration
160+
echo " ** Updating recommender with external metrics args"
161+
helm upgrade ${HELM_RELEASE_NAME} ${HELM_CHART_PATH} \
162+
--namespace ${HELM_NAMESPACE} \
163+
--values ${VALUES_FILE} \
164+
${HELM_SET_ARGS} \
165+
--set "recommender.extraArgs[0]=--use-external-metrics=true" \
166+
--set "recommender.extraArgs[1]=--external-metrics-cpu-metric=cpu" \
167+
--set "recommender.extraArgs[2]=--external-metrics-memory-metric=mem" \
168+
--wait
169+
fi

vertical-pod-autoscaler/hack/dev-deploy-locally.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ REQUIRED_COMMANDS="
3232
docker
3333
git
3434
go
35+
helm
3536
kubectl
3637
make
3738
"
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# Helm values for local E2E testing
2+
# Used by deploy-for-e2e-locally.sh
3+
4+
# Image settings - will be overridden via --set at install time
5+
# admissionController.image.repository, admissionController.image.tag, etc.
6+
7+
# Pod security context
8+
podSecurityContext:
9+
runAsNonRoot: true
10+
runAsUser: 65534
11+
12+
# Component configurations optimized for local KIND cluster
13+
admissionController:
14+
enabled: false # Enabled dynamically based on suite
15+
replicas: 1
16+
image:
17+
pullPolicy: Never
18+
# Disable pod anti-affinity for single-node clusters
19+
affinity: {}
20+
podDisruptionBudget:
21+
enabled: false
22+
# Use Helm-managed webhook (certgen creates certificates)
23+
registerWebhook: false
24+
certGen:
25+
enabled: true
26+
27+
recommender:
28+
enabled: false # Enabled dynamically based on suite
29+
replicas: 1
30+
image:
31+
pullPolicy: Never
32+
# Disable pod anti-affinity for single-node clusters
33+
affinity: {}
34+
podDisruptionBudget:
35+
enabled: false
36+
# Disable leader election for single replica
37+
leaderElection:
38+
enabled: false
39+
40+
updater:
41+
enabled: false # Enabled dynamically based on suite
42+
replicas: 1
43+
image:
44+
pullPolicy: Never
45+
# Disable pod anti-affinity for single-node clusters
46+
affinity: {}
47+
podDisruptionBudget:
48+
enabled: false
49+
# Disable leader election for single replica
50+
leaderElection:
51+
enabled: false

vertical-pod-autoscaler/hack/run-e2e-locally.sh

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ SUITE=$1
4545
REQUIRED_COMMANDS="
4646
docker
4747
go
48+
helm
4849
kind
4950
kubectl
5051
make
@@ -97,7 +98,8 @@ fi
9798

9899
case ${SUITE} in
99100
recommender|recommender-externalmetrics|updater|admission-controller|actuation|full-vpa)
100-
${SCRIPT_ROOT}/hack/vpa-down.sh
101+
# Cleanup any existing VPA Helm release
102+
helm uninstall vpa --namespace kube-system 2>/dev/null || true
101103
echo " ** Deploying for suite ${SUITE}"
102104
${SCRIPT_ROOT}/hack/deploy-for-e2e-locally.sh ${SUITE}
103105

0 commit comments

Comments
 (0)