クラウドインフラ構築記

現在AWSの構築支援に携わっております。今注視しているのは、GKE、BigQuery、Google Dataflowなどサービスを展開しているGoolge Cloud Platformです。

instance groupのRolling Updateでinstance templateを更新 #gcpja


instance groupを使う場合、instance templateが必要になり、なんらかでinstance templateの更新が必要になった場合、インスタンスの再立ち上げなり必要になります。今回試したのが、無停止でインスタンスの更新を行えるRolling Updateになります。

https://cloud.google.com/compute/docs/instance-groups/manager/

screencapture-cloud-google-com-compute-docs-instance-groups-manager-1430285617901

変更前のインスタンステンプレートを作成します。

gcloud compute  instance-templates create demo-instance-template-1 --machine-type n1-standard-1 --network product-network --maintenance-policy MIGRATE --scopes "https://www.googleapis.com/auth/compute" "https://www.googleapis.com/auth/devstorage.read_write" "https://www.googleapis.com/auth/bigquery" "https://www.googleapis.com/auth/sqlservice.admin" "https://www.googleapis.com/auth/logging.write" --image centos-7 --boot-disk-type pd-standard  --metadata startup-script-url=gs://h-private-auto/startup_demo.sh --boot-disk-device-name demo-instance-template-1

インスタンスグループを作成します。

gcloud preview managed-instance-groups --zone asia-east1-a create demo-instance-group-1 --base-instance-name demo-instance-group-1 --template demo-instance-template-1 --size 2

HTTPロードバランサーのためのヘルスチェックを作成します。

gcloud compute  http-health-checks create "demo-health-check" --port "80" --request-path "/index.html" --check-interval "5" --timeout "5" --unhealthy-threshold "2" --healthy-threshold "2"

HTTPロードバランサーを作成しておきます。

gcloud preview instance-groups --zone asia-east1-a add-service demo-instance-group-1 --port 80 --service http
 gcloud compute backend-services create demo-web-service --http-health-check demo-health-check
gcloud compute backend-services add-backend demo-web-service --group demo-instance-group-1 --zone asia-east1-a
gcloud compute url-maps create demo-web-map --default-service demo-web-service
gcloud compute target-http-proxies create demo-web-proxy --url-map demo-web-map
gcloud compute forwarding-rules create http-rule --global \
    --target-http-proxy demo-web-proxy --port-range 80

ロードバランサにExternal IP (グローバルIPアドレス)が割り当てられます。
変更後のインスタンステンプレートのためのstartup scriptを作成します。

#! /bin/bash

timedatectl set-timezone Asia/Tokyo

PRIVATE_IP=`curl "http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/ip" -H "Metadata-Flavor: Google"`
INSTANCE_ID=`curl -s http://metadata.google.internal/computeMetadata/v1/instance/hostname -H "Metadata-Flavor: Google" | cut -d "." -f 1`

yum -y install httpd
service httpd start

cat >/var/www/html/index.html <<EOF
renew $INSTANCE_ID
EOF

変更後のインスタンステンプレートを作成します。

gcloud compute  instance-templates create demo-instance-template-2 --machine-type n1-standard-1 --network product-network --maintenance-policy MIGRATE --scopes "https://www.googleapis.com/auth/compute" "https://www.googleapis.com/auth/devstorage.read_write" "https://www.googleapis.com/auth/bigquery" "https://www.googleapis.com/auth/sqlservice.admin" "https://www.googleapis.com/auth/logging.write" --image centos-7 --boot-disk-type pd-standard  --metadata startup-script-url=gs://h-private-auto/startup_demo_2.sh --boot-disk-device-name demo-instance-template-2

set-templateでインスタンステンプレートを変更することも可能ですが、こちらだとインスタンスは自動では変更になりません。

 gcloud preview managed-instance-groups --zone asia-east1-a  set-template demo-instance-group-1 --template demo-instance-template-1

インスタンステンプレートのローリングアップデートを行うには、下記のようにします。インスタンスが起動立ち上がってくる時間を考慮する必要があるので、–min-instance-update-timeオプションを指定しています。(このオプションを指定しないと片方のインスタンスが準備ができる前にもう片方のインスタンスの更新が始まり、Server Errorが起きました)

 gcloud preview rolling-updates --zone asia-east1-a start --group demo-instance-group-1 --template demo-instance-template-2 --min-instance-update-time 360s

5秒間隔でcurlコマンドにてhttpアクセスを定期的にしましたが、アクセスエラーを起こすことなくインスタンステンプレートの更新が行えました。※AWSのAutoScalingでは実現されていない機能。AWSでは、ElasticBeanstalkを使うことでRolling Updateが可能のようです。

screencapture-cloud-google-com-compute-docs-instance-groups-manager-1430286981365
Instance Group Update ServiceのAlpha versionでも将来仕様が変更になる場合があるかもしれません。

コメントは受け付けていません。