Men-deploy Sistem File Paralel Lustre di GCP

1. Ringkasan

Selamat datang di Codelab Google untuk menjalankan cluster sistem file Paralel Lustre di Google Cloud Platform.

d51beef5f729cbe9.png

Data adalah inti dari praktik Komputasi Berperforma Tinggi, dan mengakses data dalam jumlah besar dengan kecepatan yang sangat tinggi dan latensi rendah selalu menjadi tantangan utama dalam menjalankan workload HPC. Persyaratan untuk penyimpanan berperforma tinggi ini tidak berubah di cloud, dan pada kenyataannya, kemampuan untuk memanfaatkan penyimpanan dalam jumlah besar dengan cepat dan mudah menjadi sangat penting.

Pusat HPC telah lama memenuhi kebutuhan ini di lokasi dengan menggunakan teknologi seperti sistem file paralel Lustre. Lustre adalah salah satu solusi penyimpanan open source berperforma tinggi yang paling populer saat ini, dan sejak Juni 2005, solusi ini secara konsisten digunakan oleh setidaknya setengah dari sepuluh teratas, dan lebih dari 60 dari 100 superkomputer tercepat di dunia. Lustre memiliki kemampuan untuk diskalakan hingga ratusan PB kapasitas, dan memberikan performa maksimum untuk tugas HPC, dengan sistem yang memberikan throughput TB/s dalam satu namespace.

Untuk memenuhi permintaan penyimpanan, Google Cloud telah mengambil dua pendekatan. Pertama, GCP berpartner dengan DDN untuk menghadirkan software Lustre EXAScaler DDN kelas perusahaan yang didukung ke GCP Marketplace. Kedua, engineer kami di Google Cloud telah mengembangkan dan menyediakan open source serangkaian skrip untuk memudahkan konfigurasi dan deployment cluster penyimpanan Lustre di Google Compute Engine menggunakan Google Cloud Deployment Manager.

Lustre di Google Cloud Platform juga mampu memberikan performa maksimum infrastruktur tempatnya berjalan. Performanya di GCP sangat baik sehingga berada di posisi ke-8 pada benchmark sistem penyimpanan IO-500 pada tahun 2019 dengan partner kami, DDN, yang mewakili sistem file berbasis cloud dengan peringkat tertinggi di IO-500. Hari ini, kami akan memandu Anda men-deploy skrip Open Source Deployment Manager untuk Lustre. Jika Anda tertarik untuk memiliki pengalaman Lustre yang di-harden dan berskala perusahaan, dengan dukungan pakar Lustre untuk cluster Lustre Anda, serta fitur seperti GUI pengelolaan dan pemantauan atau penyesuaian Lustre, sebaiknya pelajari penawaran Marketplace DDN EXAScaler.

Yang akan Anda pelajari

  • Cara menggunakan Layanan Deployment Manager GCP
  • Cara mengonfigurasi dan men-deploy sistem file Lustre di GCP.
  • Cara mengonfigurasi striping dan menguji I/O sederhana ke sistem file Lustre.

Prasyarat

  • Akun Google Cloud Platform dan Project dengan Penagihan
  • Pengalaman Linux Dasar

2. Penyiapan

Penyiapan lingkungan mandiri

Buat Proyek

Jika belum memiliki Akun Google (Gmail atau G Suite), Anda harus membuatnya. Login ke Google Cloud Platform console ( console.cloud.google.com) dan buka halaman Manage resources:

359c06e07e6d699f.png

Klik Create Project.

25c23d651abb837b.png

Masukkan nama project. Ingat project ID (ditandai dengan warna merah pada screenshot di atas). Project ID harus berupa nama unik di semua project Google Cloud. Jika nama project Anda tidak unik, Google Cloud akan membuat project ID acak berdasarkan nama project.

Selanjutnya, Anda harus mengaktifkan penagihan di Developers Console untuk menggunakan resource Google Cloud.

Menjalankan codelab ini tidak akan menghabiskan biaya lebih dari beberapa dolar, tetapi bisa lebih jika Anda memutuskan untuk menggunakan lebih banyak resource atau jika Anda membiarkannya berjalan (lihat bagian "Kesimpulan" di akhir dokumen ini). Kalkulator harga Google Cloud Platform tersedia di sini.

Pengguna baru Google Cloud Platform memenuhi syarat untuk mendapatkan uji coba gratis senilai$300.

Google Cloud Shell

Meskipun Google Cloud dapat dioperasikan dari jarak jauh menggunakan laptop Anda, dalam codelab ini kita akan menggunakan Google Cloud Shell, yakni lingkungan command line yang berjalan di Cloud.

Meluncurkan Google Cloud Shell

Dari GCP Console, klik ikon Cloud Shell di toolbar kanan atas:

dbad104cef962719.png

Kemudian, klik Mulai Cloud Shell:

4e50db320508ac88.png

Hanya perlu waktu beberapa saat untuk menyediakan dan terhubung ke lingkungan:

20b0aa80492144d.png

Mesin virtual ini berisi semua alat pengembangan yang Anda perlukan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa jaringan dan menyederhanakan autentikasi. Sebagian besar pekerjaan Anda dalam lab ini dapat dilakukan hanya dengan browser web atau Google Chromebook.

Setelah terhubung ke cloud shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke PROJECT_ID Anda:

$ gcloud auth list

Output perintah:

Credentialed accounts:
 - <myaccount>@<mydomain>.com (active)
$ gcloud config list project

Output perintah:

[core]
project = <PROJECT_ID>

Jika project ID tidak ditetapkan dengan benar, Anda dapat menetapkannya dengan perintah ini:

$ gcloud config set project <PROJECT_ID>

Output perintah:

Updated property [core/project].

3. Menyiapkan dan Meninjau Konfigurasi Deployment Lustre

Mendownload Skrip Deployment Manager Lustre

Dalam sesi Cloud Shell, jalankan perintah berikut untuk meng-clone (mendownload) repositori Git yang berisi file deployment-manager Lustre untuk Google Cloud Platform:

git clone https://github.com/GoogleCloudPlatform/deploymentmanager-samples.git

Beralihlah ke direktori konfigurasi deployment Lustre dengan menjalankan perintah berikut:

cd deploymentmanager-samples/community/lustre/

Mengonfigurasi YAML Deployment Lustre

Deployment Manager menggunakan file YAML untuk menyediakan konfigurasi deployment. File YAML ini menjelaskan konfigurasi deployment, seperti versi Lustre yang akan di-deploy, dan jenis instance mesin yang akan di-deploy. File dikonfigurasi secara default untuk di-deploy di project baru tanpa penambahan kuota, tetapi Anda dapat mengubah jenis atau kapasitas mesin sesuai keinginan untuk codelab ini. Codelab ini ditulis untuk menggunakan setelan default ini, jadi jika Anda melakukan perubahan apa pun, Anda harus menerapkan perubahan tersebut di seluruh codelab ini untuk menghindari error. Dalam produksi, sebaiknya gunakan minimal instance 32 vCPU untuk node MDS, dan minimal instance 8 atau 16 vCPU untuk node OSS, bergantung pada kapasitas dan jenis penyimpanan.

Untuk meninjau atau mengedit file YAML di sesi Cloud Shell, buka file YAML konfigurasi deployment Lustre-cluster.yaml. Anda dapat menggunakan editor command line pilihan Anda (vi, nano, emacs, dll.) atau menggunakan Editor Kode Cloud Console untuk melihat konten file:

11efd5af658f1842.png

Isi file akan terlihat seperti ini:

# [START cluster_yaml]
imports:
- path: lustre.jinja

resources:
- name: lustre
  type: lustre.jinja
  properties:
    ## Cluster Configuration
    cluster_name            : lustre
    zone                    : us-central1-f
    cidr                    : 10.20.0.0/16
    external_ips            : True
    ### Use these fields to deploy Lustre in an existing VPC, Subnet, and/or Shared VPC
    #vpc_net                 : < VPC Network Name >
    #vpc_subnet              : < VPC Subnet Name >
    #shared_vpc_host_proj    : < Shared VPC Host Project name >

    ## Filesystem Configuration
    fs_name                 : lustre
    ### Review https://downloads.whamcloud.com/public/ to determine version naming
    lustre_version          : latest-release
    e2fs_version            : latest

    ## Lustre MDS/MGS Node Configuration
    #mds_node_count          : 1
    mds_ip_address          : 10.20.0.2
    mds_machine_type        : n1-standard-8
    ### MDS/MGS Boot disk
    mds_boot_disk_type      : pd-standard
    mds_boot_disk_size_gb   : 10
    ### Lustre MetaData Target disk
    mdt_disk_type           : pd-ssd
    mdt_disk_size_gb        : 1000

    ## Lustre OSS Configuration
    oss_node_count          : 4
    oss_ip_range_start      : 10.20.0.5
    oss_machine_type        : n1-standard-4
    ### OSS Boot disk
    oss_boot_disk_type      : pd-standard
    oss_boot_disk_size_gb   : 10
    ### Lustre Object Storage Target disk
    ost_disk_type           : pd-standard
    ost_disk_size_gb        : 5000
#  [END cluster_yaml]

Dalam file YAML ini, ada beberapa kolom. Kolom di bawah dengan tanda bintang (*) wajib diisi. Kolom ini mencakup:

Konfigurasi Cluster

  • cluster_name* - Nama cluster Lustre, ditambahkan di awal semua resource yang di-deploy
  • zone* - Zona tempat cluster akan di-deploy
  • cidr* - Rentang IP dalam format CIDR
  • external_ips* - Benar/Salah, node Lustre memiliki alamat IP eksternal. Jika salah, Cloud NAT akan disiapkan sebagai gateway NAT
  • vpc_net - Tentukan kolom ini, dan kolom vpc_subnet, untuk men-deploy cluster Lustre ke VPC yang ada
  • vpc_subnet - Subnet VPC yang ada untuk men-deploy cluster Lustre
  • shared_vpc_host_proj - Tentukan kolom ini, serta kolom vpc_net dan vpc_subnet, untuk men-deploy cluster ke VPC Bersama

Konfigurasi sistem file

Konfigurasi MDS/MGS

  • mds_ip_address - Alamat IP Internal yang akan ditentukan untuk node MDS/MGS
  • mds_machine_type - Jenis mesin yang akan digunakan untuk node MDS/MGS (lihat https://cloud.google.com/compute/docs/machine-types)
  • mds_boot_disk_type - Jenis disk yang akan digunakan untuk boot disk MDS/MGS (pd-standard, pd-ssd)
  • mds_boot_disk_size_gb - Ukuran boot disk MDS dalam GB
  • mdt_disk_type* - Jenis disk yang akan digunakan untuk disk Target Metadata (MDT) (pd-standard, pd-ssd, local-ssd)
  • mdt_disk_size_gb* - Ukuran disk MDT dalam GB

Konfigurasi OSS

  • oss_node_count* - Jumlah node Server Penyimpanan Objek (OSS) yang akan dibuat
  • oss_ip_range_start - Awal rentang IP untuk node OSS. Jika tidak ditentukan, gunakan penetapan IP otomatis
  • oss_machine_type - Jenis mesin yang akan digunakan untuk node OSS
  • oss_boot_disk_type - Jenis disk yang akan digunakan untuk disk booting OSS (pd-standard, pd-ssd)
  • oss_boot_disk_size_gb - Ukuran boot disk MDS dalam GB
  • ost_disk_type* - Jenis disk yang akan digunakan untuk disk Object Storage Target (OST) (pd-standard, pd-ssd, local-ssd)
  • ost_disk_size_gb* - Ukuran disk OST dalam GB

4. Men-deploy dan memverifikasi konfigurasi

Men-deploy Konfigurasi

Dalam sesi Cloud Shell, jalankan perintah berikut dari folder Lustre-gcp:

gcloud deployment-manager deployments create lustre --config lustre.yaml

Perintah ini membuat deployment bernama Lustre. Operasi ini dapat memerlukan waktu hingga 10-20 menit untuk selesai, jadi harap bersabar.

Setelah deployment selesai, Anda akan melihat output yang mirip dengan:

Create operation operation-1572410719018-5961966591cad-e25384f6-d4c905f8 completed successfully.
NAME                                TYPE                   STATE      ERRORS  INTENT
lustre-all-internal-firewall-rule  compute.v1.firewall    COMPLETED  []
lustre-lustre-network              compute.v1.network     COMPLETED  []
lustre-lustre-subnet               compute.v1.subnetwork  COMPLETED  []
lustre-mds1                        compute.v1.instance    COMPLETED  []
lustre-oss1                        compute.v1.instance    COMPLETED  []
lustre-oss2                        compute.v1.instance    COMPLETED  []
lustre-oss3                        compute.v1.instance    COMPLETED  []
lustre-oss4                        compute.v1.instance    COMPLETED  []
lustre-ssh-firewall-rule           compute.v1.firewall    COMPLETED  []

Memverifikasi Deployment

5f2a0557d3f2476f.png

Ikuti langkah-langkah berikut untuk melihat deployment di Konsol Google Cloud Platform:

  • Di Cloud Platform Console, buka menu Products & Services di pojok kiri atas konsol (tiga garis horizontal).
  • Klik Deployment Manager.
  • Klik Lustre untuk melihat detail deployment.
  • Klik Ringkasan - Lustre. Panel Deployment properties menampilkan keseluruhan konfigurasi deployment.
  • Klik "Lihat" di properti Config. Panel Config menampilkan konten file YAML konfigurasi deployment yang diubah sebelumnya. Pastikan konten sudah benar sebelum melanjutkan. Jika Anda perlu mengubah konfigurasi deployment, cukup hapus deployment sesuai dengan langkah-langkah di "Membersihkan Deployment", dan mulai ulang deployment sesuai dengan langkah-langkah di "Mengonfigurasi YAML Deployment Lustre".
  • (Opsional) Di bagian Lustre-cluster, klik setiap resource yang dibuat oleh template Lustre.jinja dan tinjau detailnya.

Setelah konfigurasi deployment diverifikasi, mari kita pastikan instance cluster dimulai. Di Cloud Platform Console, pada menu Products & Services, klik Compute Engine > VM Instances.

aec8498e04a3c334.png

Di halaman VM Instances, tinjau lima instance virtual machine yang telah dibuat oleh pengelola deployment. Ini termasuk lustre-mds1, lustre-oss1, lustre-oss2, lustre-oss3, dan lustre-oss4.

5. Mengakses Cluster Lustre

Memantau Penginstalan

Di halaman Instance VM, klik lustre-mds1 untuk membuka halaman Detail instance.

ba0bea7acdbb9527.png

Klik Port serial 1 (konsol) untuk membuka halaman output konsol serial. Kita akan menggunakan output serial ini untuk memantau proses penginstalan instance MDS, dan menunggu hingga skrip startup selesai. Klik tombol "refresh" di bagian atas halaman untuk memperbarui output serial. Node akan dimulai ulang sekali untuk melakukan booting ke kernel Lustre, dan menampilkan pesan yang mirip dengan di bawah ini:

Startup finished in 838ms (kernel) + 6.964s (initrd) + 49.302s (userspace) = 57.105s.
Lustre: lustre-MDT0000: Connection restored to 374e2d80-0b31-0cd7-b2bf-de35b8119534 (at 0@lo)

Ini berarti Lustre diinstal di cluster Lustre, dan sistem file siap digunakan.

Mengakses Cluster Lustre

Dalam sesi Cloud Shell, klik tombol SSH di samping instance lustre-mds1 di Konsol Google Cloud. Atau, jalankan perintah berikut di Cloud Shell, dengan mengganti <ZONE> untuk zona node lustre-mds1:

gcloud compute ssh lustre-mds1 --zone=<ZONE>

Perintah ini login ke virtual machine lustre-mds1. Ini adalah instance Server Metadata Lustre (MDS), yang juga bertindak sebagai instance Server Pengelolaan Lustre (MGS). Instance ini menangani semua permintaan autentikasi dan metadata untuk sistem file.

Mari kita pasang sistem file di instance lustre-mds1 agar dapat mengujinya nanti. Jalankan perintah berikut:

sudo mkdir /mnt/lustre
sudo mount -t lustre lustre-mds1:/lustre /mnt/lustre
cd /mnt/lustre

Ketiga perintah ini melakukan tiga hal. Perintah pertama membuat direktori lokal yang akan kita gunakan sebagai titik pemasangan di "/mnt/lustre". Perintah kedua menjalankan perintah "mount" untuk memasang sistem file jenis "lustre", yang berada di server lustre-mds1, dan nama sistem filenya adalah "lustre", yang terlihat sebagai "/lustre". Perintah mount memasang sistem file Lustre di direktori "/mnt/lustre" lokal Anda. Terakhir, perintah ketiga mengubah direktori ke direktori /mnt/lustre, tempat Lustre dipasang.

Anda kini telah memasang sistem file Lustre di /mnt/lustre. Mari kita lihat apa yang dapat kita lakukan dengan sistem file ini.

6. Tur Alat CLI Lustre

Jika Anda belum memahami Lustre dan alat-alatnya, kami akan menjelaskan beberapa perintah penting di sini.

Alat pengelolaan cluster level rendah Lustre adalah "lctl". Kita dapat menggunakan lctl untuk mengonfigurasi dan mengelola cluster Lustre, serta untuk melihat layanan cluster Lustre. Untuk melihat layanan dan instance di cluster Lustre baru, jalankan:

sudo lctl dl

Anda akan melihat output yang mirip dengan di bawah, bergantung pada perubahan yang Anda buat pada file konfigurasi YAML Lustre:

  0 UP osd-ldiskfs lustre-MDT0000-osd lustre-MDT0000-osd_UUID 11
  1 UP mgs MGS MGS 12
  2 UP mgc MGC10.128.15.2@tcp 374e2d80-0b31-0cd7-b2bf-de35b8119534 4
  3 UP mds MDS MDS_uuid 2
  4 UP lod lustre-MDT0000-mdtlov lustre-MDT0000-mdtlov_UUID 3
  5 UP mdt lustre-MDT0000 lustre-MDT0000_UUID 12
  6 UP mdd lustre-MDD0000 lustre-MDD0000_UUID 3
  7 UP qmt lustre-QMT0000 lustre-QMT0000_UUID 3
  8 UP lwp lustre-MDT0000-lwp-MDT0000 lustre-MDT0000-lwp-MDT0000_UUID 4
  9 UP osp lustre-OST0000-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 10 UP osp lustre-OST0002-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 11 UP osp lustre-OST0001-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4
 12 UP osp lustre-OST0003-osc-MDT0000 lustre-MDT0000-mdtlov_UUID 4

Kita dapat melihat Server Pengelolaan Lustre (MGS) sebagai item 1, Server Metadata Lustre (MDS) sebagai item 3, Target Metadata Lustre (MDT) sebagai item 5, dan empat Server Penyimpanan Objek Lustre (OSS) sebagai item 8 hingga 12. Untuk memahami layanan lainnya, tinjau Panduan Lustre.

Alat konfigurasi sistem file Lustre adalah "lfs". Kita dapat menggunakan lfs untuk mengelola striping file di Server Penyimpanan Objek Lustre (OSS) dan Target Penyimpanan Objek (OST) masing-masing, serta menjalankan operasi sistem file umum seperti find, df, dan pengelolaan kuota.

Striping memungkinkan kita mengonfigurasi cara file didistribusikan di seluruh cluster Lustre untuk memberikan performa terbaik. Meskipun striping file besar di sebanyak mungkin OSS sering kali memberikan performa terbaik dengan melakukan paralelisasi IO, striping file kecil dapat menyebabkan performa yang lebih buruk daripada jika file tersebut hanya ditulis ke satu instance.

Untuk mengujinya, mari kita siapkan dua direktori, satu dengan jumlah stripe satu OSS, dan satu dengan jumlah stripe "-1", yang menunjukkan bahwa file yang ditulis di direktori tersebut harus di-stripe di sebanyak mungkin OSS. Direktori dapat menyimpan konfigurasi striping yang diwarisi oleh file yang dibuat di dalamnya, tetapi subdirektori dan setiap file dalam direktori tersebut kemudian dapat dikonfigurasi untuk di-striping secara berbeda jika diinginkan. Untuk membuat kedua direktori ini, jalankan perintah berikut saat berada di direktori "/mnt/lustre":

sudo mkdir stripe_one
sudo mkdir stripe_all
sudo lfs setstripe -c 1 stripe_one/
sudo lfs setstripe -c -1 stripe_all/

Anda dapat melihat setelan stripe file atau direktori menggunakan lfs getstripe:

sudo lfs getstripe stripe_all/

Anda akan melihat output yang menampilkan jumlah stripe yang ditetapkan sebagai -1:

stripe_all/
stripe_count:  -1 stripe_size:   1048576 pattern:    raid0 stripe_offset: -1

Sekarang kita siap menguji peningkatan performa yang dapat dicapai dengan menulis file besar yang di-striping di beberapa OSS.

7. Menguji I/O Lustre

Kita akan menjalankan dua pengujian sederhana pada IO Lustre untuk menunjukkan kemungkinan keunggulan performa dan kemampuan penskalaan sistem file Lustre. Pertama, kita akan menjalankan pengujian sederhana menggunakan utilitas "dd" untuk menulis file 5 GB ke direktori "stripe_one". Jalankan perintah berikut:

sudo dd if=/dev/zero of=stripe_one/test bs=1M count=5000

Proses penulisan data sebesar 5 GB ke sistem file rata-rata memerlukan waktu sekitar 27 detik, dengan penulisan ke satu Persistent Disk (PD) di satu Server Penyimpanan Objek (OSS).

Untuk menguji striping di beberapa OSS, dan karenanya beberapa PD, kita hanya perlu mengubah direktori output yang kita tulis. Jalankan perintah berikut:

sudo dd if=/dev/zero of=stripe_all/test bs=1M count=5000

Perhatikan bahwa kita mengubah "of=stripe_one/test" menjadi "of=stripe_all/test". Hal ini akan memungkinkan penulisan satu aliran kami mendistribusikan penulisannya di semua Server Object Storage kami, dan menyelesaikan penulisan rata-rata dalam 5,5 detik, sekitar 4x lebih cepat dengan empat OSS.

Performa ini terus meningkat saat Anda menambahkan Server Penyimpanan Objek, dan Anda dapat menambahkan OSS dengan sistem file secara online dan mulai mengelompokkan data ke OSS tersebut untuk meningkatkan kapasitas dan performa secara online. Kemungkinannya tidak terbatas menggunakan Lustre di Google Cloud Platform, dan kami tidak sabar untuk melihat apa yang dapat Anda buat, dan masalah yang dapat Anda pecahkan.

8. Kesimpulan

Selamat, Anda telah membuat cluster Lustre di Google Cloud Platform. Anda dapat menggunakan skrip ini sebagai titik awal untuk mem-build cluster Lustre Anda sendiri, dan untuk mengintegrasikannya dengan cluster komputasi berbasis cloud.

Membersihkan Deployment

Logout dari node Lustre:

exit

Anda dapat dengan mudah membersihkan deployment setelah selesai dengan menjalankan perintah berikut dari Google Cloud Shell, setelah logout dari cluster Lustre:

gcloud deployment-manager deployments delete lustre

Saat diminta, ketik Y untuk melanjutkan. Operasi ini dapat memerlukan waktu beberapa saat, harap bersabar.

Menghapus Project

Untuk melakukan pembersihan, cukup hapus project.

  • Di menu navigasi, pilih IAM & Admin
  • Kemudian, klik setelan di submenu
  • Klik ikon tempat sampah dengan teks "Hapus Project"
  • Ikuti petunjuk perintah

Yang telah kita bahas

  • Cara menggunakan Layanan Deployment Manager GCP.
  • Cara mengonfigurasi dan men-deploy sistem file Lustre di GCP.
  • Cara mengonfigurasi striping dan menguji I/O sederhana ke sistem file Lustre.

Menemukan Dukungan

Apakah Anda membuat sesuatu yang keren menggunakan skrip deployment manager Lustre? Ada pertanyaan? Chat dengan kami di grup diskusi Google Cloud Lustre. Untuk meminta fitur, memberikan masukan, atau melaporkan bug, gunakan formulir ini, atau jangan ragu untuk mengubah kode dan mengirimkan permintaan pull. Ingin berbicara dengan pakar Google Cloud? Hubungi tim Google Cloud sekarang melalui situs Komputasi Berperforma Tinggi Google Cloud.

Pelajari Lebih Lanjut

Masukan

Kirim masukan tentang codelab ini menggunakan link ini. Menyampaikan masukan memerlukan waktu kurang dari 5 menit. Terima kasih!