このドキュメントでは、起動スクリプトを使用して、Google Distributed Cloud(GDC)エアギャップで仮想マシン(VM)インスタンスとそれに関連するプログラムを起動する方法について説明します。
起動スクリプトは、VM の起動プロセス中にタスクを実行する自動化ツールです。起動スクリプトを使用して、新規または既存のインスタンスで VM の構成タスクとデプロイタスクを自動化することで、時間を節約し、手動構成の手間を軽減します。
このドキュメントは、Distributed Cloud 環境で VM の起動スクリプトを使用するプラットフォーム管理者またはアプリケーション オペレーター グループの開発者を対象としています。詳細については、GDC エアギャップ ドキュメントの対象読者をご覧ください。
始める前に
gdcloud コマンドライン インターフェース(CLI)コマンドを使用するには、gdcloud CLI をダウンロード、インストール、構成していることを確認してください。Distributed Cloud のすべてのコマンドは gdcloud または kubectl CLI を使用し、オペレーティング システム(OS)環境を必要とします。
kubeconfig ファイルのパスを取得する
Management API サーバーに対してコマンドを実行するには、次のリソースが必要です。
Management API サーバーの kubeconfig ファイルがない場合は、ログインして生成します。
これらの手順では、
MANAGEMENT_API_SERVERを Management API サーバーの kubeconfig ファイルのパスに置き換えます。
IAM ロールをリクエストする
VM で起動スクリプトを使用するには、IAM プロジェクト管理者に連絡して、プロジェクトに対する次のロールをリクエストしてください。
仮想マシン プロジェクト管理者(
project-vm-admin): プロジェクトの名前空間で VM を作成、変更、一覧表示、削除します。Secret 管理者(
secret-admin): プロジェクトの名前空間で Kubernetes Secret の取得、一覧表示、作成、更新、削除、パッチ適用、監視を行います。このロールを使用して、起動スクリプトのシークレットを指定します。書式なしテキストの起動スクリプトを指定する場合、このロールは必要ありません。
すべての VM ロールは、VM が存在するプロジェクトの Namespace にバインドする必要があります。手順に沿ってアクセス権を確認します。
起動スクリプトを渡す
起動スクリプトとして、bash スクリプトまたは bash 以外のスクリプトを使用できます。これを行うには、スクリプトの先頭に #!/bin/… を追加して、スクリプト インタープリタを指定します。たとえば、Python 3 起動スクリプトを使用するには、スクリプトの先頭に #! /usr/bin/python3 を追加します。
Google Distributed Cloud(GDC)エアギャップは、startupScripts 配列に表示される順序で起動スクリプトを実行します。
次の表に、スクリプトのサイズに応じて使用するスクリプト形式を示します。
| スクリプトのサイズ | スクリプトの形式 |
|---|---|
| 2,048 バイト以下のスクリプト | テキストを消去 |
| 2,048 バイトを超えるスクリプト | Kubernetes Secret |
起動スクリプトを定義する
起動スクリプトを使用するには、VM の spec フィールドに startupScripts フィールドを追加する必要があります。このフィールドでは、複数の起動スクリプトをクリアテキストまたは Kubernetes Secret として指定できます。
次の例では、起動スクリプトをクリアテキストと Kubernetes Secret として指定しています。
apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
name: "my-vm"
spec:
# …
startupScripts:
- name: hello-world
script: |
#!/bin/bash
echo hello
- name: add-user
scriptSecretRef:
name: add-user
---
apiVersion: v1
kind: Secret
type: Opaque
metadata:
name: add-user
data:
script:
IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
次の考慮事項を確認してください。
- 起動スクリプトは起動するたびに実行されます。
- 起動スクリプトにはデフォルトの root 権限があります。
- Kubernetes Secret では、VM
specのscriptSecretRefの名前がmetadata.nameフィールドと一致する必要があります。 - Kubernetes Secret で、
dataフィールドにキーscriptを追加して、起動スクリプトの内容を指定します。
起動スクリプトを使用して新しい VM を作成する
これらの手順は、VM の作成にイメージとして使用する内容に関係なく適用されます。次の手順に沿って操作します。
起動スクリプトを Kubernetes Secret として作成するには、次のコマンドを実行します。
cat <<EOF >>FILE_NAME STARTUP_SCRIPT_CONTENT EOFkubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ create secret generic SECRET_NAME \ --from-file=script=FILE_NAMErm FILE_NAMEVM を作成するページに記載されている VM の作成手順を参照してください。ステップ 1 で、VM を作成するコマンドを実行する前に、起動スクリプトを
specフィールドに追加します。この例では、クリアテキストと Kubernetes Secret の両方を使用して起動スクリプトを定義します。
apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachine metadata: name: VM_NAME namespace: PROJECT spec: # … startupScripts: - name: CLEAR_TEXT_SCRIPT_NAME script: | #!/bin/bash CLEAR_TEXT_SCRIPT - name: SECRET_SCRIPT_NAME scriptSecretRef: name: SECRET_NAMEこれらの変数は次のように定義されます。
変数 定義 MANAGEMENT_API_SERVERManagement API サーバーの kubeconfig ファイル。 PROJECTVM を作成する Distributed Cloud プロジェクト。 VM_NAMEVM の名前。 FILE_NAME起動スクリプトを保存するファイルの名前。 STARTUP_SCRIPT_CONTENT起動スクリプトの一部として実行するコマンド CLEAR_TEXT_SCRIPT_NAMEクリアテキストの起動スクリプトの名前。 CLEAR_TEXT_SCRIPT定義するクリアテキスト スクリプト。 SECRET_NAMEKubernetes Secret の名前。 SECRET_SCRIPT_NAMEKubernetes Secret としての起動スクリプトの名前。 次の手順で VM を作成します。
次の例は、Kubernetes Secret とクリアテキストを使用して新しいユーザーを追加する起動スクリプトを含む VM を作成する方法を示しています。
kubectl --kubeconfig MANAGEMENT_API_SERVER \ -n PROJECT \ apply -f - <<EOF apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachineDisk metadata: name: VM_BOOT_DISK_NAME spec: source: image: name: BOOT_DISK_IMAGE_NAME namespace: vm-system size: BOOT_DISK_SIZE --- apiVersion: v1 kind: Secret type: Opaque metadata: name: add-user data: script: IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg== --- apiVersion: virtualmachine.gdc.goog/v1 kind: VirtualMachine metadata: name: VM_NAME spec: compute: virtualMachineType: MACHINE_TYPE disks: - virtualMachineDiskRef: name: VM_BOOT_DISK_NAME boot: true autoDelete: BOOT_DISK_AUTO_DELETE startupScripts: - name: add-user scriptSecretRef: name: add-user - name: add-to-sudoers script: | #!/bin/bash usermod -aG sudo user EOFこの例では、変数は次のように定義されています。
変数 定義 MANAGEMENT_API_SERVERManagement API サーバーの kubeconfig ファイル。 PROJECTVM を作成する Distributed Cloud プロジェクト。 VM_NAME新しい VM の名前。 VM_BOOT_DISK_NAME新しい VM ブートディスクの名前。 BOOT_DISK_IMAGE_NAME新しい VM ブートディスクに使用するイメージの名前。 BOOT_DISK_SIZEブートディスクのサイズ( 20Gなど)。
この値は、常にブートディスク イメージのminimumDiskSize以上にする必要があります。BOOT_DISK_AUTO_DELETEtrueまたはfalse。VM インスタンスが削除されたときにブートディスクが自動的に削除されるかどうかを示します。MACHINE_TYPE新しい VM の事前定義されたマシンタイプ。使用可能なマシンタイプを選択するには、次のコマンドを実行します。
kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system
起動スクリプトを使用して既存の VM を更新する
起動スクリプトを使用して既存の VM を更新することもできます。更新を行う前に、VM をシャットダウンする必要があります。
VM プロパティを更新するの手順に沿って、実行する起動スクリプトで spec フィールドを更新します。
起動スクリプトの出力を表示する
- VM に接続する手順に沿って操作します。
ゲスト VM 内で次のコマンドを実行して、実行した起動スクリプトのログを取得します。
sudo journalctl -u cloud-final起動スクリプトのログは、次のテキストで始まります。
Started to run the command: /var/lib/google/startup-scripts/<script-name> ...