全部产品
Search
文档中心

Container Service for Kubernetes:Vertical Pod Autoscaler (VPA)

更新时间:Jul 02, 2025

Untuk secara otomatis menyesuaikan dan mengoptimalkan alokasi sumber daya berdasarkan penggunaan aktual pod serta memastikan pod dapat dijadwalkan ke node dengan sumber daya yang cukup, kami sarankan Anda mengaktifkan fitur Vertical Pod Autoscaler (VPA) untuk kontainer aplikasi. VPA memantau pola konsumsi sumber daya pod dan memberikan rekomendasi terkait alokasi CPU dan memori. Selain itu, VPA dapat menyesuaikan alokasi sumber daya tanpa mengubah jumlah replikasi pod. Fitur ini cocok untuk skenario seperti aplikasi stateful yang memerlukan pasokan sumber daya stabil.

Sebelum Anda mulai

Untuk membantu Anda lebih memahami fitur VPA, kami sarankan Anda mempelajari informasi dasar, catatan penggunaan, dan batasan yang diketahui sebelum melanjutkan. Untuk informasi lebih lanjut, lihat Pengenalan VPA Komunitas Kubernetes.

Selain itu, kluster Container Service for Kubernetes (ACK) menyediakan solusi penjadwalan elastis beban kerja (elastisitas lapisan penjadwalan) dan penjadwalan elastis node (elastisitas lapisan sumber daya). Kami sarankan Anda membaca topik Penjadwalan Otomatis untuk memahami skenario dan batasan dari solusi yang berbeda.

ack-vertical-pod-autoscaler pengenalan

VPA diimplementasikan berdasarkan komponen ack-vertical-pod-autoscaler untuk merekomendasikan dan secara otomatis menyesuaikan alokasi CPU serta parameter permintaan dan batas memori untuk kontainer dalam pod sesuai dengan kebutuhan sumber daya aktual. VPA juga mempertahankan rasio permintaan sumber daya terhadap batas sumber daya yang ditentukan dalam konfigurasi awal kontainer. Komponen ack-vertical-pod-autoscaler terdiri dari bagian-bagian berikut:

  • admission-controller: Menetapkan nilai permintaan sumber daya yang tepat untuk pod baru. Sebelum menginstal komponen admission-controller, Anda harus menggunakan skrip untuk menghasilkan sertifikat webhook.

  • recommender: Memantau penggunaan sumber daya saat ini dan masa lalu dari kontainer serta merekomendasikan konfigurasi sumber daya berdasarkan data yang terdeteksi untuk mencocokkan kebutuhan sumber daya dengan akurat.

  • updater: Memeriksa apakah konfigurasi sumber daya pod yang dikelola oleh VPA sudah benar. Jika tidak, updater akan menghentikan pod tersebut untuk rekonstruksi selanjutnya.

Peringatan

Penting

Fitur VPA masih dalam fase beta dan kinerjanya belum diuji dalam kluster berskala besar. Gunakan fitur ini dengan hati-hati. Jika Anda mengalami masalah atau memiliki saran, ajukan tiket untuk menghubungi tim layanan kontainer.

  • Pembaruan konfigurasi sumber daya pod yang sedang berjalan mengakibatkan pod restart dan rekreasi, serta mungkin dijadwalkan ulang ke node lain. VPA mendukung mekanisme pembaruan yang secara otomatis memperbarui permintaan sumber daya pod yang ada tanpa merestart pod, tetapi mekanisme ini masih dalam tahap pengujian.

  • VPA tidak mengusir pod yang tidak dikelola oleh pengontrol replikasi. Dalam VPA, mode Otomatis untuk pod semacam itu setara dengan mode Awal, artinya VPA menetapkan permintaan dan batas sumber daya untuk pod baru tetapi tidak secara otomatis menghapus dan membuat ulang pod yang sedang berjalan dengan alokasi sumber daya yang tidak tepat.

  • Kami tidak menyarankan Anda untuk menerapkan beberapa VPA pada beban kerja yang sama. Jika beberapa VPA cocok untuk pod pada saat yang sama, perilaku yang tidak terduga mungkin terjadi.

  • Permintaan sumber daya pod yang dimodifikasi oleh VPA mungkin melebihi batas atas sumber daya aktual, termasuk sumber daya node, sumber daya idle, dan kuota sumber daya, menyebabkan pod masuk ke status Pending dan gagal dijadwalkan. Dalam kasus ini, menggunakan penjadwalan otomatis node mungkin dapat menyelesaikan masalah ini: jika pemanfaatan sumber daya pod melebihi ambang penskalaan, pod akan diskalakan keluar. Namun, jika sumber daya node tidak mencukupi, pod gagal dijadwalkan dan masuk ke status Pending, yang kemudian memicu penjadwalan node. Untuk informasi lebih lanjut, lihat Aktifkan Penjadwalan Otomatis Node.

  • Kontroler VPA dan Horizontal Pod Autoscaler (HPA) tidak sepenuhnya kompatibel. Konflik mungkin terjadi jika Anda menggunakan VPA dan HPA untuk memantau penggunaan CPU dan memori. Konflik ini dapat dihindari jika HPA hanya memantau metrik kustom atau eksternal selain metrik CPU dan memori.

  • VPA menggunakan admission webhook sebagai kontroler admisi. Jika ada admission webhook lain di kluster, pastikan bahwa admission webhook ini tidak bertentangan dengan VPA.

    Catatan

    Urutan eksekusi kontroler admisi ditentukan dalam parameter konfigurasi API server.

  • VPA dapat menangani sebagian besar peristiwa kehabisan memori (OOM), tetapi tidak dapat menjamin keberhasilan dalam semua skenario.

Untuk informasi lebih lanjut tentang batasan yang diketahui dari VPA, lihat Batasan yang Diketahui VPA.

Langkah 1: Instal ack-vertical-pod-autoscaler

Anda dapat menginstal ack-vertical-pod-autoscaler menggunakan konsol untuk kluster yang menjalankan Kubernetes 1.26 atau lebih baru, atau menggunakan kubectl untuk kluster yang menjalankan Kubernetes sebelum 1.26.

Instal menggunakan konsol (disarankan)

Kami sarankan Anda menginstal ack-vertical-pod-autoscaler menggunakan konsol ACK karena mempermudah penggunaan dan mengurangi biaya pemeliharaan tanpa memerlukan pemahaman tentang kompleksitas yang mendasarinya.

Prasyarat

Catatan

Jika Anda menginstal VPA menggunakan kubectl, kami sarankan Anda menghapus VPA tersebut dan menginstal ulang menggunakan konsol. Untuk informasi lebih lanjut, lihat Bagaimana Cara Menggunakan Konsol untuk Mengelola VPA yang Diinstal Menggunakan kubectl?.

Langkah instalasi

  1. Masuk ke Konsol ACK. Di bilah navigasi kiri, klik Clusters.

  2. Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di bilah navigasi kiri, klik Add-ons.

  3. Di halaman Add-ons, temukan ack-vertical-pod-autoscaler dan selesaikan instalasi sesuai petunjuk.

Instal menggunakan kubectl

Prasyarat

Langkah-langkah

  1. Simpan file YAML untuk izin akses berbasis peran (RBAC) dan jalankan perintah untuk membuat file izin RBAC:

    Perluas untuk Melihat Template YAML RBAC

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: system:metrics-reader
    rules:
      - apiGroups:
          - "metrics.k8s.io"
        resources:
          - pods
        verbs:
          - get
          - list
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: system:vpa-actor
    rules:
      - apiGroups:
          - ""
        resources:
          - pods
          - nodes
          - limitranges
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - ""
        resources:
          - events
        verbs:
          - get
          - list
          - watch
          - create
      - apiGroups:
          - "poc.autoscaling.k8s.io"
        resources:
          - verticalpodautoscalers
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - "autoscaling.k8s.io"
        resources:
          - verticalpodautoscalers
        verbs:
          - get
          - list
          - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: system:vpa-status-actor
    rules:
      - apiGroups:
          - "autoscaling.k8s.io"
        resources:
          - verticalpodautoscalers/status
        verbs:
          - get
          - patch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: system:vpa-checkpoint-actor
    rules:
      - apiGroups:
          - "poc.autoscaling.k8s.io"
        resources:
          - verticalpodautoscalercheckpoints
        verbs:
          - get
          - list
          - watch
          - create
          - patch
          - delete
      - apiGroups:
          - "autoscaling.k8s.io"
        resources:
          - verticalpodautoscalercheckpoints
        verbs:
          - get
          - list
          - watch
          - create
          - patch
          - delete
      - apiGroups:
          - ""
        resources:
          - namespaces
        verbs:
          - get
          - list
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: system:evictioner
    rules:
      - apiGroups:
          - "apps"
          - "extensions"
        resources:
          - replicasets
        verbs:
          - get
      - apiGroups:
          - ""
        resources:
          - pods/eviction
        verbs:
          - create
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:metrics-reader
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:metrics-reader
    subjects:
      - kind: ServiceAccount
        name: vpa-recommender
        namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:vpa-actor
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-actor
    subjects:
      - kind: ServiceAccount
        name: vpa-recommender
        namespace: kube-system
      - kind: ServiceAccount
        name: vpa-updater
        namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:vpa-status-actor
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-status-actor
    subjects:
      - kind: ServiceAccount
        name: vpa-recommender
        namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:vpa-checkpoint-actor
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-checkpoint-actor
    subjects:
      - kind: ServiceAccount
        name: vpa-recommender
        namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: system:vpa-target-reader
    rules:
      - apiGroups:
        - '*'
        resources:
        - '*/scale'
        verbs:
        - get
        - watch
      - apiGroups:
          - ""
        resources:
          - replicationcontrollers
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - apps
        resources:
          - daemonsets
          - deployments
          - replicasets
          - statefulsets
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - batch
        resources:
          - jobs
          - cronjobs
        verbs:
          - get
          - list
          - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:vpa-target-reader-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-target-reader
    subjects:
      - kind: ServiceAccount
        name: vpa-recommender
        namespace: kube-system
      - kind: ServiceAccount
        name: vpa-admission-controller
        namespace: kube-system
      - kind: ServiceAccount
        name: vpa-updater
        namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:vpa-evictioner-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:evictioner
    subjects:
      - kind: ServiceAccount
        name: vpa-updater
        namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: vpa-admission-controller
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: vpa-recommender
      namespace: kube-system
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: vpa-updater
      namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: system:vpa-admission-controller
    rules:
      - apiGroups:
          - ""
        resources:
          - pods
          - configmaps
          - nodes
          - limitranges
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - "admissionregistration.k8s.io"
        resources:
          - mutatingwebhookconfigurations
        verbs:
          - create
          - delete
          - get
          - list
      - apiGroups:
          - "poc.autoscaling.k8s.io"
        resources:
          - verticalpodautoscalers
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - "autoscaling.k8s.io"
        resources:
          - verticalpodautoscalers
        verbs:
          - get
          - list
          - watch
      - apiGroups:
          - "coordination.k8s.io"
        resources:
          - leases
        verbs:
          - create
          - update
          - get
          - list
          - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:vpa-admission-controller
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-admission-controller
    subjects:
      - kind: ServiceAccount
        name: vpa-admission-controller
        namespace: kube-system
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: system:vpa-status-reader
    rules:
      - apiGroups:
          - "coordination.k8s.io"
        resources:
          - leases
        verbs:
          - get
          - list
          - watch
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
      name: system:vpa-status-reader-binding
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: system:vpa-status-reader
    subjects:
      - kind: ServiceAccount
        name: vpa-updater
        namespace: kube-system
    kubectl apply -f rbac.yaml
  2. Simpan template YAML untuk CustomResourceDefinition (CRD) dan jalankan perintah untuk membuat CRD untuk ack-vertical-pod-autoscaler:

    Catatan

    CRD meningkatkan skalabilitas kluster ACK. Untuk informasi lebih lanjut, lihat Perluas API Kubernetes dengan CustomResourceDefinitions.

    Template YAML untuk CRD adalah sebagai berikut:

    Versi Kubernetes sama dengan atau lebih baru dari 1.22 dan lebih lama dari 1.26

    Perluas untuk Melihat Template YAML CRD

    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      annotations:
        api-approved.kubernetes.io: https://github.com/kubernetes/kubernetes/pull/63797
        controller-gen.kubebuilder.io/version: v0.9.2
      creationTimestamp: null
      name: verticalpodautoscalercheckpoints.autoscaling.k8s.io
    spec:
      group: autoscaling.k8s.io
      names:
        kind: VerticalPodAutoscalerCheckpoint
        listKind: VerticalPodAutoscalerCheckpointList
        plural: verticalpodautoscalercheckpoints
        shortNames:
        - vpacheckpoint
        singular: verticalpodautoscalercheckpoint
      scope: Namespaced
      versions:
      - name: v1
        schema:
          openAPIV3Schema:
            description: VerticalPodAutoscalerCheckpoint adalah titik pemeriksaan dari status internal VPA yang digunakan untuk pemulihan setelah restart recommender.
            properties:
              apiVersion:
                description: 'APIVersion mendefinisikan skema versi dari representasi objek ini. Server harus mengonversi skema yang dikenali ke nilai internal terbaru, dan dapat menolak nilai yang tidak dikenali. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
                type: string
              kind:
                description: 'Kind adalah nilai string yang mewakili sumber daya REST yang diwakili oleh objek ini. Server dapat menyimpulkan ini dari endpoint yang dikirimkan klien. Tidak dapat diperbarui. Dalam CamelCase. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                type: string
              metadata:
                type: object
              spec:
                description: 'Spesifikasi titik pemeriksaan. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status.'
                properties:
                  containerName:
                    description: Nama kontainer yang dicatat dalam titik pemeriksaan.
                    type: string
                  vpaObjectName:
                    description: Nama objek VPA yang menyimpan objek VerticalPodAutoscalerCheckpoint.
                    type: string
                type: object
              status:
                description: Data dari titik pemeriksaan.
                properties:
                  cpuHistogram:
                    description: Titik pemeriksaan histogram untuk konsumsi CPU.
                    properties:
                      bucketWeights:
                        description: Peta dari indeks ember ke bobot ember.
                        type: object
                        x-kubernetes-preserve-unknown-fields: true
                      referenceTimestamp:
                        description: Timestamp referensi untuk sampel yang dikumpulkan dalam histogram ini.
                        format: date-time
                        nullable: true
                        type: string
                      totalWeight:
                        description: Jumlah sampel yang digunakan sebagai penyebut untuk bobot dari BucketWeights.
                        type: number
                    type: object
                  firstSampleStart:
                    description: Timestamp sampel pertama dari histogram.
                    format: date-time
                    nullable: true
                    type: string
                  lastSampleStart:
                    description: Timestamp sampel terakhir dari histogram.
                    format: date-time
                    nullable: true
                    type: string
                  lastUpdateTime:
                    description: Waktu ketika status terakhir diperbarui.
                    format: date-time
                    nullable: true
                    type: string
                  memoryHistogram:
                    description: Titik pemeriksaan histogram untuk konsumsi memori.
                    properties:
                      bucketWeights:
                        description: Peta dari indeks ember ke bobot ember.
                        type: object
                        x-kubernetes-preserve-unknown-fields: true
                      referenceTimestamp:
                        description: Timestamp referensi untuk sampel yang dikumpulkan dalam histogram ini.
                        format: date-time
                        nullable: true
                        type: string
                      totalWeight:
                        description: Jumlah sampel yang digunakan sebagai penyebut untuk bobot dari BucketWeights.
                        type: number
                    type: object
                  totalSamplesCount:
                    description: Jumlah total sampel dalam histogram.
                    type: integer
                  version:
                    description: Versi format data yang disimpan.
                    type: string
                type: object
            type: object
        served: true
        storage: true
      - name: v1beta2
        schema:
          openAPIV3Schema:
            description: VerticalPodAutoscalerCheckpoint adalah titik pemeriksaan dari status internal VPA yang digunakan untuk pemulihan setelah restart recommender.
            properties:
              apiVersion:
                description: 'APIVersion mendefinisikan skema versi dari representasi objek ini. Server harus mengonversi skema yang dikenali ke nilai internal terbaru, dan dapat menolak nilai yang tidak dikenali. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
                type: string
              kind:
                description: 'Kind adalah nilai string yang mewakili sumber daya REST yang diwakili oleh objek ini. Server dapat menyimpulkan ini dari endpoint yang dikirimkan klien. Tidak dapat diperbarui. Dalam CamelCase. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                type: string
              metadata:
                type: object
              spec:
                description: 'Spesifikasi titik pemeriksaan. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status.'
                properties:
                  containerName:
                    description: Nama kontainer yang dicatat dalam titik pemeriksaan.
                    type: string
                  vpaObjectName:
                    description: Nama objek VPA yang menyimpan objek VerticalPodAutoscalerCheckpoint.
                    type: string
                type: object
              status:
                description: Data dari titik pemeriksaan.
                properties:
                  cpuHistogram:
                    description: Titik pemeriksaan histogram untuk konsumsi CPU.
                    properties:
                      bucketWeights:
                        description: Peta dari indeks ember ke bobot ember.
                        type: object
                        x-kubernetes-preserve-unknown-fields: true
                      referenceTimestamp:
                        description: Timestamp referensi untuk sampel yang dikumpulkan dalam histogram ini.
                        format: date-time
                        nullable: true
                        type: string
                      totalWeight:
                        description: Jumlah sampel yang digunakan sebagai penyebut untuk bobot dari BucketWeights.
                        type: number
                    type: object
                  firstSampleStart:
                    description: Timestamp sampel pertama dari histogram.
                    format: date-time
                    nullable: true
                    type: string
                  lastSampleStart:
                    description: Timestamp sampel terakhir dari histogram.
                    format: date-time
                    nullable: true
                    type: string
                  lastUpdateTime:
                    description: Waktu ketika status terakhir diperbarui.
                    format: date-time
                    nullable: true
                    type: string
                  memoryHistogram:
                    description: Titik pemeriksaan histogram untuk konsumsi memori.
                    properties:
                      bucketWeights:
                        description: Peta dari indeks ember ke bobot ember.
                        type: object
                        x-kubernetes-preserve-unknown-fields: true
                      referenceTimestamp:
                        description: Timestamp referensi untuk sampel yang dikumpulkan dalam histogram ini.
                        format: date-time
                        nullable: true
                        type: string
                      totalWeight:
                        description: Jumlah sampel yang digunakan sebagai penyebut untuk bobot dari BucketWeights.
                        type: number
                    type: object
                  totalSamplesCount:
                    description: Jumlah total sampel dalam histogram.
                    type: integer
                  version:
                    description: Versi format data yang disimpan.
                    type: string
                type: object
            type: object
        served: true
        storage: false
    ---
    apiVersion: apiextensions.k8s.io/v1
    kind: CustomResourceDefinition
    metadata:
      annotations:
        api-approved.kubernetes.io: https://github.com/kubernetes/kubernetes/pull/63797
        controller-gen.kubebuilder.io/version: v0.9.2
      creationTimestamp: null
      name: verticalpodautoscalers.autoscaling.k8s.io
    spec:
      group: autoscaling.k8s.io
      names:
        kind: VerticalPodAutoscaler
        listKind: VerticalPodAutoscalerList
        plural: verticalpodautoscalers
        shortNames:
        - vpa
        singular: verticalpodautoscaler
      scope: Namespaced
      versions:
      - additionalPrinterColumns:
        - jsonPath: .spec.updatePolicy.updateMode
          name: Mode
          type: string
        - jsonPath: .status.recommendation.containerRecommendations[0].target.cpu
          name: CPU
          type: string
        - jsonPath: .status.recommendation.containerRecommendations[0].target.memory
          name: Mem
          type: string
        - jsonPath: .status.conditions[?(@.type=='RecommendationProvided')].status
          name: Provided
          type: string
        - jsonPath: .metadata.creationTimestamp
          name: Age
          type: date
        name: v1
        schema:
          openAPIV3Schema:
            description: VerticalPodAutoscaler adalah konfigurasi untuk autoscaler pod vertikal, yang secara otomatis mengelola sumber daya pod berdasarkan pemanfaatan sumber daya historis dan waktu nyata.
            properties:
              apiVersion:
                description: 'APIVersion mendefinisikan skema versi dari representasi objek ini. Server harus mengonversi skema yang dikenali ke nilai internal terbaru, dan dapat menolak nilai yang tidak dikenali. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
                type: string
              kind:
                description: 'Kind adalah nilai string yang mewakili sumber daya REST yang diwakili oleh objek ini. Server dapat menyimpulkan ini dari endpoint yang dikirimkan klien. Tidak dapat diperbarui. Dalam CamelCase. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                type: string
              metadata:
                type: object
              spec:
                description: 'Spesifikasi perilaku autoscaler. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status.'
                properties:
                  recommenders:
                    description: Recommender yang bertanggung jawab untuk menghasilkan rekomendasi untuk objek ini. Daftar harus kosong (kemudian recommender default akan menghasilkan rekomendasi) atau berisi tepat satu recommender.
                    items:
                      description: VerticalPodAutoscalerRecommenderSelector menunjuk ke recommender Vertical Pod Autoscaler tertentu. Di masa depan mungkin melewati parameter ke recommender.
                      properties:
                        name:
                          description: Nama recommender yang bertanggung jawab untuk menghasilkan rekomendasi untuk objek ini.
                          type: string
                      required:
                      - name
                      type: object
                    type: array
                  resourcePolicy:
                    description: Mengontrol bagaimana autoscaler menghitung sumber daya yang direkomendasikan. Kebijakan sumber daya dapat digunakan untuk menetapkan batasan pada rekomendasi untuk kontainer individu. Jika tidak ditentukan, autoscaler menghitung sumber daya yang direkomendasikan untuk semua kontainer dalam pod, tanpa batasan tambahan.
                    properties:
                      containerPolicies:
                        description: Kebijakan sumber daya per kontainer.
                        items:
                          description: ContainerResourcePolicy mengontrol bagaimana autoscaler menghitung sumber daya yang direkomendasikan untuk kontainer tertentu.
                          properties:
                            containerName:
                              description: Nama kontainer atau DefaultContainerResourcePolicy, dalam hal ini kebijakan digunakan oleh kontainer yang tidak memiliki kebijakan sendiri yang ditentukan.
                              type: string
                            controlledResources:
                              description: Menentukan jenis rekomendasi yang akan dihitung (dan mungkin diterapkan) oleh VPA. Jika tidak ditentukan, default [ResourceCPU, ResourceMemory] akan digunakan.
                              items:
                                description: ResourceName adalah nama yang mengidentifikasi berbagai sumber daya dalam ResourceList.
                                type: string
                              type: array
                            controlledValues:
                              description: Menentukan nilai sumber daya mana yang harus dikontrol. Defaultnya adalah "RequestsAndLimits".
                              enum:
                              - RequestsAndLimits
                              - RequestsOnly
                              type: string
                            maxAllowed:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Menentukan jumlah maksimum sumber daya yang akan direkomendasikan untuk kontainer. Defaultnya adalah tidak ada maksimum.
                              type: object
                            minAllowed:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Menentukan jumlah minimal sumber daya yang akan direkomendasikan untuk kontainer. Defaultnya adalah tidak ada minimum.
                              type: object
                            mode:
                              description: Apakah autoscaler diaktifkan untuk kontainer. Defaultnya adalah "Auto".
                              enum:
                              - Auto
                              - "Off"
                              type: string
                          type: object
                        type: array
                    type: object
                  targetRef:
                    description: TargetRef menunjuk ke pengontrol yang mengelola set pod untuk autoscaler untuk dikontrol - misalnya Deployment, StatefulSet. VerticalPodAutoscaler dapat ditargetkan pada pengontrol yang mengimplementasikan subresource skala (set pod diambil dari ScaleStatus pengontrol) atau beberapa pengontrol yang dikenal baik (misalnya untuk DaemonSet set pod dibaca dari spesifikasi pengontrol). Jika VerticalPodAutoscaler tidak dapat menggunakan target yang ditentukan, itu akan melaporkan kondisi ConfigUnsupported. Perhatikan bahwa VerticalPodAutoscaler tidak memerlukan implementasi penuh subresource skala - itu tidak akan menggunakannya untuk memodifikasi jumlah replika. Satu-satunya hal yang diambil adalah pemilih label yang cocok dengan pod yang dikelompokkan oleh sumber daya target.
                    properties:
                      apiVersion:
                        description: Versi API referensi
                        type: string
                      kind:
                        description: 'Jenis referensi; Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"'
                        type: string
                      name:
                        description: 'Nama referensi; Informasi lebih lanjut: http://kubernetes.io/docs/user-guide/identifiers#names'
                        type: string
                    required:
                    - kind
                    - name
                    type: object
                    x-kubernetes-map-type: atomic
                  updatePolicy:
                    description: Menggambarkan aturan tentang bagaimana perubahan diterapkan pada pod. Jika tidak ditentukan, semua bidang dalam `PodUpdatePolicy` disetel ke nilai default mereka.
                    properties:
                      minReplicas:
                        description: Jumlah minimal replika yang perlu tetap hidup agar Updater mencoba pengusiran pod (tergantung pada pemeriksaan lain seperti PDB). Hanya nilai positif yang diizinkan. Mengganti bendera global '--min-replicas'.
                        format: int32
                        type: integer
                      updateMode:
                        description: Mengontrol kapan autoscaler menerapkan perubahan pada sumber daya pod. Defaultnya adalah 'Auto'.
                        enum:
                        - "Off"
                        - Initial
                        - Recreate
                        - Auto
                        type: string
                    type: object
                required:
                - targetRef
                type: object
              status:
                description: Informasi saat ini tentang autoscaler.
                properties:
                  conditions:
                    description: Conditions adalah serangkaian kondisi yang diperlukan untuk autoscaler ini untuk menskalakan targetnya, dan menunjukkan apakah kondisi tersebut terpenuhi atau tidak.
                    items:
                      description: VerticalPodAutoscalerCondition menggambarkan status VerticalPodAutoscaler pada titik tertentu.
                      properties:
                        lastTransitionTime:
                          description: lastTransitionTime adalah waktu terakhir kondisi bertransisi dari satu status ke status lainnya
                          format: date-time
                          type: string
                        message:
                          description: message adalah penjelasan yang dapat dibaca manusia yang berisi detail tentang transisi
                          type: string
                        reason:
                          description: reason adalah alasan untuk transisi terakhir kondisi.
                          type: string
                        status:
                          description: status adalah status kondisi (True, False, Unknown)
                          type: string
                        type:
                          description: type menggambarkan kondisi saat ini
                          type: string
                      required:
                      - status
                      - type
                      type: object
                    type: array
                  recommendation:
                    description: Jumlah sumber daya yang direkomendasikan oleh autoscaler untuk pod yang dikontrol.
                    properties:
                      containerRecommendations:
                        description: Sumber daya yang direkomendasikan oleh autoscaler untuk setiap kontainer.
                        items:
                          description: RecommendedContainerResources adalah rekomendasi sumber daya yang dihitung oleh autoscaler untuk kontainer tertentu. Menghormati kebijakan sumber daya kontainer jika ada dalam spesifikasi. Secara khusus rekomendasi tidak dihasilkan untuk kontainer dengan `ContainerScalingMode` disetel ke 'Off'.
                          properties:
                            containerName:
                              description: Nama kontainer.
                              type: string
                            lowerBound:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Jumlah minimal sumber daya yang direkomendasikan. Mengamati ContainerResourcePolicy. Jumlah ini tidak dijamin cukup untuk aplikasi beroperasi dengan stabil, namun menjalankan dengan lebih sedikit sumber daya kemungkinan besar akan berdampak signifikan pada kinerja/ketersediaan.
                              type: object
                            target:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Jumlah sumber daya yang direkomendasikan. Mengamati ContainerResourcePolicy.
                              type: object
                            uncappedTarget:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Target sumber daya yang direkomendasikan terbaru yang dihitung oleh autoscaler untuk pod yang dikontrol, hanya berdasarkan penggunaan sumber daya aktual, tanpa mempertimbangkan ContainerResourcePolicy. Mungkin berbeda dari Rekomendasi jika penggunaan sumber daya aktual menyebabkan target melanggar ContainerResourcePolicy (lebih rendah dari MinAllowed atau lebih tinggi dari MaxAllowed). Digunakan hanya sebagai indikasi status, tidak akan memengaruhi penugasan sumber daya aktual.
                              type: object
                            upperBound:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Jumlah maksimal sumber daya yang direkomendasikan. Mengamati ContainerResourcePolicy. Setiap sumber daya yang dialokasikan melebihi nilai ini kemungkinan besar terbuang. Nilai ini mungkin lebih besar daripada jumlah maksimum yang sebenarnya dapat dikonsumsi oleh aplikasi.
                              type: object
                          required:
                          - target
                          type: object
                        type: array
                    type: object
                type: object
            required:
            - spec
            type: object
        served: true
        storage: true
        subresources: {}
      - deprecated: true
        deprecationWarning: API autoscaling.k8s.io/v1beta2 sudah usang
        name: v1beta2
        schema:
          openAPIV3Schema:
            description: VerticalPodAutoscaler adalah konfigurasi untuk autoscaler pod vertikal, yang secara otomatis mengelola sumber daya pod berdasarkan pemanfaatan sumber daya historis dan waktu nyata.
            properties:
              apiVersion:
                description: 'APIVersion mendefinisikan skema versi dari representasi objek ini. Server harus mengonversi skema yang dikenali ke nilai internal terbaru, dan dapat menolak nilai yang tidak dikenali. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
                type: string
              kind:
                description: 'Kind adalah nilai string yang mewakili sumber daya REST yang diwakili oleh objek ini. Server dapat menyimpulkan ini dari endpoint yang dikirimkan klien. Tidak dapat diperbarui. Dalam CamelCase. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
                type: string
              metadata:
                type: object
              spec:
                description: 'Spesifikasi perilaku autoscaler. Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status.'
                properties:
                  resourcePolicy:
                    description: Mengontrol bagaimana autoscaler menghitung sumber daya yang direkomendasikan. Kebijakan sumber daya dapat digunakan untuk menetapkan batasan pada rekomendasi untuk kontainer individu. Jika tidak ditentukan, autoscaler menghitung sumber daya yang direkomendasikan untuk semua kontainer dalam pod, tanpa batasan tambahan.
                    properties:
                      containerPolicies:
                        description: Kebijakan sumber daya per kontainer.
                        items:
                          description: ContainerResourcePolicy mengontrol bagaimana autoscaler menghitung sumber daya yang direkomendasikan untuk kontainer tertentu.
                          properties:
                            containerName:
                              description: Nama kontainer atau DefaultContainerResourcePolicy, dalam hal ini kebijakan digunakan oleh kontainer yang tidak memiliki kebijakan sendiri yang ditentukan.
                              type: string
                            maxAllowed:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Menentukan jumlah maksimum sumber daya yang akan direkomendasikan untuk kontainer. Defaultnya adalah tidak ada maksimum.
                              type: object
                            minAllowed:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Menentukan jumlah minimal sumber daya yang akan direkomendasikan untuk kontainer. Defaultnya adalah tidak ada minimum.
                              type: object
                            mode:
                              description: Apakah autoscaler diaktifkan untuk kontainer. Defaultnya adalah "Auto".
                              enum:
                              - Auto
                              - "Off"
                              type: string
                          type: object
                        type: array
                    type: object
                  targetRef:
                    description: TargetRef menunjuk ke pengontrol yang mengelola set pod untuk autoscaler untuk dikontrol - misalnya Deployment, StatefulSet. VerticalPodAutoscaler dapat ditargetkan pada pengontrol yang mengimplementasikan subresource skala (set pod diambil dari ScaleStatus pengontrol) atau beberapa pengontrol yang dikenal baik (misalnya untuk DaemonSet set pod dibaca dari spesifikasi pengontrol). Jika VerticalPodAutoscaler tidak dapat menggunakan target yang ditentukan, itu akan melaporkan kondisi ConfigUnsupported. Perhatikan bahwa VerticalPodAutoscaler tidak memerlukan implementasi penuh subresource skala - itu tidak akan menggunakannya untuk memodifikasi jumlah replika. Satu-satunya hal yang diambil adalah pemilih label yang cocok dengan pod yang dikelompokkan oleh sumber daya target.
                    properties:
                      apiVersion:
                        description: Versi API referensi
                        type: string
                      kind:
                        description: 'Jenis referensi; Informasi lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"'
                        type: string
                      name:
                        description: 'Nama referensi; Informasi lebih lanjut: http://kubernetes.io/docs/user-guide/identifiers#names'
                        type: string
                    required:
                    - kind
                    - name
                    type: object
                    x-kubernetes-map-type: atomic
                  updatePolicy:
                    description: Menggambarkan aturan tentang bagaimana perubahan diterapkan pada pod. Jika tidak ditentukan, semua bidang dalam `PodUpdatePolicy` disetel ke nilai default mereka.
                    properties:
                      updateMode:
                        description: Mengontrol kapan autoscaler menerapkan perubahan pada sumber daya pod. Defaultnya adalah 'Auto'.
                        enum:
                        - "Off"
                        - Initial
                        - Recreate
                        - Auto
                        type: string
                    type: object
                required:
                - targetRef
                type: object
              status:
                description: Informasi saat ini tentang autoscaler.
                properties:
                  conditions:
                    description: Conditions adalah serangkaian kondisi yang diperlukan untuk autoscaler ini untuk menskalakan targetnya, dan menunjukkan apakah kondisi tersebut terpenuhi atau tidak.
                    items:
                      description: VerticalPodAutoscalerCondition menggambarkan status VerticalPodAutoscaler pada titik tertentu.
                      properties:
                        lastTransitionTime:
                          description: lastTransitionTime adalah waktu terakhir kondisi bertransisi dari satu status ke status lainnya
                          format: date-time
                          type: string
                        message:
                          description: message adalah penjelasan yang dapat dibaca manusia yang berisi detail tentang transisi
                          type: string
                        reason:
                          description: reason adalah alasan untuk transisi terakhir kondisi.
                          type: string
                        status:
                          description: status adalah status kondisi (True, False, Unknown)
                          type: string
                        type:
                          description: type menggambarkan kondisi saat ini
                          type: string
                      required:
                      - status
                      - type
                      type: object
                    type: array
                  recommendation:
                    description: Jumlah sumber daya yang direkomendasikan oleh autoscaler untuk pod yang dikontrol.
                    properties:
                      containerRecommendations:
                        description: Sumber daya yang direkomendasikan oleh autoscaler untuk setiap kontainer.
                        items:
                          description: RecommendedContainerResources adalah rekomendasi sumber daya yang dihitung oleh autoscaler untuk kontainer tertentu. Menghormati kebijakan sumber daya kontainer jika ada dalam spesifikasi. Secara khusus rekomendasi tidak dihasilkan untuk kontainer dengan `ContainerScalingMode` disetel ke 'Off'.
                          properties:
                            containerName:
                              description: Nama kontainer.
                              type: string
                            lowerBound:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Jumlah minimal sumber daya yang direkomendasikan. Mengamati ContainerResourcePolicy. Jumlah ini tidak dijamin cukup untuk aplikasi beroperasi dengan stabil, namun menjalankan dengan lebih sedikit sumber daya kemungkinan besar akan berdampak signifikan pada kinerja/ketersediaan.
                              type: object
                            target:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Jumlah sumber daya yang direkomendasikan. Mengamati ContainerResourcePolicy.
                              type: object
                            uncappedTarget:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Target sumber daya yang direkomendasikan terbaru yang dihitung oleh autoscaler untuk pod yang dikontrol, hanya berdasarkan penggunaan sumber daya aktual, tanpa mempertimbangkan ContainerResourcePolicy. Mungkin berbeda dari Rekomendasi jika penggunaan sumber daya aktual menyebabkan target melanggar ContainerResourcePolicy (lebih rendah dari MinAllowed atau lebih tinggi dari MaxAllowed). Digunakan hanya sebagai indikasi status, tidak akan memengaruhi penugasan sumber daya aktual.
                              type: object
                            upperBound:
                              additionalProperties:
                                anyOf:
                                - type: integer
                                - type: string
                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                x-kubernetes-int-or-string: true
                              description: Jumlah maksimal sumber daya yang direkomendasikan. Mengamati ContainerResourcePolicy. Setiap sumber daya yang dialokasikan melebihi nilai ini kemungkinan besar terbuang. Nilai ini mungkin lebih besar daripada jumlah maksimum yang sebenarnya dapat dikonsumsi oleh aplikasi.
                              type: object
                          required:
                          - target
                          type: object
                        type: array
                    type: object
                type: object
            required:
            - spec
            type: object
        served: true
        storage: false

    Versi Kubernetes lebih awal dari 1.22

    Perluas untuk Melihat Template YAML CRD

    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: verticalpodautoscalers.autoscaling.k8s.io
      annotations:
        "api-approved.kubernetes.io": "https://github.com/kubernetes/kubernetes/pull/63797"
    spec:
      group: autoscaling.k8s.io
      scope: Namespaced
      names:
        plural: verticalpodautoscalers
        singular: verticalpodautoscaler
        kind: VerticalPodAutoscaler
        shortNames:
          - vpa
      version: v1beta1
      versions:
        - name: v1beta1
          served: false
          storage: false
        - name: v1beta2
          served: true
          storage: true
        - name: v1
          served: true
          storage: false
      validation:
        # openAPIV3Schema adalah skema untuk memvalidasi objek kustom.
        openAPIV3Schema:
          type: object
          properties:
            spec:
              type: object
              required: []
              properties:
                targetRef:
                  type: object
                updatePolicy:
                  type: object
                  properties:
                    updateMode:
                      type: string
                resourcePolicy:
                  type: object
                  properties:
                    containerPolicies:
                      type: array
                      items:
                        type: object
                        properties:
                          containerName:
                            type: string
                          controlledValues:
                            type: string
                            enum: ["RequestsAndLimits", "RequestsOnly"]
                          mode:
                            type: string
                            enum: ["Auto", "Off"]
                          minAllowed:
                            type: object
                          maxAllowed:
                            type: object
                          controlledResources:
                            type: array
                            items:
                              type: string
                              enum: ["cpu", "memory"]
    ---
    apiVersion: apiextensions.k8s.io/v1beta1
    kind: CustomResourceDefinition
    metadata:
      name: verticalpodautoscalercheckpoints.autoscaling.k8s.io
      annotations:
        "api-approved.kubernetes.io": "https://github.com/kubernetes/kubernetes/pull/63797"
    spec:
      group: autoscaling.k8s.io
      scope: Namespaced
      names:
        plural: verticalpodautoscalercheckpoints
        singular: verticalpodautoscalercheckpoint
        kind: VerticalPodAutoscalerCheckpoint
        shortNames:
          - vpacheckpoint
      version: v1beta1
      versions:
        - name: v1beta1
          served: false
          storage: false
        - name: v1beta2
          served: true
          storage: true
        - name: v1
          served: true
          storage: false
    kubectl apply -f crd.yaml
  3. Instal komponen admission-controller, recommender, dan updater dari ack-vertical-pod-autoscaler.

    Versi Kubernetes sama dengan atau lebih baru dari 1.22 dan lebih lama dari 1.26

    Instal admission-controller

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-admission-controller
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: vpa-admission-controller
      template:
        metadata:
          labels:
            app: vpa-admission-controller
        spec:
          serviceAccountName: vpa-admission-controller
          securityContext:
            runAsNonRoot: true
            runAsUser: 65534 # nobody
          containers:
            - name: admission-controller
              image: registry.cn-hangzhou.aliyuncs.com/acs/vpa-admission-controller:0.13.0
              imagePullPolicy: Always
              env:
                - name: NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
              volumeMounts:
                - name: tls-certs
                  mountPath: "/etc/tls-certs"
                  readOnly: true
              resources:
                limits:
                  cpu: 200m
                  memory: 500Mi
                requests:
                  cpu: 50m
                  memory: 200Mi
              ports:
                - containerPort: 8000
                - name: prometheus
                  containerPort: 8944
          volumes:
            - name: tls-certs
              secret:
                secretName: vpa-tls-certs
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: vpa-webhook
      namespace: kube-system
    spec:
      ports:
        - port: 443
          targetPort: 8000
      selector:
        app: vpa-admission-controller

    Instal recommender

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-recommender
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: vpa-recommender
      template:
        metadata:
          labels:
            app: vpa-recommender
        spec:
          serviceAccountName: vpa-recommender
          securityContext:
            runAsNonRoot: true
            runAsUser: 65534 # nobody
          containers:
          - name: recommender
            image: registry.cn-hangzhou.aliyuncs.com/acs/vpa-recommender:0.13.0
            imagePullPolicy: Always
            resources:
              limits:
                cpu: 200m
                memory: 1000Mi
              requests:
                cpu: 50m
                memory: 500Mi
            ports:
            - name: prometheus
              containerPort: 8942

    Instal updater

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-updater
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: vpa-updater
     template:
        metadata:
          labels:
            app: vpa-updater
        spec:
          serviceAccountName: vpa-updater
          securityContext:
            runAsNonRoot: true
            runAsUser: 65534 # nobody
          containers:
            - name: updater
              image: registry.cn-hangzhou.aliyuncs.com/acs/vpa-updater:0.13.0
              imagePullPolicy: Always
              env:
                - name: NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
              resources:
                limits:
                  cpu: 200m
                  memory: 1000Mi
                requests:
                  cpu: 50m
                  memory: 500Mi
              ports:
                - name: prometheus
                  containerPort: 8943

    Versi Kubernetes lebih lama dari 1.22

    Instal admission-controller

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-admission-controller
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: vpa-admission-controller
      template:
        metadata:
          labels:
            app: vpa-admission-controller
        spec:
          serviceAccountName: admin
          containers:
            - name: admission-controller
              image: registry.cn-hangzhou.aliyuncs.com/acs/vpa-admission-controller:0.7.0
              imagePullPolicy: Always
              env:
                - name: NAMESPACE
                  valueFrom:
                    fieldRef:
                      fieldPath: metadata.namespace
              volumeMounts:
                - name: tls-certs
                  mountPath: "/etc/tls-certs"
                  readOnly: true
              resources:
                limits:
                  cpu: 200m
                  memory: 500Mi
                requests:
                  cpu: 50m
                  memory: 200Mi
              ports:
                - containerPort: 8000
          volumes:
            - name: tls-certs
              secret:
                secretName: vpa-tls-certs
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: vpa-webhook
      namespace: kube-system
    spec:
      ports:
        - port: 443
          targetPort: 8000
      selector:
        app: vpa-admission-controller

    Instal recommender

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-recommender
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: vpa-recommender
      template:
        metadata:
          labels:
            app: vpa-recommender
        spec:
          serviceAccountName: admin
          containers:
          - name: recommender
            image: registry.cn-hangzhou.aliyuncs.com/acs/vpa-recommender:0.7.0
            imagePullPolicy: Always
            resources:
              limits:
                cpu: 200m
                memory: 1000Mi
              requests:
                cpu: 50m
                memory: 500Mi
            ports:
            - containerPort: 8080

    Instal Pembaruan

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: vpa-updater
      namespace: kube-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: vpa-updater
      template:
        metadata:
          labels:
            app: vpa-updater
        spec:
          serviceAccountName: admin
          containers:
            - name: updater
              image: registry.cn-hangzhou.aliyuncs.com/acs/vpa-updater:0.7.0
              imagePullPolicy: Always
              resources:
                limits:
                  cpu: 200m
                  memory: 1000Mi
                requests:
                  cpu: 50m
                  memory: 500Mi
              ports:
                - containerPort: 8080

Langkah 2: Verifikasi VPA telah terinstal

  1. Simpan template YAML berikut dan jalankan perintah untuk membuat Deployment bernama nginx-deployment-basic:

    Perluas untuk Melihat Template nginx-deployment-basic.yaml

    Catatan

    Kosongkan bidang requests dan limits dalam konfigurasi Deployment.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - name: nginx
            image: nginx:1.7.9
            ports:
            - containerPort: 80
    kubectl apply -f nginx-deployment-basic.yaml
  2. Simpan template YAML berikut dan jalankan perintah untuk membuat sumber daya VPA bernama nginx-deployment-basic-vpa:

    Perluas untuk Melihat Template nginx-deployment-basic-vpa.yaml

    Catatan

    Anda dapat mengatur updateMode ke Off atau Auto sesuai kebutuhan.

    • Off (disarankan): Merekomendasikan konfigurasi permintaan dan batas sumber daya pod berdasarkan konsumsi sumber daya kluster tetapi tidak secara otomatis memperbarui konfigurasi sumber daya pod.

    • Auto: Merekomendasikan konfigurasi permintaan dan batas sumber daya pod berdasarkan konsumsi sumber daya kluster dan secara otomatis memperbarui konfigurasi sumber daya pod.

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: nginx-deployment-basic-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       nginx-deployment-basic
      updatePolicy:
        updateMode: "Off" # Setel ke off.
    kubectl apply -f nginx-deployment-basic-vpa.yaml
  3. Jalankan perintah berikut untuk menanyakan nilai requests untuk sumber daya CPU dan memori yang direkomendasikan oleh VPA untuk Deployment:

    kubectl describe vpa nginx-deployment-basic-vpa

    Output yang diharapkan mungkin memerlukan waktu sekitar dua menit. Output berikut menunjukkan contoh rekomendasi permintaan sumber daya:

    Perluas untuk Melihat Output yang Diharapkan

      Recommendation:
        Container Recommendations:
          Container Name:  nginx
          Lower Bound:
            Cpu:     25m
            Memory:  262144k
          Target:
            Cpu:     25m
            Memory:  262144k
          Uncapped Target:
            Cpu:     25m
            Memory:  262144k
          Upper Bound:
            Cpu:     11601m
            Memory:  12128573170

    Anda dapat menentukan permintaan sumber daya requests untuk Deployment berdasarkan rekomendasi. VPA terus memantau penggunaan sumber daya Deployment dan memberikan saran optimisasi.

Bagaimana cara menggunakan konsol untuk mengelola VPA yang diinstal menggunakan kubectl?

Untuk kluster yang menjalankan Kubernetes 1.26 atau lebih baru, kami sarankan Anda menggunakan konsol untuk menginstal komponen ack-vertical-pod-autoscaler dan mengelola VPA. Anda harus menghapus VPA yang ada yang diinstal menggunakan kubectl, dan menginstal ulang melalui konsol untuk menghindari konflik antara VPA baru dan yang sudah ada.

Perluas untuk Melihat Prosedur

Langkah 1: Uninstal VPA yang diterapkan di kluster

Uninstal VPA yang diterapkan di kluster, termasuk membersihkan sumber daya seperti Deployments, izin RBAC, Secrets, CRD, dan Services, untuk menghindari konflik saat Anda menerapkan versi baru VPA.

  1. Dalam file YAML dari VPA yang ada seperti yang ditunjukkan dalam contoh nginx-deployment-basic-vpa.yaml di bawah ini, dalam bidang metadata, pertahankan hanya bidang name dan namespace dan hapus semua informasi lainnya. Selain itu, hapus informasi dalam bidang status. Kemudian, simpan file YAML ini untuk langkah-langkah selanjutnya.

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"autoscaling.k8s.io/v1","kind":"VerticalPodAutoscaler","metadata":{"annotations":{},"name":"nginx-deployment-basic-vpa","namespace":"default"},"spec":{"targetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx-deployment-basic"},"updatePolicy":{"updateMode":"Off"}}}
      creationTimestamp: "2024-02-29T06:03:35Z"
      generation: 1
      name: nginx-deployment-basic-vpa
      namespace: default
      resourceVersion: "56264"
      uid: 9f128737-d12e-46f6-b254-c1a7505c19c6
    spec:
      targetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx-deployment-basic
      updatePolicy:
        updateMode: "Off"
    status:
      conditions:
      - lastTransitionTime: "2024-02-29T06:03:55Z"
        status: "True"
        type: RecommendationProvided
      recommendation:
        containerRecommendations:
        - containerName: nginx
          lowerBound:
            cpu: 25m
            memory: 262144k
          target:
            cpu: 25m
            memory: 262144k
          uncappedTarget:
            cpu: 25m
            memory: 262144k
          upperBound:
            cpu: 25m
            memory: 262144k
    kubectl get vpa nginx-deployment-basic-vpa -oyaml
  2. Jalankan perintah berikut untuk menghapus sumber daya yang diinstal oleh VPA:

    // Hapus Deployment dan Service
    kubectl delete deployment vpa-admission-controller vpa-recommender vpa-updater -n kube-system
    kubectl delete svc vpa-webhook -n kube-system
    // Hapus ClusterRole
    kubectl delete clusterrole system:metrics-reader system:vpa-actor system:vpa-status-actor system:vpa-checkpoint-actor system:evictioner system:vpa-target-reader  system:vpa-admission-controller system:vpa-status-reader
    // Hapus ClusterRoleBinding
    kubectl delete clusterrolebinding system:metrics-reader system:vpa-actor system:vpa-status-actor system:vpa-checkpoint-actor system:vpa-target-reader-binding system:vpa-evictioner-binding system:vpa-admission-controller system:vpa-status-reader-binding
    // Hapus ServiceAccount
    kubectl delete sa vpa-admission-controller vpa-recommender vpa-updater -n kube-system
    // Hapus Secret
    kubectl delete secret vpa-tls-certs -n kube-system
    // Hapus CRD
    kubectl delete crd verticalpodautoscalercheckpoints.autoscaling.k8s.io verticalpodautoscalers.autoscaling.k8s.io

Langkah 2: Instal komponen ack-vertical-pod-autoscaler

  1. Masuk ke Konsol ACK. Di bilah navigasi kiri, klik Clusters.

  2. Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di bilah navigasi kiri, klik Add-ons.

  3. Di halaman Add-ons, temukan ack-vertical-pod-autoscaler dan selesaikan instalasi sesuai petunjuk.

Langkah 3: Redeploy file YAML dari VPA

Jalankan perintah berikut untuk menerapkan ulang file YAML yang disimpan di Langkah 1: Uninstal VPA yang Diterapkan di Kluster. Langkah ini menggunakan nginx-deployment-basic-vpa.yaml sebagai contoh:

kubectl apply -f nginx-deployment-basic-vpa.yaml