Mengonfigurasi rutinitas startup VM

Saat menggunakan Google Distributed Cloud versi 1.13.0 dan yang lebih baru, Anda dapat menentukan rutinitas startup untuk menyesuaikan inisialisasi VM saat memulai. 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 (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:

  • Aktifkan Runtime VM di GDC.

  • Gunakan OS tamu Linux terverifikasi dan tetapkan osType ke Linux dalam 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 melakukan inisialisasi 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, menulis data ke file, dan menyiapkan aspek lain 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 melakukan inisialisasi VM sesuai kebutuhan.

Perhatikan detail penerapan cloud-init berikut:

  • Anda menentukan data cloud-init dalam manifes YAML VirtualMachine saat membuat atau memperbarui VM. Untuk petunjuk cara membuat VM dengan menerapkan manifes, lihat Tutorial: Membuat dan mengelola VM Linux di Runtime VM di GDC.

  • Kita menggunakan sumber data NoCloud, spec.cloudInit.noCloud, dalam spesifikasi VM.

  • Anda menentukan data pengguna dan data jaringan di bagian terpisah dalam manifes VirtualMachine. Penamaan dan struktur bagian bergantung pada format data yang Anda pilih untuk digunakan.

  • 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 mulai 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 sintaks 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 yang jelas. Dalam hal ini, cloud-init akan 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 yang dienkode 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 dalam contoh teks jelas:

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 konfigurasi VirtualMachine menunjukkan bahwa data pengguna cloud-init berada dalam Secret Kubernetes yang bernama my-sec. Konfigurasi Secret yang sesuai menentukan data pengguna sebagai key-value pair. Nilai yang dienkode base64 dalam hal ini adalah data pengguna cloud-init dalam sintaksis cloud-config.

Dalam Secret yang dirujuk, 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 teks jelas:

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 dirujuk tidak ditemukan atau kunci data userData atau userdata tidak ada di Secret, perhatikan perilaku startup VM berikut:

  • Untuk pembuatan VM, VM akan ditempatkan dalam status ErrorConfiguration dengan alasan dan pesan 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 diterapkan 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

Serupa dengan data pengguna, Anda dapat memformat data jaringan sebagai teks biasa, string yang dienkode base64, atau Secret Kubernetes. Tidak seperti data pengguna, data jaringan tidak menggunakan sintaksis cloud-config.

Saat menggunakan teks biasa atau string yang dienkode base64, ukuran maksimum yang diizinkan adalah 2048 byte. Jika ukuran data pengguna mendekati atau lebih besar dari 2048 byte, tentukan sebagai Secret Kubernetes.

Untuk informasi selengkapnya tentang sintaksis data jaringan dan detail terkait, lihat Networking Config Version 2 dalam dokumentasi cloud-init.

Data jaringan Cloud-init sebagai teks biasa

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 yang dienkode base64. Dalam contoh ini, data jaringan terdiri dari konfigurasi DHCP yang sama yang ditentukan dalam contoh teks jelas:

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 bernama my-sec. Konfigurasi Secret yang sesuai menentukan data jaringan sebagai key-value pair. Nilai yang dienkode dengan base64 dalam hal ini adalah data jaringan cloud-init.

Dalam Secret yang dirujuk, 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 teks jelas:

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 diizinkan

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

Tambahkan pengguna baru

Contoh data pengguna berikut membuat pengguna test dan memberi test akses sudo penuh. Contoh ini menetapkan sandi pwd yang tidak 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 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) 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

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 level DEBUG 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 menginisialisasi VM

Skrip startup menjalankan tugas selama proses startup instance virtual machine (VM). Anda dapat menentukan satu atau beberapa skrip di bagian spec.startupScripts spec VirtualMachine. Skrip startup dapat digunakan untuk melakukan inisialisasi VM Anda. Inisialisasi VM biasanya melibatkan tugas seperti penginstalan paket, penyiapan repositori, pembuatan kunci SSH, menulis data ke file, dan menyiapkan aspek lain VM Anda.

Perhatikan detail berikut untuk skrip startup:

  • Anda menentukan skrip startup dalam manifes YAML VirtualMachine saat membuat atau mengupdate VM. Untuk petunjuk cara membuat VM dengan menerapkan manifes, lihat Tutorial: Membuat dan mengelola VM Linux di Runtime VM di GDC.

  • Skrip yang ditentukan akan berjalan setiap kali VM dimulai.

  • Sertakan #!/bin/... di bagian atas skrip untuk menunjukkan interpretor skrip. Misalnya, sertakan #!/bin/bash untuk menjalankan skrip dengan shell Bash.

  • Anda tidak dapat menentukan perintah cloud-init API (spec.cloudInit) dan skrip startup (spec.startupScripts) dalam manifes VirtualMachine 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 berbagai format skrip:

  • Saat menggunakan teks biasa atau string yang dienkode base64, ukuran maksimum yang diizinkan untuk konten skrip adalah 2048 byte. Jika ukuran konten skrip Anda mendekati atau lebih besar dari 2.048 byte, tentukan skrip sebagai Rahasia Kubernetes.

  • Saat menggunakan Secret Kubernetes, gunakan kunci data script dalam Secret yang dirujuk untuk menentukan konten skrip.

  • Jika Secret yang dirujuk tidak ditemukan atau kunci data script tidak ada dalam Secret yang dirujuk, VM akan terus menjalankan skrip. Namun, VM tidak menulis atau memperbarui konten skrip. Dalam hal ini, Anda dapat menemukan peristiwa peringatan Kubernetes dengan kubectl get event atau kubectl 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 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 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.