Sprechen Sie über Kubernetes Pod Vertical Auto-Scaling (VPA)

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

Sprechen Sie über Kubernetes Pod Vertical Auto-Scaling (VPA)

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.

Ich denke du magst

Origin blog.51cto.com/15060545/2657302
Empfohlen
Rangfolge