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 hybrid Apigee mengelola cluster mereka sendiri, menetapkan batas PID di Kubernetes dapat meningkatkan stabilitas sistem, keamanan, dan pengelolaan resource. 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 Kube dan PID yang dicadangkan sistem. Jumlah total PID yang dapat dialokasikan adalah maksimum Kernel dikurangi PID yang dicadangkan kube dikurangi PID yang dicadangkan sistem dikurangi PID nilai minimum penghapusan:
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 Linus pada node Kubernetes. Jumlah maksimum batas ID proses untuk kernel Linux adalah 4194304.
- Kube-reserved dan system-reserved: Untuk reservasi resource untuk daemon sistem Kubernetes atau OS.
- Nilai minimum penghapusan: Batas yang menandakan tekanan pada node. Node akan dihapus saat nilai minimum tercapai. Lihat Penghapusan berdasarkan PID untuk mengetahui detail selengkapnya.
- Allocatable: Jumlah PID yang tersedia. Lihat Kubernetes: Node Allocatable 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 ini 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 direservasi. Jika nilainya 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 yang disebut
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, pod tidak dapat dimulai. Jika disetel terlalu tinggi, nilai ini dapat gagal mendeteksi perilaku tidak benar resource. Saat memilih batas yang sesuai, penting untuk mempertimbangkan perilaku node sebelumnya dan persyaratan khusus layanan.
GKE memiliki rentang yang diperlukan untuk nilai: [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 terbaru dan dapat dirujuk saat memilih batas PID.
Di platform non-GKE, opsi pemantauan yang berbeda mungkin tersedia. Harap baca 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 akan sama untuk kedua node pool. Batas PID Pod juga harus lebih tinggi dari jumlah maksimum PID yang diperlukan di semua pod Apigee. Batas PID Pod Apigee yang diperlukan adalah 1.000, 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, dalam hal ini persyaratan nilai minimum dipilih.
Platform | Batas PID Pod Min |
---|---|
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 pembaruan batas PID mencakup:
- 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 yang diperlukan untuk nilai: [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-data
danapigee-runtime
apigee. Saat Anda menerapkan konfigurasi, node akan mulai diluncurkan dengan salah satu Strategi upgrade node tanpa waktu tunggu.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 mulai ulang 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 masing-masing platform untuk mengetahui perintah mendetail. Berikut adalah beberapa link dokumentasi platform non-GKE untuk referensi. Perhatikan bahwa hal 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 Layanan Red Hat OpenShift di pod 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 terjebak dalam 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 dikonfirmasi sebagai 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
melebihi 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 ke dalam rentang yang diperlukan.