Tentang paket fleet

Halaman ini menjelaskan paket fleet, FleetPackage API, dan hubungannya dengan Config Sync.

FleetPackage adalah API deklaratif yang memungkinkan Anda mengelola paket di seluruh fleet. Paket fleet adalah kumpulan manifes YAML Kubernetes yang menentukan konfigurasi cluster. Dengan menggunakan paket fleet, Anda dapat men-deploy paket melalui peluncuran serentak atau progresif ke cluster yang terdaftar ke fleet Anda.

Anda menentukan setiap objek FleetPackage sekali, lalu dapat memperbarui paket tersebut dengan revisi baru. Saat Anda menerapkan revisi baru, layanan paket fleet akan mengambil perubahan tersebut dan men-deploy-nya ke cluster Anda.

Manfaat

Gunakan paket fleet untuk men-deploy resource Kubernetes di seluruh cluster yang terdaftar ke fleet. Setelah Anda membuat dan menerapkan paket fleet, paket fleet akan otomatis men-deploy file konfigurasi Kubernetes di repositori Git ke cluster baru. Paket fleet dibuat berdasarkan manfaat Config Sync seperti koreksi drift otomatis, dan menawarkan keunggulan unik berikut:

  • Mengotomatiskan peluncuran resource: Setelah Anda menyiapkan paket fleet, resource Kubernetes yang ditujuknya akan otomatis di-deploy oleh layanan paket fleet di semua cluster.

  • Mengonfigurasi cluster baru secara otomatis: Jika Anda mengonfigurasi paket fleet lalu menambahkan cluster baru ke fleet, resource apa pun yang ditentukan oleh paket fleet akan otomatis di-deploy ke cluster baru.

  • Mengelola konfigurasi Kubernetes dalam skala besar: Daripada mengelola cluster satu per satu, gunakan paket fleet untuk men-deploy resource ke seluruh fleet cluster.

  • Meminimalkan dampak perubahan yang salah: Pilih jumlah maksimum cluster untuk men-deploy resource sekaligus. Anda dapat memantau perubahan pada setiap cluster secara cermat untuk memastikan perubahan yang salah tidak memengaruhi seluruh fleet Anda.

  • Menyederhanakan konfigurasi Config Sync: Paket fleet menggunakan Cloud Build untuk melakukan autentikasi ke Git, yang berarti Anda melakukan autentikasi sekali per project, bukan sekali per objek RootSync atau RepoSync.

Anda mungkin lebih suka menggunakan Config Sync dengan objek RootSync atau RepoSync, bukan paket fleet, jika satu atau beberapa skenario berikut berlaku untuk Anda:

  • Anda mengelola sejumlah kecil cluster.

  • Anda memerlukan kontrol lebih besar atas cara resource di-deploy ke cluster Anda, di luar yang disediakan oleh fleet package API dengan label dan varian.

Persyaratan dan batasan

  • Hanya repositori Git yang didukung sebagai sumber tepercaya saat mengonfigurasi paket fleet.

  • Resource Kubernetes yang disimpan di Git harus mewakili status akhir resource. Overlay tambahan untuk mengubah resource yang disimpan di Git tidak didukung. Untuk mengetahui informasi selengkapnya tentang perbedaan resource ini, lihat Praktik terbaik: Membuat repositori WET.

  • FleetPackage API hanya tersedia di region us-central1. Anda tetap dapat men-deploy ke cluster di region lain, tetapi Anda harus menyiapkan Cloud Build dan mengonfigurasi gcloud CLI di us-central1.

  • Jumlah maksimum paket fleet adalah 300 per project per region.

Arsitektur

Anda dapat menggunakan FleetPackage API untuk men-deploy manifes Kubernetes ke fleet cluster. FleetPackage API menggunakan Cloud Build untuk menyinkronkan dan mengambil resource Kubernetes dari repositori Git Anda. Layanan paket fleet kemudian men-deploy resource tersebut ke cluster Anda.

Diagram yang menunjukkan alur resource Kubernetes dalam sinkronisasi Git ke fleet cluster

Cara varian dibuat

Paket fleet menggunakan sistem varian untuk men-deploy konfigurasi resource Kubernetes yang berbeda ke cluster atau grup cluster yang berbeda dalam fleet Anda, tetapi dari repositori Git yang sama.

Ada dua kolom dalam spesifikasi FleetPackage yang mengontrol perilaku varian:

  1. resourceBundleSelector.cloudBuildRepository.variantsPattern: Pola glob yang digunakan untuk menemukan file dan direktori di repositori Git Anda (di bawah path yang ditentukan, atau root repositori jika path dihilangkan). Pola ini menentukan file atau direktori mana yang menjadi varian dan konten apa yang disertakan.
  2. variantSelector.variantNameTemplate: Ekspresi yang memetakan setiap cluster dalam fleet Anda ke salah satu nama varian yang dihasilkan oleh variantsPattern. Pilihan ini didasarkan pada metadata keanggotaan fleet cluster.

Pencocokan variantsPattern

Kolom variantsPattern diperlukan untuk menentukan cara membuat varian dari konfigurasi yang disimpan di repositori Anda. Pencocokan menggunakan logika berikut:

  • Pencocokan file: Jika pola cocok dengan file YAML, varian akan dibuat.

    • Nama varian: Nama file tanpa ekstensi (misalnya, prod-config.yaml menjadi varian prod-config).
    • Konten varian: Konten dari satu file ini.
  • Pencocokan direktori: Jika pola cocok dengan direktori, varian akan dibuat.

    • Nama varian: Nama direktori (misalnya, direktori dev menjadi varian dev).
    • Konten varian: Kombinasi semua file YAML yang ditemukan dalam direktori ini dan semua subdirektorinya, secara rekursif.

Pola pencocokan file memiliki batasan berikut:

  • Tidak ada karakter pengganti rekursif (ganda). Pola ** tidak didukung.
  • Jika pola menyertakan karakter titik (.), pola tersebut harus diikuti oleh karakter alfanumerik.
  • Pola tidak dapat menyertakan tanda kutip tunggal (').
  • Nama varian harus unik. Jika pola Anda cocok dengan beberapa file dengan nama yang sama (misalnya, app1/deploy.yaml dan app2/deploy.yaml), keduanya akan mencoba membuat varian bernama deploy, yang menyebabkan konflik nama.

Sebagai contoh, pertimbangkan repositori dengan struktur berikut:

repo-root/
└── FleetPackages/
    └── clusters/
        ├── common-ingress.yaml
        ├── us-central1-a/
        │   ├── gke-1/
        │   │   ├── deployment.yaml
        │   │   └── service.yaml
        │   └── gke-2/
        │       ├── deployment.yaml
        │       └── service.yaml
        └── us-central1-b/
            ├── gke-1.yaml
            └── blue-green.yaml

Anda dapat mencocokkan, dan oleh karena itu menyinkronkan ke cluster Anda, file yang berbeda, bergantung pada jenis pencocokan file atau direktori yang Anda tentukan dalam spesifikasi paket fleet, misalnya:

  • variantsPattern: "*": Cocok dengan common-ingress.yaml, us-central1-a, dan us-central1-b. Menghasilkan varian:

    • common-ingress (dari file)
    • us-central1-a (menggabungkan semua file YAML dalam folder tersebut)
    • us-central1-b (menggabungkan semua YAML dalam folder tersebut)
  • variantsPattern: "*.yaml": Cocok dengan common-ingress.yaml. Menghasilkan varian:

    • common-ingress
  • variantsPattern: "us-*": Cocok dengan us-central1-a dan us-central1-b. Menghasilkan varian:

    • us-central1-a
    • us-central1-b
  • variantsPattern: "us-central1-b/*.yaml": Cocok dengan us-central1-b/gke-1.yaml dan us-central1-b/blue-green.yaml. Menghasilkan varian:

    • gke-1
    • blue-green

Pencocokan variantNameTemplate

Setelah varian ditentukan, kolom variantNameTemplate di bagian variantSelector akan menentukan varian mana yang diterapkan ke setiap cluster. Template dapat menggunakan variabel untuk mengakses metadata keanggotaan fleet berikut:

  • ${membership.name}: Nama keanggotaan fleet cluster.
  • ${membership.location}: Lokasi keanggotaan fleet.
  • ${membership.project}: Project keanggotaan fleet.
  • ${membership.labels['KEY']}: Nilai label KEY pada keanggotaan fleet.

Misalnya, pertimbangkan skenario berikut yang menggunakan label untuk mencocokkan varian:

  • variantNameTemplate: "${membership.labels['env']}": Cluster dengan label env: prod disinkronkan ke varian bernama prod.
  • variantNameTemplate: "${membership.location}": Cluster disinkronkan ke varian yang cocok dengan lokasinya (misalnya, us-central1-a).
  • variantNameTemplate: "default": Cluster disinkronkan ke varian bernama default. Ini adalah perilaku default jika variantSelector dihilangkan. Jika repositori Anda tidak berisi file bernama default.yaml atau direktori bernama default, tidak ada yang disinkronkan.

Menggabungkan variantsPattern dan variantNameTemplate

Agar deployment berhasil, Anda harus memastikan bahwa nama varian yang dihasilkan oleh variantsPattern adalah nama yang dapat disinkronkan oleh cluster Anda dengan mencocokkan variantNameTemplate.

Misalnya, untuk men-deploy ke cluster berdasarkan label lingkungan, Anda dapat menyusun repositori Git dengan direktori seperti dev, staging, dan prod. Kemudian, Anda akan menggunakan spesifikasi paket fleet berikut:

resourceBundleSelector:
  cloudBuildRepository:
    # ... other fields
    path: "manifests"
    variantsPattern: "*" # Matches dev, staging, prod directories
variantSelector:
  variantNameTemplate: "${membership.labels['env']}"

Dengan konfigurasi ini, cluster yang diberi label env: staging akan menerima konten direktori manifests/staging/.

Strategi deployment

Anda dapat menggunakan paket fleet untuk men-deploy resource dari repositori Git ke seluruh fleet cluster. Anda juga dapat mengonfigurasi paket fleet untuk mengontrol cara, tempat, dan jenis resource yang di-deploy.

Bagian berikut menunjukkan contoh konfigurasi FleetPackage yang berbeda. Untuk mengetahui informasi lebih mendetail tentang cara menerapkan paket fleet, lihat Men-deploy paket fleet.

Deployment ke semua cluster dalam fleet

FleetPackage berikut menggunakan strategi rolling untuk men-deploy resource Kubernetes ke tiga cluster sekaligus dan menargetkan semua cluster dalam fleet:

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    variantsPattern: "*.yaml"
    serviceAccount: projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com
target:
  fleet:
    project: projects/my-project
rolloutStrategy:
  rolling:
    maxConcurrent: 3
variantSelector:
  variantNameTemplate: deployment # matches a file named deployment.yaml

Deployment ke subset cluster

`FleetPackage` berikut menggunakan pemilih label untuk men-deploy resource Kubernetes hanya ke cluster dengan label keanggotaan country yang cocok dengan "us" di fleet:FleetPackage

resourceBundleSelector:
  cloudBuildRepository:
    name: projects/my-project/locations/us-central1/connections/my-connection/repositories/my-repo
    tag: v1.0.0
    variantsPattern: "*.yaml"
    serviceAccount: projects/my-project/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com
target:
  fleet:
    project: projects/my-project
    selector:
      matchLabels:
        country: "us"
rolloutStrategy:
  rolling:
    maxConcurrent: 3

Langkah berikutnya

Men-deploy paket fleet