All technological notes.
skip
kubectl edit)
in-place pod resizing feature:
FEATURE_GATES=InPlacePodVerticalScaling=truekubectl edit deploy/NAMEVertical Pod Autoscaler (VPA)
Declarative
apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
name: my-app-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: my-app
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: "my-app"
minAllowed:
cpu: "250m"
maxAllowed:
cpu: "2"
controlledResources: ["cpu"]
three main components:
Recommender,Updater,Admission Controller.Recommender:
Updater:
pods that need the new resource limits.Recommender recommends if updateMode: Auto is defined.Admission Controller:
Vertical Pod Autoscaler is set with an updateMode of “Auto.”| Mode | Description |
|---|---|
Auto |
Similar to Recreate. |
Recreate |
Evicts pods if usage goes beyond range |
Initial |
Only changes on Pod creation; never changes them later. |
Off |
Only reconmmeds; does not change anything |
# Install VPA Custom Resource Definitions (CRDs)
# allow Kubernetes to recognize the custom resources that VPA uses to function properly.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/vpa-release-1.0/vertical-pod-autoscaler/deploy/vpa-v1-crd-gen.yaml
# customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalercheckpoints.autoscaling.k8s.io created
# customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalers.autoscaling.k8s.io created
# Install VPA Role-Based Access Control (RBAC)
# ensures that VPA has the appropriate permissions to operate within your Kubernetes cluster.
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/vpa-release-1.0/vertical-pod-autoscaler/deploy/vpa-rbac.yaml
# clusterrole.rbac.authorization.k8s.io/system:metrics-reader created
# clusterrole.rbac.authorization.k8s.io/system:vpa-actor created
# clusterrole.rbac.authorization.k8s.io/system:vpa-status-actor created
# clusterrole.rbac.authorization.k8s.io/system:vpa-checkpoint-actor created
# clusterrole.rbac.authorization.k8s.io/system:evictioner created
# clusterrolebinding.rbac.authorization.k8s.io/system:metrics-reader created
# clusterrolebinding.rbac.authorization.k8s.io/system:vpa-actor created
# clusterrolebinding.rbac.authorization.k8s.io/system:vpa-status-actor created
# clusterrolebinding.rbac.authorization.k8s.io/system:vpa-checkpoint-actor created
# clusterrole.rbac.authorization.k8s.io/system:vpa-target-reader created
# clusterrolebinding.rbac.authorization.k8s.io/system:vpa-target-reader-binding created
# clusterrolebinding.rbac.authorization.k8s.io/system:vpa-evictioner-binding created
# serviceaccount/vpa-admission-controller created
# serviceaccount/vpa-recommender created
# serviceaccount/vpa-updater created
# clusterrole.rbac.authorization.k8s.io/system:vpa-admission-controller created
# clusterrolebinding.rbac.authorization.k8s.io/system:vpa-admission-controller created
# clusterrole.rbac.authorization.k8s.io/system:vpa-status-reader created
# clusterrolebinding.rbac.authorization.k8s.io/system:vpa-status-reader-binding created
# Clone the repository
git clone https://github.com/kubernetes/autoscaler.git
# Run the setup script
cd autoscaler/vertical-pod-autoscaler
./hack/vpa-up.sh
# confirm
kubectl get deploy -n kube-system
# NAME READY UP-TO-DATE AVAILABLE AGE
# vpa-admission-controller 1/1 1 1 4h37m
# vpa-recommender 1/1 1 1 4h37m
# vpa-updater 1/1 1 1 4h37m
flask-app-deploy.yamlapiVersion: apps/v1
kind: Deployment
metadata:
name: flask-app-4
labels:
app: flask-app-4
spec:
replicas: 2
selector:
matchLabels:
app: flask-app-4
template:
metadata:
labels:
app: flask-app-4
spec:
containers:
- name: flask-app-4
image: kodekloud/flask-session-app:1
ports:
- name: http
containerPort: 8080
flask-app-service.yamlapiVersion: v1
kind: Service
metadata:
name: flask-app-4-service
labels:
app: flask-app-4
spec:
type: NodePort
selector:
app: flask-app-4
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080
kubectl create -f flask-app-deploy.yaml
# deployment.apps/flask-app-4 created
kubectl create -f flask-app-service.yaml
# service/flask-app-4-service created
# view the resource consumption of the pods
kubectl top pod
# NAME CPU(cores) MEMORY(bytes)
# flask-app-4-668b99c9-479lx 2m 19Mi
# flask-app-4-668b99c9-bttkl 2m 19Mi
flask-app-vpa.yamlapiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: flask-app
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: flask-app-4
updatePolicy:
updateMode: "Off" # You can set this to "Auto" if you want automatic updates
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed:
cpu: 100m
maxAllowed:
cpu: 1000m
controlledResources: ["cpu"]
kubectl create -f vpa-cpu.yml
# verticalpodautoscaler.autoscaling.k8s.io/flask-app created
# confirm
kubectl get vpa
# NAME MODE CPU MEM PROVIDED AGE
# flask-app Off 22s
#!/bin/bash
echo "Load initiated in the background. Please do not terminate this process."
timeout 1000s bash -c 'for i in {1..10}; do (while true; do curl -s http://controlplane:30080 > /dev/null; done) & done; wait'