Pengujian performa di Google Kubernetes Engine

Untuk menguji performa baca dan tulis workload Google Kubernetes Engine (GKE) dari beberapa klien GKE, gunakan alat benchmark IOR. Petunjuk berikut menunjukkan cara mengotomatiskan penyiapan klien dan menggunakan IOR dengan mpirun melalui SSH tanpa sandi antara Pod Kubernetes untuk menguji I/O gabungan.

Prasyarat

  • Instance Managed Lustre sudah disediakan.

  • Lingkungan Docker lokal dikonfigurasi dan diautentikasi untuk mengirim ke Google Artifact Registry atau Container Registry (lihat Metode autentikasi).

  • Pastikan nilai mtu jaringan Anda ditetapkan ke 8896.

Membuat cluster GKE

Untuk menguji performa, Anda memerlukan cluster GKE dengan driver CSI Managed Lustre diaktifkan. Untuk workload penyimpanan berperforma tinggi, konfigurasi node pool GKE Anda dengan kelompok mesin yang dioptimalkan untuk komputasi (misalnya, c2 atau c3) dan jaringan TIER_1.

Jalankan perintah berikut untuk membuat cluster GKE Standar yang dioptimalkan untuk pengujian performa:

gcloud container clusters create CLUSTER_NAME \
    --zone=ZONE \
    --machine-type=MACHINE_TYPE \
    --addons=LustreCsiDriver \
    --network-performance-configs=total-egress-bandwidth-tier=TIER_1 \
    --network=NETWORK \
    --num-nodes=NUM_NODES
  • Ganti ZONE dan NETWORK dengan nilai deployment spesifik Anda. Cluster harus berada di jaringan VPC yang sama dengan instance Managed Lustre Anda.

  • Pilih MACHINE_TYPE. Lihat Pertimbangan performa untuk mengetahui informasi tentang memilih jenis mesin guna mendapatkan throughput terbaik.

  • Jika jenis mesin Anda tidak mendukung jaringan TIER_1, hapus baris --network-performance-configs dari perintah.

  • Tentukan NUM_NODES. Untuk memenuhi sistem file Anda, kapasitas jaringan gabungan cluster Anda harus melebihi throughput yang disediakan sistem file Anda sebesar ~20%.

    Untuk mesin dengan jaringan Tingkat 1 diaktifkan, satu node dapat mengirim antara 25 Gbps–200 Gbps (~3.000–25.000 MBps), bergantung pada kelompok VM dan jumlah CPU. Untuk instance standar, traffic keluar biasanya dibatasi sekitar 2 Gbps per vCPU.

    Misalnya, jika kapasitas instance Managed Lustre Anda menghasilkan throughput teoretis sebesar 100.000 MBps, Anda memerlukan traffic keluar klien gabungan sebesar 120.000 MBps (100,000 * 1.2) untuk memenuhinya:

    • Dengan instance standar: Jika setiap node memiliki traffic keluar yang dipublikasikan sebesar 2.000 MBps, Anda harus menyediakan setidaknya 60 node (120,000 / 2,000).
    • Dengan jaringan Tingkat 1: Jika setiap node memiliki traffic keluar yang dipublikasikan sebesar 10.000 MBps (~80 Gbps), Anda harus menyediakan setidaknya 12 node (120,000 / 10,000).

Membuat Image Docker IOR

Buat image container dengan OpenMPI dan IOR terinstal. Kompilasi IOR dengan dukungan I/O Asinkron (AIO) untuk performa yang lebih baik.

  1. Buat file bernama Dockerfile secara lokal:

    FROM ubuntu:22.04
    
    # Prevent interactive prompts during installation
    ENV DEBIAN_FRONTEND=noninteractive
    
    # Install dependencies, SSH, and required Autotools packages
    RUN apt-get update && apt-get install -y \
      openssh-server \
      openmpi-bin \
      libopenmpi-dev \
      wget \
      git \
      make \
      gcc \
      g++ \
      automake \
      autoconf \
      libtool \
      pkg-config \
      libaio-dev \
      sudo \
      && rm -rf /var/lib/apt/lists/*
    
    # Build IOR from source (version 4.0.0) with Asynchronous I/O (AIO) support
    RUN git clone -b 4.0.0 https://github.com/hpc/ior /tmp/ior \
      && cd /tmp/ior \
      && ./bootstrap \
      && ./configure --disable-dependency-tracking --with-aio \
      && make -j"$(nproc)" \
      && make install \
      && rm -rf /tmp/ior
    
    # Configure SSH for OpenMPI passwordless communication
    RUN mkdir /var/run/sshd
    RUN echo 'root:root' | chpasswd
    RUN sed -i 's/^#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
    RUN sed -i 's/^#PasswordAuthentication.*/PasswordAuthentication yes/' /etc/ssh/sshd_config
    
    # SSH login fix so user isn't kicked out after container initialization
    RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
    
    EXPOSE 22
    CMD ["/usr/sbin/sshd", "-D"]
    
  2. Bangun dan kirim image ini ke container registry pilihan Anda. Petunjuk dalam dokumen ini menggunakan Artifact Registry.

    export IMAGE_TAG="gcr.io/PROJECT_ID/lustre-ior-benchmark:latest"
    docker build -t $IMAGE_TAG .
    docker push $IMAGE_TAG
    

Membuat Kunci SSH Tanpa Sandi untuk MPI

OpenMPI memerlukan komunikasi antar-node menggunakan SSH tanpa sandi. Buat kunci SSH dan simpan di Secret Kubernetes.

  1. Buat kunci RSA:

    ssh-keygen -t rsa -b 4096 -C "mpi-user" -N '' -f "./id_rsa"
    
  2. Buat Secret Kubernetes:

    kubectl create secret generic mpi-ssh-secret \
      --from-file=id_rsa=./id_rsa \
      --from-file=id_rsa.pub=./id_rsa.pub \
      --from-file=authorized_keys=./id_rsa.pub
    

Membuat Volume dan Klaim Persisten

Hubungkan pod GKE Anda ke instance Managed Lustre menggunakan penyediaan statis.

  1. Buat file bernama lustre-pv.yaml. Ganti kode berikut:

    • CAPACITY dengan kapasitas penyimpanan instance Anda dalam GiB.
    • EXTENDED_LUSTRE_ID dengan ID Managed Lustre Anda, dalam format PROJECT_ID/ZONE/INSTANCE_NAME. Misalnya, project-123/us-west1-a/my-lustre-instance.
    • LUSTRE_IP dengan alamat IP pemasangan instance Anda.
    • FS_NAME dengan nama sistem file instance.

    Nilai ini dapat diambil dengan perintah gcloud lustre instances describe.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-lustre-pv
    spec:
      storageClassName: ""
      claimRef:
        name: my-lustre-pvc
        namespace: default
      accessModes:
        - ReadWriteMany
      capacity:
        storage: CAPACITYGi   # retain `Gi` suffix
      persistentVolumeReclaimPolicy: Retain
      volumeMode: Filesystem
      csi:
        driver: lustre.csi.storage.gke.io
        volumeHandle: EXTENDED_LUSTRE_ID   # project-name/zone/instance-name
        volumeAttributes:
          ip: LUSTRE_IP
          filesystem: FS_NAME
    ---
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-lustre-pvc
    spec:
      storageClassName: ""
      volumeName: my-lustre-pv
      accessModes:
        - ReadWriteMany
      resources:
        requests:
          storage: CAPACITYGi
    
  2. Terapkan manifes:

    kubectl apply -f lustre-pv.yaml
    

Men-deploy Pekerja MPI

Untuk menskalakan tugas IOR di beberapa node, deploy a StatefulSet dengan image benchmark Anda.

  1. Buat file bernama mpi-workers.yaml. Tentukan PROJECT_ID, dan tetapkan NUM_NODES ke jumlah node di cluster Anda.

    apiVersion: v1
    kind: Service
    metadata:
      name: mpi-workers
      labels:
        app: mpi-worker
    spec:
      clusterIP: None
      selector:
        app: mpi-worker
      ports:
      - port: 22
        name: ssh
    ---
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: mpi-worker
    spec:
      serviceName: "mpi-workers"
      replicas: NUM_NODES
      selector:
        matchLabels:
          app: mpi-worker
      template:
        metadata:
          labels