Jika menggunakan Google Distributed Cloud versi 1.13.0 dan yang lebih baru, Anda dapat menentukan rutinitas startup untuk menyesuaikan inisialisasi VM saat sistem dimulai. Anda dapat mengkonfigurasi VM Anda untuk membuat kunci SSH, menambahkan pengguna dan {i>password<i}, menginstal paket, menulis file, mengkonfigurasi pengaturan jaringan, dan banyak lagi.
Tugas startup ini dikonfigurasi
dengan API {i>cloud-init<i} atau
API skrip startup (bukan keduanya). Perintah startup ini ditentukan dalam
File manifes YAML VirtualMachine
dan dieksekusi secara otomatis setiap kali VM Anda
memulai.
Prasyarat
Untuk mengonfigurasi VM dengan perintah startup, Anda harus memenuhi persyaratan berikut prasyarat:
Gunakan OS tamu Linux terverifikasi dan setel
osType
keLinux
dalam manifes VM. OS tamu Windows tidak didukung untuk kemampuan ini, karena mereka tidak mendukung {i>cloud-init<i}.Pastikan OS tamu telah menginstal cloud-init. OS Linux terbaru termasuk cloud-init.
Bagian berikut menjelaskan cara menentukan rutinitas startup di VM manifes dengan cloud-init API atau skrip startup.
Menggunakan Cloud-init API untuk menginisialisasi VM
Cloud-init adalah
biasa digunakan untuk inisialisasi instance cloud dan untuk menyesuaikan VM selama
sistem dimulai. Inisialisasi VM biasanya melibatkan
tugas-tugas seperti instalasi paket,
pengaturan repositori, pembuatan kunci SSH, penulisan data ke file, dan pengaturan
aspek lain dari VM Anda. Anda menggabungkan YAML konfigurasi cloud-init ke dalam
Resource kustom VirtualMachine
dengan kolom spec.cloudInit
. Kapan VM Anda
dimulai, cloud-init membaca data yang disediakan dan menginisialisasi VM
sebagaimana mestinya.
Perhatikan detail implementasi cloud-init kami berikut ini:
Anda menentukan data cloud-init dalam manifes YAML
VirtualMachine
saat membuat atau mengupdate VM. Untuk instruksi membuat VM dengan menerapkan manifes, lihat Tutorial: Membuat dan mengelola VM Linux dalam Runtime VM di GDC.Kita menggunakan Sumber data
NoCloud
,spec.cloudInit.noCloud
, di spesifikasi VM kita.Anda menentukan data pengguna dan data jaringan secara terpisah di manifes
VirtualMachine
. Penamaan dan struktur bagian bergantung pada format data yang Anda putuskan untuk digunakan.Anda dapat menentukan informasi konfigurasi cloud-init dalam data berikut format:
- Hapus teks
- String berenkode base64
- Rahasia Kubernetes
Untuk membantu Anda memulai, kami telah menyediakan beberapa contoh konfigurasi untuk tugas inisialisasi VM yang umum.
Data pengguna cloud-init
Runtime VM di GDC mendukung data pengguna cloud-init di
sintaksis cloud-config,
jadi mulai
data pengguna Anda dengan #cloud-config
. Anda dapat memformat
data pengguna sebagai
teks yang jelas, string berenkode base64, atau Rahasia Kubernetes.
Untuk informasi selengkapnya tentang sintaksis data pengguna dan referensi modul, lihat dokumentasi cloud-init.
Data pengguna cloud-init sebagai teks yang jelas
Contoh manifes berikut menunjukkan cara menentukan data pengguna sebagai teks yang jelas. Di beberapa dalam hal ini, cloud-init mengeksekusi 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 yang dienkode base64.
Dalam contoh ini, data pengguna terdiri dari perintah echo hello
yang sama seperti di
contoh clear text:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userDataBase64: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
Data pengguna cloud-init sebagai Secret Kubernetes
Contoh berikut menunjukkan manifes YAML untuk VirtualMachine
dan
Secret
. Bagian spec.cloudInit.noCloud.secretRef
dalam VirtualMachine
menunjukkan bahwa data pengguna cloud-init berada dalam Secret Kubernetes
bernama my-sec
. Konfigurasi Secret
yang sesuai menentukan data pengguna
sebagai pasangan nilai kunci. Nilai yang dienkode base64 dalam hal ini adalah model
data pengguna dalam sintaksis cloud-config.
Dalam Secret yang direferensikan, gunakan kunci data userData
(ditampilkan) atau userdata
untuk
menentukan data pengguna cloud-init.
Dalam contoh ini, data pengguna terdiri dari perintah echo hello
yang sama seperti di
contoh clear text:
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 Secret yang direferensikan tidak ditemukan atau kunci data userData
atau userdata
tidak ada dalam Secret, perhatikan perilaku startup VM berikut:
Untuk pembuatan VM, VM ditempatkan dalam status
ErrorConfiguration
dengan alasan dan pesan yang terperinci.Pada kasus lain, VM tetap menggunakan data pengguna {i>cloud-init<i} lama hingga VM dikonfigurasi dengan benar. Oleh karena itu, agen tamu mengaktifkan atau menonaktifkan pembaruan tidak diterapkan sampai 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 {i>kubeconfig<i} 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 yang jelas, string berenkode base64, atau Rahasia Kubernetes. Tidak seperti data pengguna, data jaringan tidak menggunakan sintaksis cloud-config.
Saat menggunakan teks yang jelas 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 informasi selengkapnya tentang sintaksis data jaringan dan detail yang terkait, lihat Konfigurasi Jaringan Versi 2 di dokumentasi cloud-init.
Data jaringan cloud-init sebagai teks yang jelas
Contoh manifes berikut menunjukkan cara menentukan data jaringan sebagai teks yang jelas.
Dalam hal ini, {i>cloud-init<i} memungkinkan DHCP
untuk semua perangkat eternet 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 yang dienkode base64. Dalam contoh ini, data jaringan terdiri dari konfigurasi DHCP yang sama yang ditentukan dalam contoh clear text:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
networkDataBase64: dmVyc2lvbjogMgpldGhlcm5ldHM6CiAgYWxsZXRoczoKICAgIG1hdGNoOgogICAgICBuYW1lOiBlKgogICAgZGhjcDQ6IHRydWUK
Data jaringan Cloud-init sebagai Secret Kubernetes
Contoh berikut menunjukkan manifes YAML untuk VirtualMachine
dan
Secret
. Bagian spec.cloudInit.noCloud.networkDataSecretRef
dalam VirtualMachine
menunjukkan bahwa data jaringan cloud-init berada dalam Secret Kubernetes
bernama my-sec
. Konfigurasi Secret
yang sesuai menentukan data jaringan
sebagai pasangan nilai kunci. Nilai yang dienkode base64 dalam hal ini adalah model
data jaringan.
Dalam Secret yang direferensikan, gunakan kunci data networkData
(ditampilkan) atau
networkdata
untuk menentukan data jaringan cloud-init.
Dalam contoh ini, data jaringan terdiri dari konfigurasi DHCP yang sama yang ditentukan dalam contoh clear text:
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 yang jelas dari beberapa kasus penggunaan umum untuk Inisialisasi VM dengan cloud-init:
- Mengonfigurasi kunci SSH yang diberi otorisasi
- Menambahkan pengguna baru
- Menjalankan perintah saat browser pertama kali dimulai
- Menulis file
Mengonfigurasi kunci SSH yang diotorisasi
Contoh data pengguna berikut menetapkan kunci SSH yang diberi otorisasi
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
Tambahkan pengguna baru
Contoh data pengguna berikut membuat test
pengguna dan memberi test
data
{i>sudo access<i}. Contoh ini menetapkan sandi pwd
yang tidak akan habis masa berlakunya kepada 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 pertama kali dimulai
Contoh data pengguna berikut menjalankan perintah echo
dan perintah ls
. Anda
Anda bisa menggunakan perintah untuk menginstal
paket dan banyak lagi 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
/var/lib/google
pada VM Anda. Direktif cloud-init menetapkan file
izin untuk membaca, menulis, dan mengeksekusi (0744
) bagi 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
Pemecahan masalah cloud-init
Jika Anda mengalami masalah dengan inisialisasi VM dan menggunakan di cloud-init, periksa log cloud-init berikut di VM Anda:
/var/log/cloud-init.log
: Secara default, cloud-init menulis semua peristiwa dengan levelDEBUG
atau lebih tinggi pada log ini./var/log/cloud-init-output.log
: Secara default, cloud-init mengarahkan kedua stdout dan {i>stderr<i} dari semua tahap {i> cloud-init<i} ke log ini.
Menggunakan skrip startup untuk melakukan inisialisasi VM
Skrip startup menjalankan tugas selama proses startup mesin virtual
(VM). Anda dapat menentukan satu atau beberapa skrip di spec.startupScripts
dari spesifikasi VirtualMachine
. Skrip startup dapat digunakan untuk menginisialisasi
VM Anda. Inisialisasi VM biasanya melibatkan
tugas-tugas seperti instalasi paket,
pengaturan repositori, pembuatan kunci SSH, penulisan data ke file, dan pengaturan
aspek lain dari VM Anda.
Perhatikan detail berikut untuk skrip startup:
Anda menentukan skrip startup dalam manifes YAML
VirtualMachine
saat membuat atau mengupdate VM. Untuk instruksi membuat VM dengan menerapkan manifes, lihat Tutorial: Membuat dan mengelola VM Linux dalam Runtime VM di GDC.Skrip yang ditentukan akan dijalankan setiap kali VM dimulai.
Sertakan
#!/bin/...
di bagian atas skrip untuk menunjukkan skrip tersebut penerjemahan mesin. Misalnya, sertakan#!/bin/bash
untuk mengeksekusi skrip dengan {i>Bash shell<i}.Anda tidak dapat menentukan kedua perintah cloud-init API (
spec.cloudInit
) dan skrip startup (spec.startupScripts
) yang sama manifesVirtualMachine
.
Format skrip
Anda dapat menentukan skrip startup dalam format data berikut:
- Hapus teks
- String berenkode base64
- Rahasia Kubernetes
Perhatikan aturan berikut saat bekerja dengan format skrip yang berbeda:
Saat menggunakan teks yang jelas atau string berenkode base64, ukuran maksimum yang diizinkan untuk isi skrip adalah 2048 byte. Jika ukuran konten skrip mendekati atau lebih besar dari 2.048 byte, tentukan skrip sebagai Secret Kubernetes.
Saat menggunakan Secret Kubernetes, gunakan kunci data
script
di kolom Rahasia untuk menentukan konten skrip.Jika Secret yang direferensikan tidak ditemukan atau kunci data
script
tidak ada di Secret yang direferensikan, VM akan terus menjalankan skrip tersebut. VM tidak, namun, menulis atau memperbarui konten skrip. Dalam kasus ini, Anda dapat menemukan Peristiwa peringatan Kubernetes dengankubectl get event
ataukubectl describe gvm
.
Contoh manifes YAML VirtualMachine
berikut berisi tiga skrip, satu skrip
dalam setiap format yang didukung. Dalam hal ini, setiap skrip menjalankan perintah echo
hello
yang ditampilkan di myscript1
, contoh teks yang jelas.
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 skrip atau log, 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 tersebut mencakup SCRIPT_NAME
, nama
skrip startup.