Perkirakan biaya GKE di awal siklus pengembangan menggunakan GitHub

Last reviewed 2022-12-15 UTC

Tutorial ini menunjukkan praktik terbaik untuk mengalihkan visibilitas biaya Google Kubernetes Engine (GKE) ke tim pengembangan Anda. Praktik shift-left ini menghasilkan awareness terhadap biaya di awal proses, sehingga membantu Anda menghindari biaya tidak terduga dalam tagihan Google Cloud.

Tutorial ini ditujukan bagi developer, operator, dan praktisi FinOps yang ingin mengoptimalkan biaya di cluster GKE dan yang menggunakan GitHub dalam produksinya. Jika menggunakan GitLab sebagai gantinya, lihat Memperkirakan biaya GKE di awal siklus pengembangan menggunakan GitLab.

Tutorial ini mengasumsikan bahwa Anda sudah memahami Docker, GitHub, Kubernetes, GKE, Cloud Build, dan Linux.

Ringkasan

Banyak tim yang menggunakan cloud publik tidak terbiasa dengan gaya penagihan bayar sesuai penggunaan. Sering kali, mereka tidak sepenuhnya memahami lingkungan tempat aplikasi mereka berjalan—dalam hal ini GKE. Model operasi FinOps mempromosikan budaya akuntabilitas keuangan. Praktik terbaik FinOps adalah memberikan informasi real-time kepada tim tentang pengeluaran mereka, sehingga masalah biaya dapat ditangani segera setelah masalah tersebut muncul.

Dokumen ini menunjukkan cara melangkah lebih jauh dengan memperkirakan biaya sebelum menimbulkan pengeluaran dalam tagihan Anda. Seperti yang disorot di situs GitHub, "Di GitHub, alat peninjauan kode yang ringan dibangun ke dalam setiap permintaan pull." Dengan begitu, Anda dapat "mengembangkan project, mengusulkan fitur baru, dan mendiskusikan detail implementasi sebelum mengubah kode sumber." Waktu terbaik untuk memperkirakan biaya adalah di awal proses selama pengembangan dan pada waktu peninjauan kode. Dengan cara ini, praktisi dapat memahami dan mendiskusikan alternatif dampak biaya dari fitur baru dan perbaikan bug sebelum menjadi masalah. Diagram berikut merangkum praktik tersebut.

Praktik terbaik untuk memperkirakan biaya lebih awal.

Seperti yang ditunjukkan pada diagram, developer memperkirakan biaya GKE di lingkungan lokalnya, idealnya pada waktu build. Perkiraan ini memberi mereka pemahaman yang baik tentang biaya beban kerja produksi bulanan. Saat fitur atau perbaikan bug sudah selesai, mereka mengusulkan permintaan pull yang memicu Cloud Build untuk memeriksa perbedaan antara biaya lama dan baru. Jika ada peningkatan di atas nilai minimum yang telah ditentukan, pengguna dapat meminta peninjauan kode baru. Praktik ini membantu developer lebih menyadari kapasitas beban kerja mereka dan secara proaktif memperbaiki masalah aplikasi, bukan menambahkan lebih banyak resource setiap kali ketidakstabilan ditemukan dalam produksi.

Tujuan

  • Membangun dan mengirim image penaksir biaya Kubernetes.
  • Membuat repositori GitHub.
  • Menghubungkan Cloud Build ke repositori GitHub Anda.
  • Mengirim kode contoh ke repositori GitHub Anda.
  • Mengubah kode dan ajukan permintaan pull untuk melihat cara kerja estimasi biaya.

Biaya

Dalam dokumen ini, Anda menggunakan komponen Google Cloud yang dapat ditagih berikut:

Untuk membuat perkiraan biaya berdasarkan proyeksi penggunaan Anda, gunakan kalkulator harga. Pengguna baru Google Cloud mungkin memenuhi syarat untuk mendapatkan uji coba gratis.

Setelah menyelesaikan tugas yang dijelaskan dalam dokumen ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk mengetahui informasi selengkapnya, lihat Pembersihan.

Sebelum memulai

  1. Di konsol Google Cloud, buka halaman Pemilih project.

    Buka pemilih project

  2. Pilih atau buat project Google Cloud.

  3. Pastikan penagihan telah diaktifkan untuk project Google Cloud Anda.

  4. Di konsol Google Cloud, aktifkan Cloud Shell.

    Aktifkan Cloud Shell

    Di bagian bawah Google Cloud Console, Cloud Shell sesi akan terbuka dan menampilkan perintah command line. Cloud Shell adalah lingkungan shell dengan Google Cloud CLI yang sudah terinstal, dan dengan nilai yang sudah ditetapkan untuk project Anda saat ini. Diperlukan waktu beberapa detik untuk melakukan inisialisasi sesi.

Menyiapkan lingkungan Anda

  1. Di Cloud Shell, clone repositori GitHub gke-shift-left-cost:

    git clone https://github.com/GoogleCloudPlatform/gke-shift-left-cost
    cd gke-shift-left-cost
    

    Kode dalam repositori ini disusun ke dalam folder berikut:

    • Root: Berisi file Dockerfile yang digunakan untuk membuat image estimator biaya dan file main.go yang menerapkan logika command line untuk estimator.
    • api/: Berisi Golang API untuk memanipulasi objek Kubernetes dan membuat estimasi biaya.
    • samples/: Berisi contoh manifes Kubernetes sehingga Anda dapat bereksperimen dengan proses sebelum menerapkannya di organisasi Anda.
  2. Tetapkan project ID Google Cloud, pengguna GitHub, dan alamat email Anda, serta pengguna GitHub lain untuk bertindak sebagai peninjau FinOps:

    export GCP_PROJECT_ID=YOUR_PROJECT_ID
    export GITHUB_USER=YOUR_GITHUB_USER
    export GITHUB_EMAIL=YOUR_GITHUB_EMAIL_ADDRESS
    export GITHUB_FINOPS_REVIEWER_USER=ANOTHER_GITHUB_USER
    

    Ganti kode berikut:

    • YOUR_PROJECT_ID: ID project Google Cloud untuk project yang Anda gunakan dalam tutorial ini.
    • YOUR_GITHUB_USER: pengguna yang digunakan untuk login ke akun GitHub Anda.
    • YOUR_GITHUB_EMAIL_ADDRESS: email yang Anda gunakan di akun GitHub.
    • ANOTHER_GITHUB_USER: pengguna GitHub lain untuk bertindak sebagai peninjau FinOps. Perlu diperhatikan bahwa tutorial ini mengharuskan Anda menambahkan pengguna ini sebagai kolaborator repositori, sehingga pengguna tersebut tidak boleh menjadi diri Anda sendiri. Untuk menghindari macet selama langkah-langkah tutorial, pastikan pengguna ini menerima undangan segera setelah Anda membuat undangan.
  3. Tetapkan project Google Cloud dan aktifkan API yang diperlukan:

    gcloud config set project $GCP_PROJECT_ID
    
    gcloud services enable cloudbilling.googleapis.com \
        artifactregistry.googleapis.com \
        cloudbuild.googleapis.com
    

Membangun dan mengirim image penaksir biaya Kubernetes

Alat penaksir biaya Kubernetes yang disertakan dalam tutorial ini hanyalah contoh dari apa yang dapat dilakukan. Alat ini menawarkan kemampuan memperkirakan biaya untuk objek Kubernetes DaemonSet, Deployment, StatefulSet, ReplicaSet, HorizontalPodAutoScaler, dan PersistentVolumeClaim Kubernetes. Anda juga dapat menerapkan alat estimasi biaya sendiri atau mengusulkan permintaan pull dengan peningkatan yang Anda inginkan.

  1. Di Cloud Shell, izinkan application-default menggunakan kredensial Anda:

    gcloud auth application-default login
    
  2. Bangun biner penaksir biaya Kubernetes:

    mkdir ./bin
    go test ./api
    go build -v -o ./bin/k8s-cost-estimator .
    
  3. Uji biner dengan mengeksekusi estimasi biaya dalam folder sampel:

    ./bin/k8s-cost-estimator \
        --k8s ./samples/k8s-cost-estimator-local/app-v1  \
        --config ./samples/k8s-cost-estimator-local/example-conf.yaml --v trace
    

    Pada output, Anda akan melihat tabel Markdown yang menguraikan perkiraan biaya bulanan untuk folder ./samples/k8s-cost-estimator-local/app-v1/. Untuk lebih memahami biaya produksi bulanan aplikasi, developer dapat menjalankan langkah ini sebelum menerapkan ke repositori jarak jauh.

    INFO[0000] Starting cost estimation (version v0.0.1)...
    ...
    
    |         KIND          | MIN REQUESTED (USD) | MIN REQ + HPA CPU BUFFER (USD) | MAX REQUESTED (USD) | MIN LIMITED (USD) | MAX LIMITED (USD) |
    |-----------------------|---------------------|--------------------------------|---------------------|-------------------|-------------------|
    | Deployment            |             $133.31 |                        $198.71 |             $266.54 |           $312.83 |           $579.29 |
    | StatefulSet           |              $36.33 |                         $36.33 |              $36.33 |            $72.67 |            $72.67 |
    | DaemonSet             |              $29.68 |                         $29.68 |              $29.68 |            $53.19 |            $53.19 |
    | PersistentVolumeClaim |              $28.88 |                         $28.88 |              $28.88 |            $33.68 |            $33.68 |
    | **TOTAL**             |         **$228.20** |                    **$293.60** |         **$361.43** |       **$472.38** |       **$738.83** |
    
    INFO[0002] Finished cost estimation!
    
  4. Bangun image container estimator biaya Kubernetes:

    docker build . -t us-central1-docker.pkg.dev/$GCP_PROJECT_ID/docker-repo/k8s-cost-estimator:v0.0.1
    
  5. Buat repositori Docker Artifact Registry untuk menyimpan image:

    gcloud artifacts repositories create docker-repo \
            --repository-format=docker \
            --location=us-central1 \
            --description="Docker repository"
    
  6. Daftarkan gcloud sebagai helper kredensial ke file konfigurasi Docker. Jika diminta, konfirmasi pembaruan file.

    gcloud auth configure-docker us-central1-docker.pkg.dev
    
  7. Kirim image ke Artifact Registry:

    docker push us-central1-docker.pkg.dev/$GCP_PROJECT_ID/docker-repo/k8s-cost-estimator:v0.0.1
    

Membuat repositori GitHub baru

  1. Di Cloud Shell, ubah direktori menjadi contoh GitHub:

    cd samples/k8s-cost-estimator-github
    
  2. Di GitHub, buat token akses:

    Buka halaman GitHub Personal Access Tokens

    1. Di kolom Note, masukkan deskripsi token.
    2. Di bagian Select scope, pilih kotak centang repo, admin:public_key, dan delete_repo.
    3. Klik Generate token, lalu salin nilai yang ada di Your new personal access token ke bagian atas halaman.
  3. Di Cloud Shell, simpan token akses pribadi Anda dalam variabel.

    GITHUB_TOKEN=YOUR_NEW_PERSONAL_ACCESS_TOKEN
    

    Ganti kode berikut:

    • YOUR_NEW_PERSONAL_ACCESS_TOKEN: token akses pribadi yang baru saja Anda buat.
  4. Buat repositori GitHub:

    curl -X POST \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/user/repos \
      -d '{"name":"k8s-cost-estimator-github"}' | jq
    

    Outputnya mirip dengan hal berikut ini:

    {
      "id": 36099474,
      "node_id": "MDEwOldfsdjA5OTQ3Njc=",
      "name": "k8s-cost-estimator-github",
      ...
    }
    
  5. Tambahkan peninjau FinOps sebagai kolaborator di repositori Anda:

    curl -X PUT \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github/collaborators/$GITHUB_FINOPS_REVIEWER_USER  | jq -r .html_url
    

    Outputnya mirip dengan hal berikut ini:

    https://github.com/your-user/k8s-cost-estimator-github/invitations
    
  6. Bagikan URL output kepada pengguna yang Anda tetapkan di variabel GITHUB_FINOPS_REVIEWER_USER agar mereka dapat menerima undangan. Sebelum melanjutkan ke langkah berikutnya, buka URL yang sama untuk memastikan undangan diterima.

    Verifikasi bahwa undangan telah diterima.

Menghubungkan Cloud Build ke repositori GitHub Anda

Bagian ini menunjukkan cara menginstal aplikasi GitHub Cloud Build. Penginstalan ini memungkinkan Anda menghubungkan repositori GitHub dengan project Google Cloud Anda, sehingga Cloud Build dapat otomatis menjalankan alat penaksir Kubernetes di setiap permintaan pull.

  1. Buka halaman GitHub Marketplace untuk aplikasi Cloud Build:

    Buka Cloud Build

  2. Siapkan akses akun GitHub untuk aplikasi:

    1. Jika ini pertama kalinya Anda mengonfigurasi aplikasi di GitHub, klik Setup with Google Cloud Build di bagian bawah halaman, lalu klik Grant this app access to akun GitHub.
    2. Jika sebelumnya Anda telah menyiapkan aplikasi di GitHub, klik Configure access.
  3. Di halaman Applications yang terbuka, ikuti langkah-langkah berikut:

    1. Di baris Google Cloud Build, klik Configure.
    2. Pilih opsi Only select repository.
    3. Pilih k8s-cost-estimator-github untuk terhubung ke repositori yang baru saja Anda buat.
    4. Klik Save—atau Install (label tombol akan berubah bergantung pada alur yang Anda jalankan).
  4. Anda sekarang dialihkan ke Google Cloud untuk melanjutkan penginstalan. Login dengan akun Google Cloud Anda. Jika diminta, izinkan integrasi Cloud Build dengan GitHub.

  5. Di halaman Cloud Build, pilih project Anda. Wizard akan muncul.

  6. Di bagian Select repository di wizard, pilih akun GitHub Anda dan repositori k8s-cost-estimator-github.

  7. Jika Anda menyetujui persyaratan dan ketentuan ini, pilih kotak centang, lalu klik Connect.

  8. Di bagian Create a trigger, klik Create a trigger, lalu ikuti langkah-langkah berikut:

    1. Masukkan nama pemicu.
    2. Di bagian Event, pilih Pull request (GitHub App only).
    3. Di bagian Sumber:
      • Pastikan kolom Repository sudah diisi secara otomatis dengan your-github-user/k8s-cost-estimator-github (Aplikasi GitHub).
      • Di dropdown Base Branch, pilih .*.
    4. Di bagian Configuration Type, pilih Cloud Build configuration file (yaml or json).
    5. Di bagian Advanced, tambahkan variabel substitusi berikut:

      • _GITHUB_TOKEN = YOUR_PERSONAL_ACCESS_TOKEN
      • _GITHUB_FINOPS_REVIEWER_USER = THE_GITHUB_FINOPS_REVIEWER_USER
      • _GITHUB_FINOPS_COST_USD_BATAS = 10

      Ganti kode berikut:

      • YOUR_PERSONAL_ACCESS_TOKEN: token akses pribadi GitHub yang Anda buat. Token ini tersedia dalam variabel GITHUB_TOKEN di Cloud Shell.
      • THE_GITHUB_FINOPS_REVIEWER_USER: pengguna yang Anda undang sebagai kolaborator di repositori GitHub Anda. Nama pengguna ini tersedia dalam variabel GITHUB_FINOPS_REVIEWER_USER di Cloud Shell.
  9. Klik Create.

Aplikasi GitHub Cloud Build sekarang sudah dikonfigurasi, dan repositori GitHub Anda ditautkan ke project Google Cloud Anda. Permintaan pull ke repositori GitHub Anda sekarang memicu eksekusi Cloud Build, yang melaporkan kembali hasilnya ke GitHub menggunakan Pemeriksaan GitHub.

Kirim kode contoh ke repositori GitHub Anda

  1. Buat keypair SSH agar Anda dapat mengirim kode contoh ke repositori GitHub:

    mkdir -p ssh && cd ssh
    ssh-keygen -t rsa -b 4096 -N '' -f github-key
    eval `ssh-agent` && ssh-add $(pwd)/github-key
    curl -X POST \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/user/keys \
      -d "{\"title\":\"k8s-cost-estimator-key\", \"key\":\"$(cat github-key.pub)\"}" | jq
    cd ..
    

    Outputnya mirip dengan hal berikut ini:

    {
      "id": 52356205,
      "key": "ssh-rsa AAAAB3NzaC….wJICyt0yvWjGFZGCWBPUw==",
      "url": "https://api.github.com/user/keys/526205",
      "title": "k8s-cost-estimator-key",
      "verified": true,
      "created_at": "2021-04-23T16:22:58Z",
      "read_only": false
    }
    
  2. Kirim konten ke repositori GitHub baru Anda:

    sed "s/GCP_PROJECT_ID/$GCP_PROJECT_ID/g; s/GITHUB_USER/$GITHUB_USER/g; s/GITHUB_EMAIL/$GITHUB_EMAIL/g;" templates/cloudbuild.yaml.tpl > cloudbuild.yaml
    
    GITHUB_SSH_URL_REPO=$(curl -X GET \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github | jq -r .ssh_url)
    [ -z "$GITHUB_SSH_URL_REPO" ] && echo "GITHUB_SSH_URL_REPO is not exported" || echo "GITHUB_SSH_URL_REPO is $GITHUB_SSH_URL_REPO"
    
    git init
    git remote add origin $GITHUB_SSH_URL_REPO
    git add -A .
    git commit -m "Initial commit"
    git checkout -b main
    git push -u origin main
    

Ubah kode dan buat permintaan pull untuk menguji estimasi biaya

  1. Di Cloud Shell, dapatkan URL GitHub ke file wordpress/wordpress_hpa.yaml:

    echo "https://github.com/$GITHUB_USER/k8s-cost-estimator-github/edit/main/wordpress/wordpress_hpa.yaml"
    
  2. Tekan Ctrl+klik (Cmd+klik untuk pengguna Mac) URL output untuk membuka GitHub dan mengedit file wordpress/wordpress_hpa.yaml.

  3. Di GitHub, ubah minReplicas menjadi 5.

  4. Pilih Create a new branch untuk commit ini dan mulai permintaan pull, lalu klik Propose Changes.

  5. Di layar Open a pull request, klik Create pull request.

    Selain membuat permintaan pull baru, langkah ini memicu eksekusi Cloud Build berdasarkan file cloudbuild.yaml yang Anda buat sebelumnya. Eksekusi Cloud Build ini menggunakan image container yang Anda bangun di Membangun dan mengirim image penaksir biaya Kubernetes, dan membuat keputusan saat peninjau FinOps diperlukan.

  6. Tunggu sekitar satu menit hingga pipeline selesai. Setelah selesai, komentar dengan detail biaya akan ditambahkan dalam permintaan pull, dan karena kenaikan biaya kode yang Anda usulkan melebihi batas $10, peninjau FinOps juga akan diminta.

    Outputnya mirip dengan hal berikut ini:

    Perincian biaya terperinci akan ditambahkan ke permintaan pull.

Sekarang, Anda sudah mengetahui cara memberi developer visibilitas tentang pengeluaran mereka di awal siklus pengembangan. Pengaturan ini membantu Anda dan organisasi Anda menghindari kejutan dalam tagihan Google Cloud.

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, Anda dapat menghapus project Anda.

Menghapus project

  1. Di konsol Google Cloud, buka halaman Manage resource.

    Buka Manage resource

  2. Pada daftar project, pilih project yang ingin Anda hapus, lalu klik Delete.
  3. Pada dialog, ketik project ID, lalu klik Shut down untuk menghapus project.

Menghapus repositori GitHub

Jika Anda tidak ingin menyimpan repositori GitHub Anda, ikuti langkah-langkah berikut:

  1. Di Cloud Shell, hapus repositori GitHub Anda:

    curl -X DELETE \
      -H "Accept: application/vnd.github.v3+json" \
      -H "Authorization: Bearer $GITHUB_TOKEN" \
      https://api.github.com/repos/$GITHUB_USER/k8s-cost-estimator-github
    

    Jika koneksi dengan Cloud Shell terputus, Anda harus mereset variabel GITHUB_TOKEN dan GITHUB_USER.

Langkah selanjutnya