Mengonfigurasi parameter kernel untuk AlloyDB Omni di Kubernetes

Pilih versi dokumentasi:

Halaman ini memberikan informasi tentang cara menyiapkan node Kubernetes yang menghosting cluster database AlloyDB Omni untuk performa optimal operator AlloyDB Omni Kubernetes dan mesin database AlloyDB Omni.

Dengan mengonfigurasi parameter kernel, AlloyDB Omni dapat menggunakan memori sistem dan resource IO secara lebih efisien saat menangani workload berat.

Prasyarat

Sebelum memulai, pastikan node Kubernetes Anda menjalankan kernel Linux 6.1 atau yang lebih baru, khususnya kernel yang mendukung flag MADV_COLLAPSE dan MADV_POPULATE_WRITE. Untuk mengetahui informasi selengkapnya tentang flag ini, lihat dokumentasi madwise Linux.

Tabel berikut mencantumkan parameter kernel yang diperlukan dan nilai yang sesuai untuk node Kubernetes yang menjalankan pod cluster database:

File Nilai
/sys/kernel/mm/transparent_hugepage/shmem_enabled
Untuk mengetahui informasi tentang memori bersama, lihat Dukungan Hugepage Transparan
within_size atau always
/proc/sys/vm/max_map_count
Untuk mengetahui informasi tentang jumlah area peta memori yang dapat dibuat oleh suatu proses, lihat Dokumentasi untuk /proc/sys/vm
Lebih besar dari atau sama dengan 1073741824

Untuk mengonfigurasi parameter kernel di node Kubernetes menggunakan DaemonSet, lakukan hal berikut:

  1. Terapkan label ke node tempat Anda berencana menjalankan cluster database menggunakan petunjuk di Menambahkan label ke node.

  2. Untuk menyetel parameter kernel pada node yang diberi label LABEL_KEY=LABEL_VALUE, buat DaemonSet:

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: alloydb-omni-kernel-tuning
      namespace: DS_NAMESPACE
    spec:
      selector:
        matchLabels:
          name: alloydb-omni-kernel-tuning
      template:
        metadata:
          labels:
            name: alloydb-omni-kernel-tuning
        spec:
          volumes:
            - name: host-sys
              hostPath:
                path: /sys
          nodeSelector:
            LABEL_KEY: "LABEL_VALUE"
          restartPolicy: Always
          terminationGracePeriodSeconds: 1
          initContainers:
            - name: enable-thp-mmc
              image: INIT_IMAGE
              volumeMounts:
                - name: host-sys
                  mountPath: /sys
              securityContext:
                privileged: true
              command: ["sh", "-c", "sysctl -w vm.max_map_count=MAX_MAP_COUNT && echo within_size >/sys/kernel/mm/transparent_hugepage/shmem_enabled"]
          containers:
            - name: CONTAINER_NAME
              image: CONTAINER_IMAGE
              command: ["watch", "-n", "600", "cat", "/sys/kernel/mm/transparent_hugepage/shmem_enabled"]
    EOF
    

    Ganti kode berikut:

    • DS_NAMESPACE: namespace tempat Anda ingin men-deploy DaemonSet—misalnya, default.
    • LABEL_KEY: ID untuk label—misalnya, workload.
    • LABEL_VALUE: data yang terkait dengan ID untuk label—misalnya, database.
    • INIT_IMAGE: nama image yang digunakan untuk init container.
    • MAX_MAP_COUNT: jumlah maksimum area peta memori yang dapat dibuat oleh suatu proses—misalnya, 1073741824.
    • CONTAINER_NAME: nama penampung utama—misalnya, main.
    • CONTAINER_IMAGE: nama image yang digunakan untuk container utama—misalnya, latest.
  3. Setelah men-deploy DaemonSet, untuk memverifikasi bahwa semua pod di cluster Kubernetes Anda berada dalam status Running dan Anda memiliki satu pod untuk setiap node dengan label LABEL_KEY=LABEL_VALUE, gunakan perintah berikut:

    kubectl get pods -l LABEL_KEY=LABEL_VALUE
    

    Contoh outputnya akan terlihat seperti berikut:

    NAME                               READY   STATUS    RESTARTS   AGE
    alloydb-omni-kernel-tuning-2dkwh   1/1     Running   0          22s
    alloydb-omni-kernel-tuning-pgkbj   1/1     Running   0          19s
    
  4. Untuk memverifikasi bahwa tanda kernel berhasil diterapkan, untuk setiap pod yang diidentifikasi setelah men-deploy DaemonSet, jalankan perintah berikut:

    kubectl logs POD_NAME
    

    Ganti POD_NAME dengan nama pod yang lognya ingin Anda periksa.

    Contoh outputnya akan terlihat seperti berikut:

    always [within_size] advise never deny force
    

Untuk men-deploy cluster database di node Kubernetes dengan parameter kernel yang direkomendasikan, tambahkan bagian nodeAffinity ke salah satu bagian berikut dari manifes cluster database Anda:

  • primarySpec.schedulingConfig untuk instance utama
  • spec.schedulingConfig untuk instance kumpulan baca
      nodeaffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: LABEL_KEY
              operator: In
              values:
              - "LABEL_VALUE"

Untuk mengetahui informasi selengkapnya tentang cara menjalankan cluster database di node Kubernetes tertentu, lihat Menetapkan node ke cluster database menggunakan penjadwalan.

Memverifikasi penerapan parameter kernel

Untuk memverifikasi bahwa parameter kernel diterapkan ke pod database, lakukan hal berikut:

  1. Jika ketersediaan tinggi diaktifkan, khususnya spec.availability.numberOfStandbys disetel ke nilai yang lebih besar dari nol, verifikasi bahwa resource kustom database menampilkan DBClusterReady di kolom DBCLUSTERPHASE dan True di kolom HAREADYSTATUS.

    kubectl get dbcluster -n DBCLUSTER_NAMESPACE DBCLUSTER_NAME
    

    Ganti kode berikut:

    • DBCLUSTER_NAME: nama cluster database yang Anda verifikasi.
    • DBCLUSTER_NAMESPACE: nama namespace tertentu tempat cluster database Anda berada.

    Contoh outputnya akan terlihat seperti berikut:

    NAME               PRIMARYENDPOINT   PRIMARYPHASE   DBCLUSTERPHASE   HAREADYSTATUS   HAREADYREASON
    dbcluster-sample   10.29.21.240      Ready          DBClusterReady   True            Ready
    
  2. Mencantumkan pod Kubernetes yang termasuk dalam cluster database:

    kubectl get pods -n DBCLUSTER_NAMESPACE -l alloydbomni.internal.dbadmin.goog/dbcluster=DBCLUSTER_NAME
    
  3. Untuk memeriksa informasi memori bersama, jalankan perintah berikut:

    kubectl exec -n DBCLUSTER_NAMESPACE POD_NAME -- grep Shmem /proc/meminfo
    
  4. Output harus berisi angka selain nol di semua entri.

    Contoh outputnya akan terlihat seperti berikut:

    Shmem:          126255872 kB
    ShmemHugePages: 18403328 kB
    ShmemPmdMapped:  2961408 kB
    

    Jika Anda melihat 0 kB muncul di salah satu entri, mulai ulang pod yang sesuai:

    kubectl delete pod -n DBCLUSTER_NAMESPACE POD_NAME
    
  5. Ulangi langkah 1 hingga 5 setelah pod berada dalam status Running.