GCE(Google Compute Engine)のオートスケール構成で面倒なのが、サーバーの設定などを更新した後に、オートスケールにその内容を組み込むこと。コマンドでなるべく簡単に切り替える方法を考えてみました。
手動でのやりかた
過去記事をご覧ください↓
なるべくコマンドのコピペでやる
手動でやると結構大変なので、コマンド貼り付けてやれるようにしました。以下のような感じです。
ゾーンは毎回指定するの面倒なので最初に指定しておいたがいいと思います。
#一回デフォルトのゾーンを指定しておくと楽
gcloud config set compute/zone asia-east1-a
- 何回も同じ指定が出てくるのでシェル変数に入れてコマンド実行するようにします。
- コピー元のインスタンスには、いろいろと設定変更したりしたインスタンスを指定します。これをコピーしてオートスケールに組み込む形です。
- インスタンスグループやHTTP負荷分散のバックエンドも環境に合わせて変更してください。
#プロジェクト名
prj=my-project99
#一時的なスナップショット(すぐに消すのでなんでもいい。既存のスナップショットと被らない名前にする)
tempsnap=snapshot-web-temp2
#コピー元になるインスタンス
tempins=my-web-server-n69y
#一時的なディスク(これもすぐ消す)
tempdisk=disk-temp
#テンプレートにつかうイメージ名(最後の数値をカウントアップして名前被らないように)
image=image-web02
#イメージの説明
imagedesc="php-gd setting"
#テンプレート名(最後の数値をカウントアップして名前被らないように)
instemplate=ins-template-web03
#マシンタイプ
machinetype=f1-micro
#インスタンスグループ名
insgroup=web
#バックエンドの名前
backend=web-backend
ここからインスタンスのスナップショットを取って、イメージ作るところまで行きます。
#スナップショット作成
gcloud compute disks snapshot ${tempins} --snapshot-names=${tempsnap}
#ディスク作成
gcloud compute disks create ${tempdisk} --source-snapshot ${tempsnap}
#スナップショットの削除
gcloud compute snapshots delete ${tempsnap}
#イメージ作成
gcloud compute images create "${image}" --description ${imagedesc} --source-disk ${tempdisk}
#ディスク削除
gcloud compute disks delete ${tempdisk}
- インスタンステンプレートを作ってグループに組み込みます。
- ブートディスクは10GB決め打ちだったり、うちの環境に合わせたコマンドになっているので、Google Developer Consoleのコマンドライン出力の内容をベースに自分で変数を埋めてください。
- 一時的にインスタンスの最小数を「2」にしています。1台しかインスタンスが立ち上がっていないと、そのインスタンスを再生成したらWebに全くアクセスできなくなってしまうからです。
#インスタンステンプレート作成
gcloud compute --project ${prj} instance-templates create ${instemplate} --machine-type ${machinetype} --network "default" --maintenance-policy "MIGRATE" --scopes "https://www.googleapis.com/auth/cloud.useraccounts.readonly","https://www.googleapis.com/auth/devstorage.read_only","https://www.googleapis.com/auth/logging.write" --tags "http-server" "https-server" --image "https://www.googleapis.com/compute/v1/projects/${prj}/global/images/${image}" --boot-disk-size "10" --boot-disk-type "pd-standard" --boot-disk-device-name ${instemplate}
#インスタンスグループ更新
gcloud compute instance-groups managed set-instance-template ${insgroup} --template ${instemplate}
#オートスケール一時的に最小2台へ
gcloud compute instance-groups managed set-autoscaling ${insgroup} --min-num-replicas 2 --max-num-replicas 10 --target-cpu-utilization 0.8 --cool-down-period 60
ここまでは、コピペでいけると思いますが、ここからは状況見つつインスタンスの再生成をしていかないといけません。
以下のコマンドで「HTTP負荷分散」がWebサーバーを認識しているか確認します。
watch "gcloud compute backend-services get-health ${backend}"
数秒間隔で状況が更新されていきます。インスタンスを再生成してLBが認識するまでは、「healthstatus : UNHEALTY」になります。すべてのサーバーが UNHEALTY だとWebにアクセスできなくなるので、最低一つは HEALTY でありつづけるように、少しずつWebサーバーのインスタンスを再作成していきます。
以下のコマンドでインスタンスを再作成していきます。これでさきほど登録したインスタンステンプレートを使って、サーバーが起動します。逆にこれをやらないと古い状態でサーバー動き続けます。
最後のweb-xxxxは自分の環境のインスタンス名に書き換えてください。
#インスタンス再生成
gcloud compute instance-groups managed recreate-instances ${insgroup} --instance web-xxxx
最後に、オートスケールの最小台数を1台に戻します。
#オートスケール最小1台へ戻す
gcloud compute instance-groups managed set-autoscaling ${insgroup} --min-num-replicas 1 --max-num-replicas 10 --target-cpu-utilization 0.8 --cool-down-period 60
その他の確認コマンド
状況の確認のためのコマンドも列挙しておきます。一部、先に書いた変数を利用しています。
#インスタンスに接続
gcloud compute --project ${prj} ssh ${tempins}
#スナップショットの確認
gcloud compute snapshots list
#ディスク確認
gcloud compute disks list
#イメージ確認
gcloud compute images list
#インスタンスグループ確認
gcloud compute instance-groups managed list
#インスタンス確認
gcloud compute instances list
#インスタンスグループのインスタンス確認
gcloud compute instance-groups list-instances ${insgroup}
#インスタンスが使用しているインスタンステンプレートの確認(一台ずつの確認)
gcloud compute instances describe web-xxxx | grep instanceTemplates
#または jq コマンドを使って
gcloud compute instances describe web-xxxx --format json | jq -r '.metadata.items[] | select( .key == "instance-template") | .value'
次回はインスタンステンプレートの一括確認を紹介
インスタンスの再生成をやってると、どれが再生成終わったかがわからなくなってきます。しかし、インスタンスがどのテンプレートで動いているかは一台ずつしか見れません。
次回は、それを簡単に確認するコマンドを紹介します。