Layanan Kontainer Serverless (ACK Serverless) menyediakan vertical pod autoscaling melalui Vertical Pod Autoscaler (VPA). Setelah Anda menerapkan dan menginstal VPA pada kluster ACK serverless, VPA secara otomatis menetapkan batas resource untuk Pod berdasarkan penggunaan resource-nya. Hal ini memungkinkan kluster menjadwalkan Pod pada node yang memiliki resource mencukupi. VPA juga mempertahankan rasio antara permintaan dan batas resource dari definisi kontainer aslinya. Topik ini menjelaskan cara menggunakan file YAML untuk menerapkan vertical pod autoscaling.
Prasyarat
Pastikan prasyarat berikut terpenuhi:
Kluster Kubernetes versi 1.12 atau lebih baru telah dibuat. Untuk informasi selengkapnya, lihat Buat kluster ACK serverless.
Anda telah terhubung ke kluster menggunakan antarmuka baris perintah. Untuk informasi selengkapnya, lihat Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Semua penerapan VPA yang ada di kluster telah di-uninstall. Hal ini mencegah konflik dengan instalasi VPA baru yang dapat menyebabkan VPA tidak tersedia.
Informasi latar belakang
Fitur vertical pod autoscaling bersifat eksperimental. Gunakan dengan hati-hati.
Memperbarui konfigurasi resource Pod yang sedang berjalan merupakan fitur eksperimental VPA. Operasi ini akan membuat ulang dan merestart Pod, yang mungkin dijadwalkan ke node berbeda.
VPA tidak mengeluarkan (evict) Pod yang tidak dikelola oleh ReplicationController. Untuk Pod tersebut, mode Auto setara dengan mode Initial.
Saat ini, VPA tidak dapat dijalankan secara bersamaan dengan Horizontal Pod Autoscaler (HPA) yang memantau metrik CPU dan memori. Satu-satunya pengecualian adalah jika HPA hanya memantau metrik kustom atau eksternal lainnya.
VPA menggunakan admission webhook sebagai kontrol admisinya. Jika terdapat admission webhook lain di kluster, pastikan tidak terjadi konflik dengan webhook VPA. Urutan eksekusi admission controller ditentukan dalam parameter konfigurasi API Server.
VPA menangani sebagian besar event out-of-memory (OOM), tetapi efektivitasnya tidak dijamin dalam semua skenario.
Kinerja VPA belum diuji pada kluster berskala besar.
Nilai permintaan resource yang dimodifikasi oleh VPA dapat melebihi batas resource, seperti batas resource node, resource yang tersedia, atau kuota sumber daya. Hal ini dapat menyebabkan Pod masuk ke status Pending dan gagal dijadwalkan. Anda dapat menggunakan Cluster Autoscaler untuk mengatasi masalah ini.
Jika beberapa VPA cocok dengan Pod yang sama, hal ini dapat menyebabkan perilaku yang tidak terdefinisi.
Instal Vertical Pod Autoscaler
Jalankan perintah berikut untuk membuat file izin Role-Based Access Control (RBAC).
kubectl apply -f rbac.yamlPerluas untuk melihat file YAML
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 - patch - apiGroups: - "autoscaling.k8s.io" resources: - verticalpodautoscalers verbs: - get - list - watch - 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-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-systemJalankan perintah berikut untuk membuat CustomResourceDefinition (CRD) untuk Vertical Pod Autoscaler.
CRD memperluas kemampuan Kubernetes. Untuk informasi selengkapnya, lihat Perluas API Kubernetes dengan CustomResourceDefinitions.
kubectl apply -f crd.yamlDefinisi crd.yaml untuk versi kluster sebelum 1.22
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: falseDefinisi crd.yaml untuk versi kluster 1.22 dan seterusnya
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 checkpoint 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. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: description: 'Kind adalah nilai string yang merepresentasikan resource REST yang diwakili objek ini. Server dapat menyimpulkan hal ini dari endpoint tempat klien mengirim permintaan. Tidak dapat diperbarui. Dalam CamelCase. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string metadata: type: object spec: description: 'Spesifikasi checkpoint. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status.' properties: containerName: description: Nama kontainer yang di-checkpoint. type: string vpaObjectName: description: Nama objek VPA yang menyimpan objek VerticalPodAutoscalerCheckpoint. type: string type: object status: description: Data checkpoint. properties: cpuHistogram: description: Checkpoint histogram untuk konsumsi CPU. properties: bucketWeights: description: Peta dari indeks bucket ke bobot bucket. 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 saat status terakhir diperbarui. format: date-time nullable: true type: string memoryHistogram: description: Checkpoint histogram untuk konsumsi memori. properties: bucketWeights: description: Peta dari indeks bucket ke bobot bucket. 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 checkpoint 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. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: description: 'Kind adalah nilai string yang merepresentasikan resource REST yang diwakili objek ini. Server dapat menyimpulkan hal ini dari endpoint tempat klien mengirim permintaan. Tidak dapat diperbarui. Dalam CamelCase. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds' type: string metadata: type: object spec: description: 'Spesifikasi checkpoint. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status.' properties: containerName: description: Nama kontainer yang di-checkpoint. type: string vpaObjectName: description: Nama objek VPA yang menyimpan objek VerticalPodAutoscalerCheckpoint. type: string type: object status: description: Data checkpoint. properties: cpuHistogram: description: Checkpoint histogram untuk konsumsi CPU. properties: bucketWeights: description: Peta dari indeks bucket ke bobot bucket. 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 saat status terakhir diperbarui. format: date-time nullable: true type: string memoryHistogram: description: Checkpoint histogram untuk konsumsi memori. properties: bucketWeights: description: Peta dari indeks bucket ke bobot bucket. 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 vertical pod autoscaler, yang secara otomatis mengelola resource Pod berdasarkan pemanfaatan resource historis dan real time. 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. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: description: 'Kind adalah nilai string yang merepresentasikan resource REST yang diwakili objek ini. Server dapat menyimpulkan hal ini dari endpoint tempat klien mengirim permintaan. Tidak dapat diperbarui. Dalam CamelCase. Info 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. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status.' properties: recommenders: description: Recommender yang bertanggung jawab menghasilkan rekomendasi untuk objek ini. Daftar harus kosong (maka recommender default akan menghasilkan rekomendasi) atau berisi tepat satu recommender. items: description: VerticalPodAutoscalerRecommenderSelector mengarah ke Vertical Pod Autoscaler recommender tertentu. Di masa depan, ini mungkin akan pass parameter ke recommender. properties: name: description: Nama recommender yang bertanggung jawab menghasilkan rekomendasi untuk objek ini. type: string required: - name type: object type: array resourcePolicy: description: Mengontrol bagaimana autoscaler menghitung resource yang direkomendasikan. Kebijakan resource dapat digunakan untuk menetapkan batasan pada rekomendasi untuk kontainer individual. Jika tidak ditentukan, autoscaler menghitung resource yang direkomendasikan untuk semua kontainer dalam Pod, tanpa batasan tambahan. properties: containerPolicies: description: Kebijakan resource per kontainer. items: description: ContainerResourcePolicy mengontrol bagaimana autoscaler menghitung resource yang direkomendasikan untuk kontainer tertentu. properties: containerName: description: Nama kontainer atau DefaultContainerResourcePolicy, di mana kebijakan digunakan oleh kontainer yang tidak memiliki kebijakan sendiri. type: string controlledResources: description: Menentukan jenis rekomendasi yang akan dihitung (dan mungkin diterapkan) oleh VPA. Jika tidak ditentukan, nilai default [ResourceCPU, ResourceMemory] akan digunakan. items: description: ResourceName adalah nama yang mengidentifikasi berbagai resource dalam ResourceList. type: string type: array controlledValues: description: Menentukan nilai resource mana yang harus dikontrol. Nilai default 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 resource yang akan direkomendasikan untuk kontainer. Nilai default adalah tanpa 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 resource yang akan direkomendasikan untuk kontainer. Nilai default adalah tanpa minimum. type: object mode: description: Apakah autoscaler diaktifkan untuk kontainer. Nilai default adalah "Auto". enum: - Auto - "Off" type: string type: object type: array type: object targetRef: description: TargetRef mengarah ke controller yang mengelola kumpulan Pod untuk dikontrol oleh autoscaler—misalnya Deployment, StatefulSet. VerticalPodAutoscaler dapat ditargetkan pada controller yang mengimplementasikan subresource scale (kumpulan Pod diambil dari ScaleStatus controller) atau beberapa controller terkenal (misalnya untuk DaemonSet, kumpulan Pod dibaca dari spesifikasi controller). Jika VerticalPodAutoscaler tidak dapat menggunakan target yang ditentukan, kondisi ConfigUnsupported akan dilaporkan. Perhatikan bahwa VerticalPodAutoscaler tidak memerlukan implementasi lengkap subresource scale—tidak akan menggunakannya untuk memodifikasi jumlah replika. Satu-satunya hal yang diambil adalah pemilih label yang mencocokkan Pod yang dikelompokkan oleh resource target. properties: apiVersion: description: Versi API dari referensi type: string kind: description: 'Jenis referensi; Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"' type: string name: description: 'Nama referensi; Info 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 ke Pod. Jika tidak ditentukan, semua bidang dalam `PodUpdatePolicy` diatur ke nilai default-nya. properties: minReplicas: description: Jumlah minimal replika yang harus aktif agar Updater mencoba eviction Pod (menunggu pemeriksaan lain seperti PDB). Hanya nilai positif yang diizinkan. Menggantikan flag global '--min-replicas'. format: int32 type: integer updateMode: description: Mengontrol kapan autoscaler menerapkan perubahan ke resource Pod. Nilai default 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 kumpulan kondisi yang diperlukan agar autoscaler ini dapat 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 berpindah 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 tersebut type: string reason: description: reason adalah alasan transisi terakhir kondisi tersebut. type: string status: description: status adalah status kondisi tersebut (True, False, Unknown) type: string type: description: type menggambarkan kondisi saat ini type: string required: - status - type type: object type: array recommendation: description: Jumlah resource terbaru yang direkomendasikan oleh autoscaler untuk Pod yang dikontrol. properties: containerRecommendations: description: Resource yang direkomendasikan oleh autoscaler untuk setiap kontainer. items: description: RecommendedContainerResources adalah rekomendasi resource yang dihitung oleh autoscaler untuk kontainer tertentu. Menghormati kebijakan resource kontainer jika ada dalam spesifikasi. Secara khusus, rekomendasi tidak dihasilkan untuk kontainer dengan `ContainerScalingMode` diatur 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 resource yang direkomendasikan. Mengamati ContainerResourcePolicy. Jumlah ini tidak dijamin cukup agar aplikasi beroperasi secara stabil, namun menjalankan dengan resource kurang dari ini kemungkinan besar 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 resource 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 resource terbaru yang direkomendasikan oleh autoscaler untuk Pod yang dikontrol, berdasarkan hanya pada penggunaan resource aktual, tanpa mempertimbangkan ContainerResourcePolicy. Dapat berbeda dari Rekomendasi jika penggunaan resource aktual menyebabkan target melanggar ContainerResourcePolicy (lebih rendah dari MinAllowed atau lebih tinggi dari MaxAllowed). Hanya digunakan sebagai indikasi status, tidak akan memengaruhi alokasi resource 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 maksimum resource yang direkomendasikan. Mengamati ContainerResourcePolicy. Resource apa pun yang dialokasikan melebihi nilai ini kemungkinan besar terbuang. Nilai ini mungkin lebih besar dari jumlah maksimum yang sebenarnya dapat dikonsumsi 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 tidak digunakan lagi name: v1beta2 schema: openAPIV3Schema: description: VerticalPodAutoscaler adalah konfigurasi untuk vertical pod autoscaler, yang secara otomatis mengelola resource Pod berdasarkan pemanfaatan resource historis dan real time. 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. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources' type: string kind: description: 'Kind adalah nilai string yang merepresentasikan resource REST yang diwakili objek ini. Server dapat menyimpulkan hal ini dari endpoint tempat klien mengirim permintaan. Tidak dapat diperbarui. Dalam CamelCase. Info 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. Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status.' properties: resourcePolicy: description: Mengontrol bagaimana autoscaler menghitung resource yang direkomendasikan. Kebijakan resource dapat digunakan untuk menetapkan batasan pada rekomendasi untuk kontainer individual. Jika tidak ditentukan, autoscaler menghitung resource yang direkomendasikan untuk semua kontainer dalam Pod, tanpa batasan tambahan. properties: containerPolicies: description: Kebijakan resource per kontainer. items: description: ContainerResourcePolicy mengontrol bagaimana autoscaler menghitung resource yang direkomendasikan untuk kontainer tertentu. properties: containerName: description: Nama kontainer atau DefaultContainerResourcePolicy, di mana kebijakan digunakan oleh kontainer yang tidak memiliki kebijakan sendiri. 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 resource yang akan direkomendasikan untuk kontainer. Nilai default adalah tanpa 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 resource yang akan direkomendasikan untuk kontainer. Nilai default adalah tanpa minimum. type: object mode: description: Apakah autoscaler diaktifkan untuk kontainer. Nilai default adalah "Auto". enum: - Auto - "Off" type: string type: object type: array type: object targetRef: description: TargetRef mengarah ke controller yang mengelola kumpulan Pod untuk dikontrol oleh autoscaler—misalnya Deployment, StatefulSet. VerticalPodAutoscaler dapat ditargetkan pada controller yang mengimplementasikan subresource scale (kumpulan Pod diambil dari ScaleStatus controller) atau beberapa controller terkenal (misalnya untuk DaemonSet, kumpulan Pod dibaca dari spesifikasi controller). Jika VerticalPodAutoscaler tidak dapat menggunakan target yang ditentukan, kondisi ConfigUnsupported akan dilaporkan. Perhatikan bahwa VerticalPodAutoscaler tidak memerlukan implementasi lengkap subresource scale—tidak akan menggunakannya untuk memodifikasi jumlah replika. Satu-satunya hal yang diambil adalah pemilih label yang mencocokkan Pod yang dikelompokkan oleh resource target. properties: apiVersion: description: Versi API dari referensi type: string kind: description: 'Jenis referensi; Info lebih lanjut: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds"' type: string name: description: 'Nama referensi; Info 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 ke Pod. Jika tidak ditentukan, semua bidang dalam `PodUpdatePolicy` diatur ke nilai default-nya. properties: updateMode: description: Mengontrol kapan autoscaler menerapkan perubahan ke resource Pod. Nilai default 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 kumpulan kondisi yang diperlukan agar autoscaler ini dapat 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 berpindah 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 tersebut type: string reason: description: reason adalah alasan transisi terakhir kondisi tersebut. type: string status: description: status adalah status kondisi tersebut (True, False, Unknown) type: string type: description: type menggambarkan kondisi saat ini type: string required: - status - type type: object type: array recommendation: description: Jumlah resource terbaru yang direkomendasikan oleh autoscaler untuk Pod yang dikontrol. properties: containerRecommendations: description: Resource yang direkomendasikan oleh autoscaler untuk setiap kontainer. items: description: RecommendedContainerResources adalah rekomendasi resource yang dihitung oleh autoscaler untuk kontainer tertentu. Menghormati kebijakan resource kontainer jika ada dalam spesifikasi. Secara khusus, rekomendasi tidak dihasilkan untuk kontainer dengan `ContainerScalingMode` diatur 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 resource yang direkomendasikan. Mengamati ContainerResourcePolicy. Jumlah ini tidak dijamin cukup agar aplikasi beroperasi secara stabil, namun menjalankan dengan resource kurang dari ini kemungkinan besar 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 resource 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 resource terbaru yang direkomendasikan oleh autoscaler untuk Pod yang dikontrol, berdasarkan hanya pada penggunaan resource aktual, tanpa mempertimbangkan ContainerResourcePolicy. Dapat berbeda dari Rekomendasi jika penggunaan resource aktual menyebabkan target melanggar ContainerResourcePolicy (lebih rendah dari MinAllowed atau lebih tinggi dari MaxAllowed). Hanya digunakan sebagai indikasi status, tidak akan memengaruhi alokasi resource 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 maksimum resource yang direkomendasikan. Mengamati ContainerResourcePolicy. Resource apa pun yang dialokasikan melebihi nilai ini kemungkinan besar terbuang. Nilai ini mungkin lebih besar dari jumlah maksimum yang sebenarnya dapat dikonsumsi aplikasi. type: object required: - target type: object type: array type: object type: object required: - spec type: object served: true storage: falseInstal komponen Vertical Pod Autoscaler.
Komponen Vertical Pod Autoscaler mencakup admission-controller, recommender, dan updater.
CatatanSebelum menginstal komponen admission-controller, gunakan skrip ini untuk menghasilkan sertifikat untuk webhook.
Definisi YAML untuk versi kluster sebelum 1.22
Instal komponen 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-controllerInstal komponen 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: 8080Instal komponen 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: 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: 8080Definisi YAML untuk versi kluster 1.22 dan seterusnya
Instal komponen 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-controllerInstal komponen 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: 8942Instal komponen 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
Verifikasi instalasi VPA
Gunakan definisi YAML berikut untuk membuat deployment bernama nginx-deployment-basic dan resource VPA bernama nginx-deployment-basic-vpa.
Perluas untuk melihat file YAML
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 --- 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"CatatanAtur updateMode ke Off dan biarkan permintaan serta batas resource dalam deployment kosong.
Jalankan perintah berikut untuk mengkueri VPA guna mendapatkan nilai permintaan resource CPU dan memori yang direkomendasikan untuk deployment tersebut.
CatatanSetelah menjalankan perintah, tunggu sekitar dua menit hingga VPA mengembalikan nilai yang direkomendasikan.
kubectl describe vpa nginx-deployment-basic-vpaSetelah menjalankan perintah, nilai rekomendasi berikut dikembalikan.
Perluas untuk melihat detail
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: 12128573170Anda dapat menggunakan nilai rekomendasi tersebut untuk mengonfigurasi permintaan resource untuk deployment. VPA terus memantau penggunaan resource aplikasi dan memberikan saran optimasi.