インスタンスの作成と構成

Container-Optimized OS from Google を実行する Compute Engine インスタンスを作成して構成するには、2 種類の方法があります。

特定の VM 上またはマネージド インスタンス グループ内の各 VM 上で単一のコンテナを実行する単純なシナリオでは、インスタンスまたはインスタンス テンプレートを定義するときにコンテナ イメージとオプションの構成パラメータを指定できます。Compute Engine は、Container-Optimized OS の最新バージョンでインスタンスを作成し、VM の開始時に指定されたコンテナを起動します。

複数のコンテナをデプロイし、cloud-init を使用して Docker オプションの構成が可能な高度なシナリオでは、任意の Container-Optimized OS イメージを使用して Compute Engine インスタンスを作成してから、必要に応じてその構成を行えます。

単純なインスタンスの作成

この方法は、Container-Optimized OS の最新バージョンを使用して、単一のコンテナを VM にデプロイする場合に使用します。このタスクは、Google Cloud Console または gcloud CLI を使用して実行できます。

Console

  1. [VM インスタンス] ページに移動します。

    [VM インスタンス] ページに移動

  2. [インスタンスを作成] をクリックします。

  3. [名前] でインスタンスの名前を指定します。

  4. [コンテナ] セクションで、[この VM インスタンスにコンテナ イメージをデプロイする] チェックボックスをオンにします。

  5. [コンテナ イメージ] で使用するコンテナ イメージを指定します。

    • Container Registry または Artifact Registry からイメージを指定できます。例:
      • gcr.io/cloud-marketplace/google/nginx1:1.15 が Google Cloud Marketplace から NGINX 1.15 コンテナ イメージを選択します。
      • us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0 が Artifact Registry からサンプル hello-app イメージを選択します。
    • Docker Hub のコンテナ イメージを使用する場合は、常に完全な Docker イメージ名を指定します。たとえば、Apache コンテナ イメージをデプロイするには、次のイメージ名 docker.io/httpd:2.4 を指定します。
  6. 必要に応じて、[コンテナの詳細オプション] をクリックします。詳細については、コンテナを実行する際のオプションの構成をご覧ください。

  7. [作成] をクリックしてインスタンスを作成し、インスタンスを起動して、コンテナを起動します。

gcloud

単純な VM インスタンスを作成するには、次のコマンドを実行します。

gcloud compute instances create-with-container instance-name \
    --container-image image-name

以下を置き換えます。

  • instance-name: 新しいインスタンスの名前です。
  • image-name: コンテナ イメージの名前です。

次のコマンドの例では、gcr.io/cloud-marketplace/google/nginx1:1.15 コンテナ イメージを起動して実行する、nginx-vm という名前の新しい VM インスタンスを作成します。

gcloud compute instances create-with-container nginx-vm \
    --container-image gcr.io/cloud-marketplace/google/nginx1:1.15

同様に、Artifact Registry のサンプル コンテナを起動して実行する、hello-app という名前の新しい VM インスタンスを作成できます。

gcloud compute instances create-with-container hello-app \
--container-image us-docker.pkg.dev/google-samples/containers/gke/hello-app:1.0

Docker Hub のコンテナ イメージを使用する場合は、常に完全な Docker イメージ名を指定します。たとえば、Apache コンテナ イメージをデプロイするには、次のイメージ名を指定します。

docker.io/httpd:2.4

マネージド インスタンス グループ内の各 VM で単一のコンテナを実行するには、インスタンス テンプレートを定義するときにコンテナ イメージ名を指定します。詳細については、コンテナ イメージを使用したインスタンス テンプレートの作成をご覧ください。

高度なシナリオ用のインスタンスの作成

この方法は、特定の Container-Optimized OS イメージを選択して、複数のコンテナをデプロイし、cloud-init を高度な構成に使用する場合に使用します。

利用可能なイメージの表示

Container-Optimized OS イメージは Google Cloud Console のイメージ一覧から利用でき、cos という接頭辞が使用されています。これらは cos-cloud プロジェクトでホストされています。次のコマンドを実行すると、現在利用可能なすべてのリリースをコマンドラインに表示することもできます。

gcloud compute images list --project cos-cloud --no-standard-images

出力は次のようになります。

NAME                       PROJECT    FAMILY      DEPRECATED  STATUS
cos-69-10895-385-0         cos-cloud  cos-69-lts              READY
cos-73-11647-534-0         cos-cloud  cos-73-lts              READY
cos-77-12371-251-0         cos-cloud  cos-77-lts              READY
cos-81-12871-103-0         cos-cloud  cos-81-lts              READY
cos-beta-81-12871-44-0     cos-cloud  cos-beta                READY
cos-dev-84-13078-0-0       cos-cloud  cos-dev                 READY
cos-stable-81-12871-103-0  cos-cloud  cos-stable              READY

インスタンスの作成

インスタンスを作成するには、Google Cloud コンソール、gcloud CLI、または API を使用します。

Console

Container-Optimized OS と Docker がインストールされた Compute Engine インスタンスを実行するには、次の手順を実行します。

  1. Google Cloud Console で Compute Engine インスタンス作成ページを開きます。

    新しい Compute Engine インスタンスを作成

  2. [名前] でインスタンスの名前を指定します。

  3. [コンテナ] セクションで、[この VM インスタンスにコンテナ イメージをデプロイします。] チェックボックスをオフにします。このオプションは、VM に単一のコンテナをデプロイする場合に便利です。

  4. [ブートディスク] セクションで、Container-Optimized OS イメージを選択します。

  5. [作成] をクリックし、インスタンスを作成して起動します。

gcloud

現在利用可能なイメージを確認してから、次のコマンドを実行し、cos ノードイメージ インスタンスを作成します。

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --zone compute-zone \
    --machine-type machine-type-name

以下を置き換えます。

  • instance-name: VM インスタンスの名前。
  • image-name: 使用可能なイメージのリストから取得した、インスタンスの Container-Optimized OS イメージの名前。前述の例から、cos-beta-81-12871-44-0 を使用できます。
  • compute-zone:インスタンスのコンピューティング ゾーン
  • machine-type-name: この新しいインスタンスに使用するマシンタイプ。デフォルトのタイプは n1-standard-1 です。

たとえば、次のコマンドは、cos-beta-67-10575-13-0 イメージを使用して、cos-test という名前のインスタンスを作成します。

gcloud compute instances create cos-test \
    --image cos-beta-67-10575-13-0 \
    --image-project cos-cloud \
    --zone us-east1-d \
    --machine-type n1-standard-1

1 回限りの試験的なインスタンスの場合は、--preemptible フラグを追加できます。

API

API では、インスタンスを作成する通常のリクエストを作成しますが、Container-Optimized OS ソースイメージを含めます。例:

POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/compute-zone/instances

{
  'machineType': 'zones/compute-zone/machineTypes/machine-type-name',
  'name': 'instance-name',
  'networkInterfaces': [
    {
      'accessConfigs': [
        {
          'type': 'ONE_TO_ONE_NAT',
          'name': 'External NAT'
        }
      ],
      'network': 'global/networks/default'
    }
  ],
  'disks': [
    {
      'type': 'PERSISTENT',
      'boot': true,
      'autoDelete': true,
      'initializeParams': {
        'sourceImage': 'projects/cos-cloud/global/images/image-name'
      }
    }
  ]
}

インスタンスの構成

場合によっては、インスタンスの起動時に追加の構成が必要になることがあります。Container-Optimized OS で cloud-init ツールを使用して、cloud-config 形式で提供する構成情報を適用できます。

cloud-config 形式での cloud-init の使用

Container-Optimized OS イメージには、起動時にインスタンスを構成する手段として cloud-init が含まれています。cloud-init ツールは、インスタンス メタデータuser-data キーの値にその構成を想定しています。cloud-init ツールは、複数の形式を認識します。

次の cloud-init ファイルの例は、ユーザー アカウントを作成し、このユーザーがオーナーで Docker busybox コンテナの管理を制御する systemd サービスを作成方法を示しています。

#cloud-config

users:
- name: cloudservice
  uid: 2000

write_files:
- path: /etc/systemd/system/cloudservice.service
  permissions: 0644
  owner: root
  content: |
    [Unit]
    Description=Start a simple docker container

    [Service]
    ExecStart=/usr/bin/docker run --rm -u 2000 --name=mycloudservice busybox:latest /bin/sleep 3600
    ExecStop=/usr/bin/docker stop mycloudservice
    ExecStopPost=/usr/bin/docker rm mycloudservice

runcmd:
- systemctl daemon-reload
- systemctl start cloudservice.service

# Optional once-per-boot setup. For example: mounting a PD.
bootcmd:
- fsck.ext4 -tvy /dev/[DEVICE_ID]
- mkdir -p /mnt/disks/[MNT_DIR]
- mount -t ext4 -O ... /dev/[DEVICE_ID] /mnt/disks/[MNT_DIR]

この cloud-init ファイルを参照する Container-Optimized OS VM インスタンスを作成するには、--metadata-from-file コマンドライン フラグを使用します。cloud-init のファイルが現在のディレクトリで filename という名前とすると、次のコマンドでインスタンス メタデータでファイルの内容を user-data キーに割り当てることによって Container-Optimized OS インスタンスを作成し、cloud-init をトリガーします。

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename

以下を置き換えます。

  • instance-name: VM インスタンスの名前。
  • image-name: インスタンスの Container-Optimized OS イメージの名前。例: --image=cos-113-18244-85-29
  • filename: メタデータ ファイルの名前。

Container-Optimized OS インスタンスを作成するときに、他のメタデータ フラグを設定できます。これらのプロパティは単純な Key-Value ペアであるため、gcloud compute instances create コマンドで --metadata フラグを使用してプロパティを作成できます。また、マイルストーン 97 以降は、gcloud compute project-info add-metadata コマンドの --metadata フラグを使用して、プロジェクト メタデータにメタデータ フラグを設定できます。インスタンス レベルで定義されたフラグは、プロジェクト レベルで定義されたフラグよりも優先されます。

以下のコマンドを使用して、前の例を拡張して、使用統計情報とクラッシュ ダンプの収集ができます。

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --metadata-from-file user-data=filename \
    --metadata=cos-metrics-enabled=true

他のメタデータ フラグ

メタデータキー 説明 デフォルト動作
cos-update-strategy 自動更新の動作を指定します。値は update_enabledupdate_disabled、または未設定のいずれかです。
設定しなかった場合、マイルストーンのデフォルトの自動更新動作が使用されます。
有効にすると、動作はリリース チャンネルによって異なります。
  • cos-dev と cos-beta: 対応するイメージ ファミリーの最新の OS バージョンからの更新
  • LTS マイルストーンと cos-stable: 同じマイルストーンの最新の OS バージョンからの更新
  • マイルストーン 117 未満: デフォルトで有効
  • マイルストーン 117 以上: デフォルトで無効
cos-metrics-enabled クラッシュ ダンプの収集を有効にします。値は次のとおりです:
true
false(デフォルト)
デフォルトでは無効です。

インスタンスへの接続

cos ノードイメージを実行する VM インスタンスに SSH で接続するには、他の Compute Engine インスタンスに SSH 接続する場合と同じ方法を使用します。

例:

gcloud compute ssh instance-name \
    --project project-id \
    --zone compute-zone

起動スクリプトの実行

メタデータ サーバーを介して起動スクリプトを指定するには、startup-script メタデータキーを使用します。起動スクリプトを提供するには、Google Cloud CLI、API、または Google Cloud コンソールを使用します。詳細は、起動スクリプトの実行をご覧ください。

時刻の同期

マイルストーン 85より前では、Container-Optimized OS が systemdsystemd-timesyncd サービスを使用して、ローカル システム クロックを遠隔のネットワーク タイム プロトコル(NTP)サーバーと同期します。次に示す /etc/systemd/timesyncd.conf 構成ファイルのエントリでは、管理者が必要な変更を行えるように、デフォルトの構成値がコメントアウトされています。

cat /etc/systemd/timesyncd.conf
# comments omitted for brevity
[Time]
#NTP=
#FallbackNTP=metadata.google.internal
#RootDistanceMaxSec=5
#PollIntervalMinSec=32
#PollIntervalMaxSec=2048

許容される最大ルート距離は 5 秒、NTP メッセージの最小、最大のポーリング間隔はそれぞれ 32 秒、2048 秒になっています。

マイルストーン 85 以降では、Container-Optimized OS が chronyd サービスを使用し、NTP プロトコルを介して、ローカル システム クロックを遠隔のネットワーク タイム プロトコル(NTP)サーバーと同期します。次に示す /etc/chrony/chrony.conf 構成ファイルのエントリでは、管理者が必要な変更を行えるように、デフォルトの構成値がコメントアウトされています。

cat /etc/chrony/chrony.conf
# Use custom NTP servers
server metadata.google.internal prefer iburst

# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift

# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3

# Enable kernel synchronization of the real-time clock (RTC).
rtcsync

NTP サーバーは、eth0 の DHCP レスポンスで設定され、通常、これのサーバーは Compute Engine のメタデータ サーバーです。

networkctl status eth0 | grep NTP
             NTP: 169.254.169.254

タイムゾーンの変更

Google の Container-Optimized OS のデフォルトのタイムゾーンは UTC0 です。次の例のように、変更先のタイムゾーンへのシンボリック リンクを作成します。

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime

/etc はステートレスであることに注意してください。つまり、再起動するたびにタイムゾーンはデフォルト(UTC0)にリセットされます。

自動更新の有効化と無効化

自動更新を有効または無効にする方法は 2 つあります。推奨される方法は、cos-update-strategy インスタンス メタデータ キーをそれぞれ update_enabled または update_disabled に設定することです。次に例を示します。

gcloud compute instances create instance-name \
    --image image-name \
    --image-project cos-cloud \
    --metadata cos-update-strategy=update_disabled

マイルストーン 97 以降では、プロジェクト メタデータで自動更新を無効または有効にすることもできます。

gcloud compute project-info add-metadata \
    --metadata cos-update-strategy=update_disabled

systemctl を使用して、実行中のインスタンスの自動更新を無効にすることもできます。

sudo systemctl stop update-engine
sudo systemctl mask update-engine