Saat menggunakan GKE pada Bare Metal versi 1.13.0 dan yang lebih baru, Anda dapat menentukan rutinitas startup untuk menyesuaikan inisialisasi VM Anda saat startup. Anda dapat mengonfigurasi VM untuk membuat kunci SSH, menambahkan pengguna dan sandi, menginstal paket, menulis file, mengonfigurasi setelan jaringan, dan banyak lagi.
Tugas startup ini dikonfigurasi dengan Cloud-init API atau dengan
startup script API (bukan keduanya). Perintah startup ini ditentukan dalam file manifes YAML VirtualMachine
dan dijalankan secara otomatis setiap kali VM Anda dimulai.
Prasyarat
Untuk mengonfigurasi VM dengan perintah startup, Anda harus memenuhi prasyarat berikut:
Gunakan OS tamu Linux terverifikasi dan tetapkan
osType
keLinux
dalam manifes VM. OS tamu Windows tidak didukung untuk kemampuan ini karena tidak mendukung {i>cloud-init<i}.Pastikan OS tamu telah menginstal cloud-init. OS Linux terbaru mencakup {i>cloud-init<i}.
Bagian berikut menjelaskan cara menentukan rutinitas startup di manifes VM dengan cloud-init API atau skrip startup.
Menggunakan Cloud-init API untuk melakukan inisialisasi VM
Cloud-init
biasa digunakan untuk inisialisasi instance cloud dan untuk menyesuaikan VM selama
startup. Inisialisasi VM biasanya melibatkan tugas-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 disediakan dan melakukan inisialisasi VM sesuai dengan itu.
Perhatikan detail implementasi cloud-init berikut:
Anda menentukan data cloud-init dalam manifes YAML
VirtualMachine
saat membuat atau mengupdate VM. Untuk mengetahui petunjuk cara membuat VM dengan menerapkan manifes, lihat Tutorial: Membuat dan mengelola VM Linux di Runtime VM di GDC.Kami menggunakan sumber data
NoCloud
,spec.cloudInit.noCloud
, di 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 gunakan.Anda dapat menentukan informasi konfigurasi cloud-init dalam format data berikut:
- Hapus teks
- String berenkode base64
- Rahasia Kubernetes
Untuk membantu Anda memulai, kami telah menyediakan beberapa contoh konfigurasi untuk tugas inisialisasi VM umum.
Data pengguna Cloud-init
Runtime VM di GDC mendukung data pengguna cloud-init dalam sintaksis cloud-config, jadi mulailah dengan data pengguna Anda dengan #cloud-config
. Anda dapat memformat data pengguna sebagai teks yang jelas, string berenkode base64, atau Secret Kubernetes.
Untuk mengetahui informasi selengkapnya tentang referensi modul dan sintaksis data pengguna, lihat dokumentasi cloud-init.
Cloud-init data pengguna sebagai teks yang jelas
Contoh manifes berikut menunjukkan cara menentukan data pengguna sebagai teks yang jelas. 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
Cloud-init data pengguna 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 clear text:
apiVersion: vm.cluster.gke.io/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
...
cloudInit:
noCloud:
userDataBase64: I2Nsb3VkLWNvbmZpZwpydW5jbWQ6CiAgLSBlY2hvIGhlbGxvCg==
Cloud-init data pengguna sebagai Secret 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 Secret
Kubernetes yang bernama my-sec
. Konfigurasi Secret
yang sesuai menentukan data pengguna
sebagai pasangan nilai kunci. Dalam hal ini, nilai yang dienkode base64 adalah data pengguna
cloud-init dalam sintaksis konfigurasi cloud.
Di 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 dalam
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 tersebut, perhatikan perilaku startup VM berikut ini:
Untuk pembuatan VM, VM ditempatkan dalam status
ErrorConfiguration
dengan alasan dan pesan yang mendetail.Pada kasus lainnya, VM akan terus menggunakan data pengguna cloud-init lama hingga VM dikonfigurasi dengan benar. Akibatnya, agen tamu mengaktifkan atau menonaktifkan update tidak akan diterapkan hingga VM dikonfigurasi dengan benar.
Untuk mengambil informasi VM, termasuk data pengguna cloud-init apa 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
Serupa dengan data pengguna, Anda dapat memformat data jaringan sebagai teks yang jelas, string berenkode base64, atau Secret Kubernetes. Tidak seperti data pengguna, data jaringan tidak menggunakan sintaks {i>cloud-config<i}.
Saat menggunakan teks yang jelas atau string berenkode base64, ukuran maksimum yang diizinkan adalah 2.048 byte. Jika ukuran data pengguna mendekati atau lebih besar dari 2.048 byte, tentukan sebagai Secret Kubernetes.
Untuk mengetahui informasi selengkapnya tentang sintaksis data jaringan dan detail terkait, lihat Networking Config Versi 2 dalam 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, cloud-init mengaktifkan DHCP untuk semua perangkat ethernet dengan nama yang
dimulai 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 dengan 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 konfigurasi VirtualMachine
menunjukkan bahwa data jaringan cloud-init berada dalam Secret
Kubernetes yang bernama my-sec
. Konfigurasi Secret
yang sesuai menentukan data jaringan
sebagai pasangan nilai kunci. Dalam hal ini, nilai yang dienkode base64 adalah data jaringan
cloud-init.
Di 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 dengan 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 pertama kali memulai
- 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 test
pengguna dan memberi test
akses penuh
sudo. 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 memulai
Contoh data pengguna berikut menjalankan perintah echo
dan perintah ls
. Anda dapat menggunakan perintah untuk menginstal paket dan lainnya saat VM 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. Perintah cloud-init menetapkan izin
file untuk membaca, menulis, dan mengeksekusi (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, inisialisasi cloud menulis semua peristiwa dengan levelDEBUG
atau 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 melakukan inisialisasi VM
Skrip startup melakukan tugas selama proses startup instance virtual machine
(VM). Anda dapat menentukan satu atau beberapa skrip di bagian spec.startupScripts
pada spesifikasi VirtualMachine
. Skrip startup dapat digunakan untuk menginisialisasi
VM Anda. Inisialisasi VM biasanya melibatkan tugas-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
VirtualMachine
saat membuat atau mengupdate VM. Untuk mengetahui petunjuk cara membuat VM dengan menerapkan manifes, lihat Tutorial: Membuat dan mengelola VM Linux di Runtime VM di GDC.Skrip yang ditentukan akan dijalankan setiap kali VM dimulai.
Sertakan
#!/bin/...
di bagian atas skrip untuk menunjukkan penafsir skrip. Misalnya, sertakan#!/bin/bash
untuk menjalankan skrip dengan Bash shell.Anda tidak dapat menentukan perintah API cloud-init (
spec.cloudInit
) dan skrip startup (spec.startupScripts
) dalam manifesVirtualMachine
yang sama.
Format skrip
Anda dapat menentukan skrip startup dalam format data berikut:
- Hapus teks
- String berenkode base64
- Rahasia Kubernetes
Perhatikan aturan berikut untuk menggunakan format skrip yang berbeda:
Saat menggunakan teks yang jelas atau string berenkode base64, ukuran maksimum yang diizinkan untuk konten skrip adalah 2.048 byte. Jika ukuran konten skrip Anda mendekati atau lebih besar dari 2.048 byte, tentukan skrip sebagai Secret Kubernetes.
Saat menggunakan Secret Kubernetes, gunakan kunci data
script
dalam Secret yang direferensikan untuk menentukan konten skrip.Jika Secret yang direferensikan tidak ditemukan atau kunci data
script
tidak ada dalam Secret yang direferensikan, VM akan terus menjalankan skrip. Namun, VM tidak menulis atau mengupdate konten skrip. Dalam hal ini, Anda dapat menemukan peristiwa peringatan Kubernetes dengankubectl get event
ataukubectl describe gvm
.
Contoh manifes YAML VirtualMachine
berikut berisi tiga skrip, satu dalam setiap format yang didukung. Dalam hal ini, setiap skrip menjalankan perintah echo
hello
yang ditunjukkan di myscript1
, contoh teks bersih.
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 log atau hasil 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 ini menyertakan SCRIPT_NAME
, yang merupakan nama
skrip startup.