Saat menggunakan Google Distributed Cloud versi 1.13.0 dan yang lebih baru, Anda dapat menentukan rutinitas startup untuk menyesuaikan inisialisasi VM saat startup. Anda dapat mengonfigurasi VM untuk membuat kunci SSH, menambahkan pengguna dan sandi, menginstal paket, menulis file, mengonfigurasi setelan jaringan, dan lainnya.
Tugas startup ini dikonfigurasi dengan cloud-init API atau dengan startup scripts API (tidak keduanya). Petunjuk startup ini ditentukan dalam file manifes YAML VirtualMachine dan dijalankan secara otomatis setiap kali VM Anda dimulai.
Prasyarat
Untuk mengonfigurasi VM dengan petunjuk startup, Anda harus memenuhi prasyarat berikut:
Gunakan OS tamu Linux yang terverifikasi dan tetapkan
osTypekeLinuxdalam manifes VM. OS tamu Windows tidak didukung untuk kemampuan ini, karena tidak mendukung cloud-init.Pastikan OS tamu telah menginstal cloud-init. OS Linux terbaru menyertakan cloud-init.
Bagian berikut menjelaskan cara menentukan rutinitas startup dalam manifes VM dengan cloud-init API atau skrip startup.
Menggunakan cloud-init API untuk menginisialisasi VM
Cloud-init biasanya digunakan untuk inisialisasi instance cloud dan untuk menyesuaikan VM selama
startup. Inisialisasi VM biasanya melibatkan tugas seperti penginstalan paket, penyiapan repositori, pembuatan kunci SSH, penulisan data ke file, dan penyiapan aspek lain dari VM Anda. Anda menggabungkan YAML konfigurasi cloud-init ke dalam resource kustom VirtualMachine dengan kolom spec.cloudInit. Saat instance VM Anda dimulai, cloud-init akan membaca data yang diberikan dan menginisialisasi VM sebagaimana mestinya.
Perhatikan detail berikut dari penerapan cloud-init kami:
Anda menentukan data cloud-init dalam manifes YAML
VirtualMachinesaat membuat atau memperbarui VM. Untuk mengetahui petunjuk cara membuat VM dengan menerapkan manifes, lihat Tutorial: Membuat dan mengelola VM Linux di VM Runtime di GDC.Kami menggunakan sumber data
NoCloud,spec.cloudInit.noCloud, dalam spesifikasi VM kami.Anda menentukan data pengguna dan data jaringan di bagian terpisah dalam manifes
VirtualMachine. Penamaan dan struktur bagian bergantung pada format data yang Anda putuskan untuk digunakan.Anda dapat menentukan informasi konfigurasi cloud-init dalam format data berikut:
- Teks biasa
- String berenkode base64
- Rahasia Kubernetes
Untuk membantu Anda memulai, kami telah menyediakan beberapa contoh konfigurasi untuk tugas inisialisasi VM umum.
Data pengguna cloud-init
VM Runtime di GDC mendukung data pengguna cloud-init dalam
sintaksis cloud-config,
jadi mulailah data pengguna Anda dengan #cloud-config. Anda dapat memformat data pengguna sebagai teks biasa, string berenkode base64, atau Rahasia Kubernetes.
Untuk mengetahui informasi selengkapnya tentang sintaksis data pengguna dan referensi modul, lihat dokumentasi cloud-init.
Data pengguna cloud-init sebagai teks biasa
Contoh manifes berikut menunjukkan cara menentukan data pengguna sebagai teks biasa. Dalam hal ini, cloud-init menjalankan perintah saat VM dimulai:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- echo hello
Data pengguna cloud-init sebagai string berenkode base64
Contoh berikut menunjukkan cara menentukan data pengguna dalam format berenkode base64.
Dalam contoh ini, data pengguna terdiri dari perintah echo hello yang sama seperti dalam
contoh teks biasa:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userDataBase64: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
Data pengguna cloud-init sebagai Rahasia Kubernetes
Contoh berikut menunjukkan manifes YAML untuk VirtualMachine dan Secret. Bagian spec.cloudInit.noCloud.secretRef dalam konfigurasi VirtualMachine menunjukkan bahwa data pengguna cloud-init berada dalam Rahasia Kubernetes bernama my-sec. Konfigurasi Secret yang sesuai menentukan data pengguna sebagai key-value pair. Nilai berenkode base64 dalam hal ini adalah data pengguna cloud-init dalam sintaksis cloud-config.
Dalam Rahasia yang direferensikan, gunakan kunci data userData (ditampilkan) atau userdata untuk menentukan data pengguna cloud-init.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
secretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
userData: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
Jika Rahasia yang direferensikan tidak ditemukan atau kunci data userData atau userdata
tidak ada dalam Rahasia, perhatikan perilaku startup VM berikut:
Untuk pembuatan VM, VM ditempatkan dalam status
ErrorConfigurationdengan alasan dan pesan yang mendetail.Dalam kasus lain, VM akan terus menggunakan data pengguna cloud-init lama hingga VM dikonfigurasi dengan benar. Akibatnya, update pengaktifan atau penonaktifan agen tamu tidak akan berlaku hingga VM dikonfigurasi dengan benar.
Untuk mengambil informasi VM, termasuk data pengguna cloud-init yang digunakan, gunakan perintah berikut:
kubectl get vm VM_NAME -o yaml --kubeconfig KUBECONFIG_PATH
Ganti kode berikut:
VM_NAME: nama VM Anda.KUBECONFIG_PATH: jalur ke file kubeconfig untuk cluster yang berisi VM Anda.
Untuk mengambil peristiwa peringatan Kubernetes terkait, gunakan kubectl get event atau kubectl describe gvm.
Data jaringan cloud-init
Mirip dengan data pengguna, Anda dapat memformat data jaringan sebagai teks biasa, string berenkode base64, atau Rahasia Kubernetes. Tidak seperti data pengguna, data jaringan tidak menggunakan sintaksis cloud-config.
Saat menggunakan teks biasa atau string berenkode base64, ukuran maksimum yang diizinkan adalah 2048 byte. Jika ukuran data pengguna mendekati atau lebih besar dari 2048 byte, tentukan sebagai Rahasia Kubernetes.
Untuk mengetahui informasi selengkapnya tentang sintaksis data jaringan dan detail terkait, lihat Konfigurasi Jaringan Versi 2 dalam dokumentasi cloud-init.
Data jaringan cloud-init sebagai teks biasa
Contoh manifes berikut menunjukkan cara menentukan data jaringan sebagai teks biasa.
Dalam hal ini, cloud-init mengaktifkan DHCP untuk semua perangkat Ethernet dengan nama yang diawali dengan "e" (e*):
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- echo hello
networkData: |
version: 2
ethernets:
alleths:
match:
name: e*
dhcp4: true
Data jaringan cloud-init sebagai string berenkode base64
Contoh berikut menunjukkan cara menentukan data jaringan dalam format berenkode base64. Dalam contoh ini, data jaringan terdiri dari konfigurasi DHCP yang sama seperti yang ditentukan dalam contoh teks biasa:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataBase64: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
Data jaringan cloud-init sebagai Rahasia Kubernetes
Contoh berikut menunjukkan manifes YAML untuk VirtualMachine dan Secret. Bagian spec.cloudInit.noCloud.networkDataSecretRef dalam konfigurasi VirtualMachine menunjukkan bahwa data jaringan cloud-init berada dalam Rahasia Kubernetes bernama my-sec. Konfigurasi Secret yang sesuai menentukan data jaringan sebagai key-value pair. Nilai berenkode base64 dalam hal ini adalah data jaringan cloud-init.
Dalam Rahasia yang direferensikan, gunakan kunci data networkData (ditampilkan) atau networkdata untuk menentukan data jaringan cloud-init.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataSecretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
networkData: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
Contoh cloud-init
Bagian berikut berisi contoh teks biasa dari beberapa kasus penggunaan umum untuk inisialisasi VM dengan cloud-init:
- Mengonfigurasi kunci SSH yang diotorisasi
- Menambahkan pengguna baru
- Menjalankan perintah saat startup pertama
- Menulis file
Mengonfigurasi kunci SSH yang diotorisasi
Contoh data pengguna berikut menetapkan kunci SSH yang diotorisasi ssh-rsa AAAAB3NzaK8L93bWxnyp ke pengguna default.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaK8L93bWxnyp
Menambahkan pengguna baru
Contoh data pengguna berikut membuat pengguna test dan memberikan akses sudo penuh kepada test. Contoh ini menetapkan sandi pwd yang tidak berlaku untuk pengguna.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
users:
- default
- name: test
sudo: ALL=(ALL) NOPASSWD:ALL
chpasswd:
list: |
test:pwd
expire: False
Menjalankan perintah saat startup pertama
Contoh data pengguna berikut menjalankan perintah echo dan perintah ls. Anda dapat menggunakan perintah untuk menginstal paket dan lainnya saat VM Anda dimulai.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
runcmd:
- [ echo, hello ]
- [ ls, -l, / ]
Menulis file
Contoh data pengguna berikut menulis skrip bash ke file test di direktori /var/lib/google VM Anda. Petunjuk cloud-init menetapkan izin file ke baca, tulis, dan eksekusi (0744) untuk pemilik file.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userData: |
#cloud-config
write_files:
- path: /var/lib/google/test
permissions: 0744
content: |
#!/bin/bash
echo hello
Memecahkan masalah cloud-init
Jika Anda mengalami masalah dengan inisialisasi VM dan menggunakan cloud-init, periksa log cloud-init berikut di VM Anda:
/var/log/cloud-init.log: Secara default, cloud-init menulis semua peristiwa dengan levelDEBUGatau yang lebih tinggi ke log ini./var/log/cloud-init-output.log: Secara default, cloud-init mengarahkan stdout dan stderr dari semua tahap cloud-init ke log ini.
Menggunakan skrip startup untuk menginisialisasi VM
Skrip startup menjalankan tugas selama proses startup instance virtual machine (VM). Anda dapat menentukan satu atau beberapa skrip di bagian spec.startupScripts dari spesifikasi VirtualMachine. Skrip startup dapat digunakan untuk menginisialisasi VM Anda. Inisialisasi VM biasanya melibatkan tugas seperti penginstalan paket, penyiapan repositori, pembuatan kunci SSH, penulisan data ke file, dan penyiapan aspek lain dari VM Anda.
Perhatikan detail berikut untuk skrip startup:
Anda menentukan skrip startup dalam manifes YAML
VirtualMachinesaat membuat atau memperbarui VM. Untuk mengetahui petunjuk cara membuat VM dengan menerapkan manifes, lihat Tutorial: Membuat dan mengelola VM Linux di VM Runtime di GDC.Skrip yang ditentukan akan berjalan setiap kali VM dimulai.
Sertakan
#!/bin/...di bagian atas skrip untuk menunjukkan interpreter skrip. Misalnya, sertakan#!/bin/bashuntuk menjalankan skrip dengan shell Bash.
Format skrip
Anda dapat menentukan skrip startup dalam format data berikut:
- Teks biasa
- String berenkode base64
- Rahasia Kubernetes
Perhatikan aturan berikut untuk menggunakan format skrip yang berbeda:
Saat menggunakan teks biasa atau string berenkode base64, ukuran maksimum yang diizinkan untuk konten skrip adalah 2048 byte. Jika ukuran konten skrip Anda mendekati atau lebih besar dari 2048 byte, tentukan skrip sebagai Rahasia Kubernetes.
Saat menggunakan Rahasia Kubernetes, gunakan kunci data
scriptdi Rahasia yang direferensikan untuk menentukan konten skrip.Jika Rahasia yang direferensikan tidak ditemukan atau kunci data
scripttidak ada dalam Rahasia yang direferensikan, VM akan terus menjalankan skrip. Namun, VM tidak menulis atau memperbarui konten skrip. Dalam hal ini, Anda dapat menemukan peristiwa peringatan Kubernetes dengankubectl get eventataukubectl describe gvm.
Contoh manifes YAML VirtualMachine berikut berisi tiga skrip, satu di setiap format yang didukung. Dalam hal ini, setiap skrip menjalankan perintah echo
hello yang ditampilkan di myscript1, contoh teks biasa.
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
startupScripts:
- name: myscript1
script: |
#!/bin/bash
echo hello
- name: myscript2
scriptBase64: IyEvYmluL2Jhc2gKICAgICAgZWNobyBoZWxsbwo=
- name: myscript3
scriptSecretRef:
name: my-sec
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: my-sec
data:
script: IyEvYmluL2Jhc2gKICAgICAgZWNobyBoZWxsbwo=
Pemecahan masalah skrip
Untuk memeriksa hasil atau log skrip, jalankan perintah berikut:
journalctl -u cloud-final
Entri log skrip startup dimulai dengan teks berikut:
started to run the command /var/lib/google/startup-scripts/SCRIPT_NAME ...
Entri log menyertakan SCRIPT_NAME, nama skrip startup.