Mengelola batas ID proses

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
    - Direservasi Kube
    - Sistem dicadangkan
    - Nilai minimum penghapusan
= 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_ID
export 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.

  1. 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"
    
  2. 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.

  1. Dapatkan node dari cluster untuk memeriksa nilai. Anda harus memeriksa node dari node pool apigee-data dan apigee-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
    
  2. Ekspor nama node dari output langkah sebelumnya. Jalankan langkah berikutnya ini terlebih dahulu untuk node apigee-data dan lagi untuk node apigee-runtime:

    Kode

    export NODE_NAME=MY_NODE_NAME
    

    Contoh

    export NODE_NAME="gke-my-hybrid-apigee-data-0a1b2c3d-efgh"
    
  3. 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'
    
  4. 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

  1. 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.

  2. 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.

Metrics Explorer

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.

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:

Batas PID Pod dikontrol oleh Konfigurasi sistem node. GKE memiliki rentang yang diperlukan untuk nilai: [1024, 4194304]. Untuk mengetahui informasi selengkapnya, lihat NodeKubeletConfig.

  1. Buat konfigurasi sistem node bernama node-config.yaml dengan batas PID pod yang ditetapkan dengan konten berikut:
    kubeletConfig:
     podPidsLimit: POD_PID_VALUE # Example: 1024
    
  2. Terapkan konfigurasi ke node pool apigee-data dan apigee-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.

  1. 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
    
  2. Terapkan konfigurasi. Menetapkan podPidsLimit memerlukan mulai ulang node yang terpengaruh, yang dapat menyebabkan periode nonaktif:
    kubelet --config PATH_TO_KUBELET_CONFIG_YAML
    
  3. 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.

  1. Dapatkan kolom Node:
    kubectl get pods -n ${APIGEE_NAMESPACE} ${POD_NAME} -o wide
    
  2. Periksa apakah ada kondisi PIDPressure:
    kubectl describe node -n apigee ${NODE_NAME} | grep PIDPressure
    
  3. Atau, periksa ApigeeDeployment dari pod yang sesuai. Dapatkan ApigeeDeployment dari hasil yang memiliki awalan yang sama dengan pod yang mengalami error.
    kubectl get ApigeeDeployment -n ${APIGEE_NAMESPACE}
    
  4. Periksa apakah Events terbaru memiliki pesan error terkait PID:
    kubectl describe ApigeeDeployment -n ${APIGEE_NAMESPACE} ${APIGEE_DEPLOYMENT_NAME}
    
  5. 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.