Halaman ini menjelaskan kapan dan alasan pembuatan template instance deterministik. Template instance deterministik menjelaskan secara eksplisit jenis layanan atau aplikasi pihak ketiga yang akan diinstal di instance Anda saat template instance tersebut di-deploy. Dengan membuat template instance deterministik, Anda meminimalkan ambiguitas dan perilaku yang tidak terduga dari template instance Anda.
Alasan membuat template instance deterministik
Secara umum, sebaiknya properti template instance Anda se-eksplisit dan se-deterministik mungkin. Jika Anda men-deploy skrip startup dalam template instance yang menginstal atau menggunakan layanan pihak ketiga, pastikan skrip ini memberikan informasi eksplisit, seperti versi aplikasi yang akan diinstal. Compute Engine hanya dapat mengandalkan informasi yang ditentukan di dalam template dan tidak memiliki kontrol atas layanan pihak ketiga yang direferensikan. Jika template Anda terlalu samar, template instance Anda mungkin berperilaku tidak terduga.
Misalnya, pertimbangkan perintah berikut untuk membuat template instance dengan skrip startup yang menginstal apache2 dan menggunakan file yang dihosting di server eksternal:
gcloud compute instance-templates create example-template-with-startup \
--image-family debian-9 \
--image-project debian-cloud \
--metadata startup-script='#! /bin/bash
sudo apt install -y apache2
scp myuser@108.59.87.185:index.php /var/www/'
Ada dua potensi masalah dengan skrip startup ini:
- Skrip ini tidak secara eksplisit menentukan versi apache2 yang akan diinstal, dan mengandalkan versi saat ini yang tersedia di repositori
apt
. - Skrip ini mengandalkan file yang dihosting di pihak ketiga yang tidak memiliki versi dan mungkin telah diubah sejak terakhir kali template instance digunakan.
Jika Anda menggunakan autoscaler, template instance non-deterministik dapat menyebabkan autoscaler menambahkan instance baru ke grup instance terkelola dengan konfigurasi berbeda, seperti versi yang berbeda dari apache2.
Demikian pula, jika Anda menerapkan template ini ke grup instance terkelola, memperbarui grup itu ke layanan template yang berbeda, lalu memutuskan untuk melakukan roll back ke template sebelumnya, mungkin akan ada instance yang menggunakan versi berbeda dari file apache2 atau index.php dibandingkan dengan sebelum pembaruan karena instance Anda akan selalu mengambil versi terbaru pada saat dimulai.
Menghindari perilaku template instance yang ambigu atau tidak terduga
Untuk menghindari perilaku template yang tidak terduga, gunakan salah satu metode berikut:
Gunakan image yang dioptimalkan untuk container atau Docker, dengan tag Docker. Misalnya, sebaiknya Anda menetapkan tag baru untuk setiap build baru image Docker, dan menggunakan tag ini di template instance Anda, bukan tag terbaru default. Jika menggunakan image yang dioptimalkan untuk container, Anda dapat secara eksplisit mereferensikan build tertentu dari image Anda dalam file manifes. Contoh di bawah ini menggunakan image Docker "myimage" pada versi yang diberi tag dengan "version_2_1_3":
version: v1beta2 containers: - name: simple-echo image: myimage:version_2_1_3 [ rest of your manifest file ]
Buat image kustom yang akan digunakan sebagai image untuk template. Opsi ini lebih disukai daripada skrip startup karena menjamin bahwa setiap instance akan sama. Skrip startup mungkin memiliki hasil yang berbeda setelah paket distribusi diperbarui. Gunakan skrip startup dalam template instance Anda untuk pembuatan prototipe dan pengembangan cepat, serta gunakan image kustom jika Anda sudah siap men-deploy layanan berkualitas produksi.
Jika Anda menggunakan skrip startup, pertimbangkan untuk memperbarui skrip Anda agar menjadi deterministik. Misalnya, buat versi baru dari template sebelumnya, dan tentukan skrip startup deterministik sebagai berikut:
gcloud compute instance-templates create example-template-with-startup-2-1-3 \ --image-family debian-9 \ --image-project debian-cloud \ --metadata startup-script='#! /bin/bash sudo apt install -y apache2=2.2.20-1ubuntu1 scp myuser@108.59.87.185:version_2_1_3/index.php /var/www/'
di mana "version_2_1_3" adalah subdirektori yang berisi skrip PHP untuk versi 2.1.3 layanan Anda.