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 を使用して実行できます。
コンソール
[VM インスタンス] ページに移動します。
[インスタンスを作成] をクリックします。
[名前] でインスタンスの名前を指定します。
[コンテナ] セクションで、[この VM インスタンスにコンテナ イメージをデプロイする] チェックボックスをオンにします。
[コンテナ イメージ] で使用するコンテナ イメージを指定します。
- 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
を指定します。
- Container Registry または Artifact Registry からイメージを指定できます。例:
必要に応じて、[コンテナの詳細オプション] をクリックします。詳細については、コンテナを実行する際のオプションの構成をご覧ください。
[作成] をクリックしてインスタンスを作成し、インスタンスを起動して、コンテナを起動します。
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 を使用します。
コンソール
Container-Optimized OS と Docker がインストールされた Compute Engine インスタンスを実行するには、次の手順を実行します。
Google Cloud Console で Compute Engine インスタンス作成ページを開きます。
[名前] でインスタンスの名前を指定します。
[コンテナ] セクションで、[この VM インスタンスにコンテナ イメージをデプロイします。] チェックボックスをオフにします。このオプションは、VM に単一のコンテナをデプロイする場合に便利です。
[ブートディスク] セクションで、Container-Optimized OS イメージを選択します。
[作成] をクリックし、インスタンスを作成して起動します。
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_enabled 、update_disabled 、または未設定のいずれかです。設定しなかった場合、マイルストーンのデフォルトの自動更新動作が使用されます。 有効にすると、動作はリリース チャンネルによって異なります。
|
|
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 が systemd
の systemd-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