Ringkasan
Batas ID Proses (PID) adalah batasan resource Kubernetes pada node dan pod untuk mencegah pembuatan proses yang berlebihan, yang dapat memengaruhi stabilitas node. Apigee Hybrid mendukung fitur Kubernetes untuk menetapkan batas ID proses. Dokumen ini memberikan petunjuk tentang cara menetapkan batas ini, dengan rekomendasi nilai untuk layanan Apigee di platform tertentu.
Saat pengguna Apigee Hybrid mengelola cluster mereka sendiri, menyetel batas PID di Kubernetes dapat meningkatkan stabilitas, keamanan, dan pengelolaan resource sistem. Hal ini juga konsisten dengan praktik terbaik Kubernetes.
Definisi batas ID proses
Batas ID proses mencakup batas PID Node dan batas PID Pod.
Batas PID node mencakup PID yang dicadangkan untuk Kube dan PID yang dicadangkan untuk sistem. Jumlah total PID yang dapat dialokasikan adalah PID maksimum Kernel dikurangi PID yang dicadangkan kube dikurangi PID yang dicadangkan sistem dikurangi PID batas pemberhentian:
Batas ID maksimum kernel |
|
|
|
= Dapat dialokasikan |
- Batas ID maksimum kernel: Ditentukan oleh sistem operasi dan setelan kernelnya. Karena Apigee Hybrid berjalan secara eksklusif di kernel Linux, panduan ini membahas batas berbasis Linux pada node Kubernetes. Jumlah maksimum batas ID proses untuk kernel Linux adalah 4194304.
- Kube-reserved dan system-reserved: Untuk reservasi resource bagi daemon sistem Kubernetes atau OS.
- Nilai minimum pengusiran: Batas yang menandakan tekanan pada node. Node akan dikeluarkan saat nilai minimum tercapai. Lihat Pengusiran berbasis PID untuk mengetahui detail selengkapnya.
- Dapat dialokasikan: Jumlah PID yang tersedia. Lihat Kubernetes: Node yang Dapat Dialokasikan untuk mengetahui informasi selengkapnya. Kube-reserved dan system-reserved dapat dikonfigurasi dengan setelan batas PID Node.
Batas PID pod dapat dikonfigurasi untuk node dan dibagikan di semua pod dalam node.
Bersiap untuk mengelola batas ID proses
Prosedur ini menggunakan variabel lingkungan berikut:
export PROJECT_ID=MY_PROJECT_IDexport CLUSTER_NAME=MY_CLUSTER_NAME
export LOCATION=MY_CLUSTER_LOCATION
export APIGEE_NAMESPACE=MY_APIGEE_NAMESPACE # Default: apigee
Memverifikasi akses
Sebelum mengonfigurasi batas ID proses, pastikan Anda memiliki akses untuk mengedit cluster Kubernetes.
Langkah-langkah berikut ditujukan untuk penginstalan di GKE. Untuk platform lainnya, lihat dokumentasi untuk platform Anda.
-
Periksa apakah Anda memiliki roles/container.clusterAdmin dalam kebijakan IAM:
gcloud projects get-iam-policy ${PROJECT_ID} \ --flatten="bindings[].members" \ --format='table(bindings.role)' \ --filter="bindings.members:your_account_email"
- Jika Anda tidak memiliki akses, tambahkan peran ke akun Anda:
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member user:your_account_email \ --role roles/container.clusterAdmin
Memverifikasi Batas PID yang Ada
Verifikasi apakah node memiliki batas PID yang ada sebelum mengonfigurasi batas baru.
-
Dapatkan node dari cluster untuk memeriksa nilai. Anda harus memeriksa node dari node pool
apigee-data
danapigee-runtime
:kubectl get nodes -n ${APIGEE_NAMESPACE}
Output Anda akan terlihat seperti berikut:
NAME STATUS ROLES AGE VERSION gke-my-hybrid-apigee-data-0a1b2c3d-efgh Ready
2d8h v1.31.5-gke.1169000 gke-my-hybrid-apigee-runtime-1b2c3d4e-fghi Ready 2d8h v1.31.5-gke.1169000 -
Ekspor nama node dari output langkah sebelumnya. Jalankan langkah berikutnya terlebih dahulu untuk node
apigee-data
dan lagi untuk nodeapigee-runtime
:Kode
export NODE_NAME=MY_NODE_NAME
Contoh
export NODE_NAME="gke-my-hybrid-apigee-data-0a1b2c3d-efgh"
- Periksa batas PID node. Gunakan perintah berikut untuk memeriksa nilai yang dicadangkan. Jika nilainya adalah null, nilai tersebut tidak dikonfigurasi:
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.kubeReserved'
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.systemReserved'
kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.evictionHard'
- Periksa batas PID pod. Gunakan perintah berikut untuk memeriksa batas PID pod yang ada. Jika nilai yang ditampilkan adalah
-1
atau kosong, batas tidak ditetapkan:kubectl get --raw "/api/v1/nodes/${NODE_NAME}/proxy/configz" | jq '.kubeletconfig.podPidsLimit'
Mengelola batas ID proses
Mengelola batas PID Node
Untuk penginstalan di GKE, resource infrastruktur node Kubernetes dikelola secara internal dan Anda tidak perlu mengonfigurasinya. Kapasitas saat ini dan resource yang dapat dialokasikan dapat dilihat dengan mengikuti Resource yang dapat dialokasikan node dalam dokumentasi Google Kubernetes Engine.
Untuk platform non-GKE, lihat dokumentasi Kubernetes yang sesuai untuk platform tersebut. Jika cluster/node dikelola pengguna (bukan Dikelola sepenuhnya), batas PID yang dicadangkan kube dan batas PID yang dicadangkan sistem dapat dikonfigurasi dengan Kubelet. Lihat Batas PID node dalam dokumentasi Kubernetes.
Alat
Prosedur ini menggunakan Kubelet untuk mengelola batas ID proses. Kubelet adalah agen yang berjalan di pod dan container yang memastikan keduanya berjalan sesuai dengan PodSpec-nya. Jika Anda perlu menginstal Kubelet, ikuti petunjuk dalam dokumentasi Kubernetes: Menginstal kubeadm, kubelet, dan kubectl.
Prosedur
-
Buat file konfigurasi Kubelet bernama
kubelet-config.yaml
.apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration kubeReserved: pid: PID_VALUE # Example: 1000
Lihat info selengkapnya tentang konfigurasi: Kube Reserved di dokumentasi Kubernetes.
-
Terapkan konfigurasi Kubelet:
kubelet --config PATH_TO_KUBELET_CONFIG_YAML
Mengelola batas PID Pod
Memilih Batas
Jika batas PID ditetapkan terlalu rendah, hal ini dapat mencegah pod dimulai. Jika disetel terlalu tinggi, deteksi perilaku tidak semestinya pada resource dapat gagal. Saat memilih batas yang sesuai, penting untuk mempertimbangkan perilaku node sebelumnya dan persyaratan khusus layanan.
GKE memiliki rentang nilai yang diperlukan: [1024, 4194304]. Di Platform GKE, Anda dapat melihat status akun layanan Kubernetes di Google Cloud console Metrics Explorer. Pilih metrik Kubernetes Node - PID usage dan terapkan filter. Metrik ini menunjukkan penggunaan ID proses baru-baru ini dan dapat dirujuk saat memilih batas PID.
Di platform non-GKE, opsi pemantauan yang berbeda mungkin tersedia. Lihat dokumentasi Kubernetes platform yang sesuai untuk memeriksa metrik.
Persyaratan ID proses untuk pod Apigee
Apigee Hybrid menggunakan 2 kumpulan node, apigee-data dan apigee-runtime. Karena beberapa komponen Apigee di-deploy di kedua node pool, batas PID Pod harus sama untuk kedua node pool. Batas PID Pod juga harus lebih tinggi daripada jumlah maksimum PID yang diperlukan di semua pod Apigee. Batas PID Pod Apigee yang diperlukan adalah 1000, yang berada di bawah jumlah minimum yang diperlukan untuk platform GKE.
Batas PID Pod yang Direkomendasikan
Beberapa platform menerapkan persyaratan nilai minimum untuk jumlah batas PID Pod, yang dalam hal ini persyaratan nilai minimum dipilih.
Platform | Batas PID Pod Minimum |
---|---|
GKE di Google Cloud | 1024 |
GKE di AWS | 1024 |
GKE di Azure | 1024 |
Google Distributed Cloud (khusus software) di VMware | 1024 |
Google Distributed Cloud (khusus software) di bare metal | 1024 |
EKS | 1000 |
AKS | 1000 |
OpenShift | 1000 |
Rancher Kubernetes Engine (RKE) | 1000 |
Prosedur
Prosedur untuk mengelola batas PID Pod berbeda untuk platform GKE dan non-GKE.
Platform GKE
Platform GKE yang mendukung update batas PID meliputi:
- GKE di Google Cloud: lihat gcloud container node-pools.
- GKE on AWS: lihat gcloud container aws node-pools.
- GKE di Azure: lihat gcloud container azure node-pools.
- Google Distributed Cloud (khusus software) di VMware: lihat gcloud container vmware node-pools
- Google Distributed Cloud (khusus software) di bare metal: lihat gcloud container bare-metal node-pools
Batas PID Pod dikontrol oleh Konfigurasi sistem node. GKE memiliki rentang nilai yang diperlukan: [1024, 4194304]. Untuk mengetahui informasi selengkapnya, lihat NodeKubeletConfig.
-
Buat konfigurasi sistem node bernama
node-config.yaml
dengan batas PID pod yang ditetapkan dengan konten berikut:kubeletConfig: podPidsLimit: POD_PID_VALUE # Example: 1024
-
Terapkan konfigurasi ke node pool apigee
apigee-data
danapigee-runtime
. Saat Anda menerapkan konfigurasi, node akan memulai peluncuran dengan salah satu Strategi upgrade node zero-downtime.gcloud container OPTIONAL_HOST_PLATFORM node-pools update NODE_POOL_NAME \ --cluster CLUSTER_NAME \ --region CLUSTER_LOCATION \ --system-config-from-file=node-config.yaml \ --project PROJECT_ID
Platform non-GKE
Untuk platform non-GKE, batas PID Pod dikontrol oleh Kubelet. Batas ditetapkan oleh kolom podPidsLimit
dalam file konfigurasi Kubelet.
-
Buat file konfigurasi Kubelet bernama
kubelet-config.yaml
dengan konten berikut:apiVersion: kubelet.config.k8s.io/v1beta1 kind: KubeletConfiguration podPidsLimit: POD_PID_VALUE # Example: 1024
-
Terapkan konfigurasi. Menetapkan podPidsLimit memerlukan reboot node yang terpengaruh, yang dapat menyebabkan periode nonaktif:
kubelet --config PATH_TO_KUBELET_CONFIG_YAML
- Verifikasi konfigurasi. Lihat Memverifikasi Batas PID yang Ada untuk mengetahui petunjuknya.
Perintah konfigurasi batas PID pod dan rekomendasi alat berbeda di berbagai platform. Lihat dokumentasi platform masing-masing untuk mengetahui perintah mendetail. Di bawah ini adalah beberapa link dokumentasi platform non-GKE sebagai referensi. Perhatikan bahwa lokasi dan tanggal ini dapat berubah sewaktu-waktu:
Platform | Dokumentasi |
---|---|
EKS | Menyesuaikan node terkelola dengan template peluncuran |
AKS | Menyesuaikan konfigurasi node untuk node pool Azure Kubernetes Service (AKS) |
OpenShift | Risiko menetapkan batas ID proses yang lebih tinggi untuk pod Red Hat OpenShift Service di AWS |
Rancher Kubernetes Engine (RKE) | Mengakses Cluster dengan Kubectl dan kubeconfig |
Memecahkan masalah batas ID proses
Pod macet dalam status Pending
dengan error FailedScheduling
Jika batas PID Node atau Pod mengeluarkan atau membatasi pod agar tidak dimulai, pod akan mengalami masalah pada status Pending
dan gagal dengan error FailedScheduling
.
-
Dapatkan kolom Node:
kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide
-
Periksa apakah ada kondisi
PIDPressure
:kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure
-
Atau, periksa
ApigeeDeployment
dari pod yang sesuai. DapatkanApigeeDeployment
dari hasil yang memiliki awalan yang sama dengan pod yang mengalami error.kubectl get ApigeeDeployment -n ${APIGEE_NAMESPACE}
-
Periksa apakah
Events
terbaru memiliki pesan error terkait PID:kubectl describe ApigeeDeployment -n ${APIGEE_NAMESPACE} ${APIGEE_DEPLOYMENT_NAME}
- Jika penyebabnya dipastikan adalah batas PID, ikuti langkah-langkah di Mengelola batas PID Node untuk memperbarui batas PID ke nilai yang lebih tinggi.
podPidsLimit
tidak valid
Saat menetapkan batas untuk GKE, jika podPidsLimit
melampaui batas, error akan muncul:
ERROR: (gcloud.container.node-pools.update) ResponseError: code=400, message=Invalid podPidsLimit: value must be 1024 <= podPidsLimit <= 4194304.
Perbarui nilai podPidsLimit agar berada dalam rentang yang diperlukan.