Sprechen Sie über Kubernetes Pod Vertical Auto-Scaling (VPA)
Betriebs- und Wartungsgespräch für Scofield-Neulinge
Einführung in VPA
Der vollständige Name von VPA lautet Vertical Pod Autoscaler (Vertikaler Pod-Autoscaler). Dies bedeutet vertikale Pod-automatische Skalierung. Er setzt automatisch CPU- und Speicheranforderungen entsprechend der Ressourcennutzung des Containers und ermöglicht so eine ordnungsgemäße Planung auf Knoten, um geeignete Ressourcen für jeden Pod bereitzustellen.
Es kann nicht nur den Container verkleinern, der übermäßig Ressourcen anfordert, sondern auch die Kapazität unzureichender Ressourcen jederzeit entsprechend seiner Verwendung erhöhen.
PS: VPA ändert die Ressourcenlimits von Pod nicht.
Nicht viel Unsinn, gehen Sie einfach zum Bild und sehen Sie sich den VPA-Workflow an
Beginne als nächstes den eigentlichen Kampf
Stellen Sie den Metrics-Server bereit
1. Laden Sie die Bereitstellungsmanifestdatei herunter
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml
2. Ändern Sie die Datei components.yaml
- Die Spiegeladresse wurde geändert. Gcr.io ist mein eigenes Lager
- Der Startparameter args für den Metrikserver wurde geändert. Andernfalls wird ein Fehler gemeldet, der die Metriken nicht vollständig aus der Quelle kubelet_summary entfernen kann.
- name: metrics-server
image: scofield/metrics-server:v0.3.7
imagePullPolicy: IfNotPresent
args:
- --cert-dir=/tmp
- --secure-port=4443
- /metrics-server
- --kubelet-insecure-tls
- --kubelet-preferred-address-types=InternalIP
3. Führen Sie die Bereitstellung durch
kubectl apply -f components.yaml
4. Überprüfung
[root@k8s-node001 metrics-server]# kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
metrics-server-7947cb98b6-xw6b8 1/1 Running 0 10m
能获取要top信息视为成功
[root@k8s-node001 metrics-server]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-node001 618m 7% 4796Mi 15%
k8s-node003 551m 6% 5522Mi 17%
k8s-node004 308m 3% 5830Mi 18%
k8s-node005 526m 6% 5997Mi 38%
k8s-node002 591m 7% 5306Mi 33%
Stellen Sie den Vertical-Pod-Autoscaler bereit
1. Klonen Sie das Autoscaler-Projekt
git clone https://github.com/kubernetes/autoscaler.git
2. Ändern Sie die Bereitstellungsdatei und ändern Sie das gcr-Warehouse in mein eigenes Warehouse
admission-controller-deployment.yaml
us.gcr.io/k8s-artifacts-prod/autoscaling/vpa-admission-controller:0.8.0
改为
scofield/vpa-admission-controller:0.8.0
recommender-deployment.yaml
us.gcr.io/k8s-artifacts-prod/autoscaling/vpa-recommender:0.8.0
改为
image: scofield/vpa-recommender:0.8.0
updater-deployment.yaml
us.gcr.io/k8s-artifacts-prod/autoscaling/vpa-updater:0.8.0
改为
scofield/vpa-updater:0.8.0
3. Bereitstellung
[root@k8s-node001 vertical-pod-autoscaler]# cd autoscaler/vertical-pod-autoscaler
[root@k8s-node001 vertical-pod-autoscaler]# ./hack/vpa-up.sh
Warning: apiextensions.k8s.io/v1beta1 CustomResourceDefinition is deprecated in v1.16+, unavailable in v1.22+; use apiextensions.k8s.io/v1 CustomResourceDefinition
customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalers.autoscaling.k8s.io created
customresourcedefinition.apiextensions.k8s.io/verticalpodautoscalercheckpoints.autoscaling.k8s.io created
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-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-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-evictionter-binding created
serviceaccount/vpa-admission-controller 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
serviceaccount/vpa-updater created
deployment.apps/vpa-updater created
serviceaccount/vpa-recommender created
deployment.apps/vpa-recommender created
Generating certs for the VPA Admission Controller in /tmp/vpa-certs.
Generating RSA private key, 2048 bit long modulus (2 primes)
............................................................................+++++
.+++++
e is 65537 (0x010001)
Generating RSA private key, 2048 bit long modulus (2 primes)
............+++++
...........................................................................+++++
e is 65537 (0x010001)
Signature ok
subject=CN = vpa-webhook.kube-system.svc
Getting CA Private Key
Uploading certs to the cluster.
secret/vpa-tls-certs created
Deleting /tmp/vpa-certs.
deployment.apps/vpa-admission-controller created
service/vpa-webhook created
4. Überprüfen Sie die Ergebnisse. Sie können sehen, dass Metrics-Server und vpa bereits normal ausgeführt werden
[root@k8s-node001 autoscaler-master]# kubectl get po -n kube-system
NAME READY STATUS RESTARTS AGE
metrics-server-7947cb98b6-xw6b8 1/1 Running 0 46m
vpa-admission-controller-7d87559549-g77h9 1/1 Running 0 10m
vpa-recommender-84bf7fb9db-65669 1/1 Running 0 10m
vpa-updater-79cc46c7bb-5p889 1/1 Running 0 10m
Beispiel 1 updateMode: "Aus"
1. Zuerst stellen wir einen Nginx-Dienst bereit und stellen ihn im Namespace bereit: vpa
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: vpa
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources:
requests:
cpu: 100m
memory: 250Mi
Schauen Sie sich die Ergebnisse an, 2 Pods liefen normal
[root@k8s-node001 examples]# kubectl get po -n vpa
NAME READY STATUS RESTARTS AGE
pod/nginx-6884b849f7-fswx5 1/1 Running 0 5m54s
pod/nginx-6884b849f7-wz6b8 1/1 Running 0 5m54s
2. Für einen günstigen Drucktest erstellen wir einen NodePort-Service
[root@k8s-node001 examples]# cat nginx-vpa-ingress.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: vpa
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
[root@k8s-node001 examples]# kubectl get svc -n vpa
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx NodePort 10.97.250.131 <none> 80:32621/TCP 55s
[root@k8s-node001 examples]# curl -I 192.168.100.185:32621
HTTP/1.1 200 OK
3. Um einen VPA zu erstellen, verwenden Sie
zuerst den updateMode: "Aus" -Modus. In diesem Modus werden nur Ressourcen abgerufen. Es wird empfohlen, den Pod nicht zu aktualisieren
[root@k8s-node001 examples]# cat nginx-vpa-demo.yaml
apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
name: nginx-vpa
namespace: vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: nginx
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: "nginx"
minAllowed:
cpu: "250m"
memory: "100Mi"
maxAllowed:
cpu: "2000m"
memory: "2048Mi"
4. Zeigen Sie die Bereitstellungsergebnisse an
[root@k8s-node001 examples]# kubectl get vpa -n vpa
NAME AGE
nginx-vpa 2m34s
5. Verwenden Sie description, um vpa-Details anzuzeigen, wobei der Schwerpunkt auf den Containerempfehlungen liegt
[root@k8s-node001 examples]# kubectl describe vpa nginx-vpa -n vpa
Name: nginx-vpa
Namespace: vpa
....略去10000字 哈哈......
Update Policy:
Update Mode: Off
Status:
Conditions:
Last Transition Time: 2020-09-28T04:04:25Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: nginx
Lower Bound:
Cpu: 250m
Memory: 262144k
Target:
Cpu: 250m
Memory: 262144k
Uncapped Target:
Cpu: 25m
Memory: 262144k
Upper Bound:
Cpu: 803m
Memory: 840190575
Events: <none>
unter ihnen
Lower Bound: 下限值
Target: 推荐值
Upper Bound: 上限值
Uncapped Target: 如果没有为VPA提供最小或最大边界,则表示目标利用率
上述结果表明,推荐的 Pod 的 CPU 请求为 25m,推荐的内存请求为 262144k 字节。
6. Jetzt führen wir
einen Drucktest für nginx durch und führen einen Drucktestbefehl aus
[root@k8s-node001 examples]# ab -c 100 -n 10000000 http://192.168.100.185:32621/
This is ApacheBench, Version 2.3 <$Revision: 1843412 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.100.185 (be patient)
Completed 1000000 requests
Completed 2000000 requests
Completed 3000000 requests
7. Beachten Sie die Änderungen der VPA-Empfehlung in wenigen Minuten
[root@k8s-node001 ~]# kubectl describe vpa nginx-vpa -n vpa |tail -n 20
Conditions:
Last Transition Time: 2020-09-28T04:04:25Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: nginx
Lower Bound:
Cpu: 250m
Memory: 262144k
Target:
Cpu: 476m
Memory: 262144k
Uncapped Target:
Cpu: 476m
Memory: 262144k
Upper Bound:
Cpu: 2
Memory: 387578728
Events: <none>
Aus den Ausgabeinformationen geht hervor, dass VPA einen empfohlenen Wert für Pod: CPU: 476 m angibt, da wir hier updateMode: "Off" setzen, sodass der Pod nicht aktualisiert wird
Beispiel 2 updateMode: "Auto"
1. Jetzt setze ich updateMode: "Auto", um zu sehen, was der VPA tun wird.
Hier habe ich die Ressourcen geändert in: Speicher: 50Mi, CPU: 100m
[root@k8s-node001 examples]# kubectl apply -f nginx-vpa.yaml
deployment.apps/nginx created
[root@k8s-node001 examples]# cat nginx-vpa.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: vpa
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources:
requests:
cpu: 100m
memory: 50Mi
[root@k8s-node001 examples]# kubectl get po -n vpa
NAME READY STATUS RESTARTS AGE
nginx-7ff65f974c-f4vgl 1/1 Running 0 114s
nginx-7ff65f974c-v9ccx 1/1 Running 0 114s
2. Stellen Sie vpa erneut bereit. Hier ändert die VPA-Bereitstellungsdatei nginx-vpa-demo.yaml nur den u
pdateMode: "Auto" und den Namen: nginx-vpa-2
[root@k8s-node001 examples]# cat nginx-vpa-demo.yaml
apiVersion: autoscaling.k8s.io/v1beta2
kind: VerticalPodAutoscaler
metadata:
name: nginx-vpa-2
namespace: vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: nginx
updatePolicy:
updateMode: "Auto"
resourcePolicy:
containerPolicies:
- containerName: "nginx"
minAllowed:
cpu: "250m"
memory: "100Mi"
maxAllowed:
cpu: "2000m"
memory: "2048Mi"
[root@k8s-node001 examples]# kubectl apply -f nginx-vpa-demo.yaml
verticalpodautoscaler.autoscaling.k8s.io/nginx-vpa created
[root@k8s-node001 examples]# kubectl get vpa -n vpa
NAME AGE
nginx-vpa-2 9s
3. Druckprüfung erneut
ab -c 1000 -n 100000000 http://192.168.100.185:32621/
4. Verwenden Sie nach einigen Minuten "beschreiben", um die vpa-Details anzuzeigen, und beachten Sie auch nur die Containerempfehlungen
[root@k8s-node001 ~]# kubectl describe vpa nginx-vpa-2 -n vpa |tail -n 30
Min Allowed:
Cpu: 250m
Memory: 100Mi
Target Ref:
API Version: apps/v1
Kind: Deployment
Name: nginx
Update Policy:
Update Mode: Auto
Status:
Conditions:
Last Transition Time: 2020-09-28T04:48:25Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: nginx
Lower Bound:
Cpu: 250m
Memory: 262144k
Target:
Cpu: 476m
Memory: 262144k
Uncapped Target:
Cpu: 476m
Memory: 262144k
Upper Bound:
Cpu: 2
Memory: 262144k
Events: <none>
Ziel wird CPU: 587m, Speicher: 262144k
5. Sehen Sie sich das Ereignis an
[root@k8s-node001 ~]# kubectl get event -n vpa
LAST SEEN TYPE REASON OBJECT MESSAGE
33m Normal Pulling pod/nginx-7ff65f974c-f4vgl Pulling image "nginx"
33m Normal Pulled pod/nginx-7ff65f974c-f4vgl Successfully pulled image "nginx" in 15.880996269s
33m Normal Created pod/nginx-7ff65f974c-f4vgl Created container nginx
33m Normal Started pod/nginx-7ff65f974c-f4vgl Started container nginx
26m Normal EvictedByVPA pod/nginx-7ff65f974c-f4vgl Pod was evicted by VPA Updater to apply resource recommendation.
26m Normal Killing pod/nginx-7ff65f974c-f4vgl Stopping container nginx
35m Normal Scheduled pod/nginx-7ff65f974c-hnzr5 Successfully assigned vpa/nginx-7ff65f974c-hnzr5 to k8s-node005
35m Normal Pulling pod/nginx-7ff65f974c-hnzr5 Pulling image "nginx"
34m Normal Pulled pod/nginx-7ff65f974c-hnzr5 Successfully pulled image "nginx" in 40.750855715s
34m Normal Scheduled pod/nginx-7ff65f974c-v9ccx Successfully assigned vpa/nginx-7ff65f974c-v9ccx to k8s-node004
33m Normal Pulling pod/nginx-7ff65f974c-v9ccx Pulling image "nginx"
33m Normal Pulled pod/nginx-7ff65f974c-v9ccx Successfully pulled image "nginx" in 15.495315629s
33m Normal Created pod/nginx-7ff65f974c-v9ccx Created container nginx
33m Normal Started pod/nginx-7ff65f974c-v9ccx Started container nginx
Aus den Ausgabeinformationen geht hervor, dass vpa EvictedByVPA ausgeführt, nginx automatisch gestoppt und dann mit den von VPA empfohlenen Ressourcen einen neuen nginx gestartet
hat. Wir können den nginx-Pod überprüfen, um eine Bestätigung zu erhalten
[root@k8s-node001 ~]# kubectl describe po nginx-7ff65f974c-2m9zl -n vpa
Name: nginx-7ff65f974c-2m9zl
Namespace: vpa
Priority: 0
Node: k8s-node004/192.168.100.184
Start Time: Mon, 28 Sep 2020 00:46:19 -0400
Labels: app=nginx
pod-template-hash=7ff65f974c
Annotations: cni.projectcalico.org/podIP: 100.67.191.53/32
vpaObservedContainers: nginx
vpaUpdates: Pod resources updated by nginx-vpa: container 0: cpu request, memory request
Status: Running
IP: 100.67.191.53
IPs:
IP: 100.67.191.53
Controlled By: ReplicaSet/nginx-7ff65f974c
Containers:
nginx:
Container ID: docker://c96bcd07f35409d47232a0bf862a76a56352bd84ef10a95de8b2e3f6681df43d
Image: nginx
Image ID: docker-pullable://nginx@sha256:c628b67d21744fce822d22fdcc0389f6bd763daac23a6b77147d0712ea7102d0
Port: <none>
Host Port: <none>
State: Running
Started: Mon, 28 Sep 2020 00:46:38 -0400
Ready: True
Restart Count: 0
Requests:
cpu: 476m
memory: 262144k
Konzentrieren Sie sich auf Anforderungen: CPU: 476 m, Speicher: 262144 KB,
und schauen Sie dann auf die Bereitstellungsdatei zurück
requests:
cpu: 100m
memory: 50Mi
Jetzt können Sie wissen, was VPA getan hat. Wenn sich die Auslastung des Dienstes ändert, ändert sich die VPA-Empfehlung natürlich auch danach. Wenn die Ressourcen des aktuell ausgeführten Pods nicht den empfohlenen Wert von VPA erreichen, wird die Pod-Räumung ausgeführt und neue Dienste mit ausreichenden Ressourcen werden erneut bereitgestellt.
VPA-Nutzungsbeschränkungen
- Kann nicht mit HPA (Horizontal Pod Autoscaler) verwendet werden.
- Beispielsweise verwendet Pod einen Replikat-Controller, z. B. eine Bereitstellung oder StatefulSet
Was sind die Vorteile von VPA
- Pod-Ressourcen werden nach Bedarf verwendet, sodass die Clusterknoten effizient genutzt werden.
- Pods werden auf Knoten mit geeigneten verfügbaren Ressourcen angeordnet.
- Es ist nicht erforderlich, Benchmark-Aufgaben auszuführen, um die geeigneten Werte für CPU- und Speicheranforderungen zu ermitteln.
- VPA kann CPU- und Speicheranforderungen jederzeit ohne menschlichen Betrieb anpassen, sodass die Wartungszeit verkürzt werden kann.
Schließlich ist VPA eine relativ neue Funktion von Kubernetes. Sie wurde in der Produktionsumgebung nicht in großem Umfang praktiziert. Es wird nicht empfohlen, den automatischen Aktualisierungsmodus in der Online-Umgebung zu verwenden, aber Sie können die Ressourcennutzung von Kubernetes besser verstehen Service im empfohlenen Modus.
Weitere Informationen finden Sie auf der offiziellen Website
PS: Folgeartikel werden mit dev.kubeops.net synchronisiert
Hinweis: Die Bilder im Artikel stammen aus dem Internet. Wenn ein Verstoß vorliegt, kontaktieren Sie mich bitte, um ihn rechtzeitig zu löschen.