AutoHealing
概要
GCEのmanaged instance-group
にはautohealingという機能がある。
文字通り、ヘルスチェックの結果によってインスタンスを自動修復(再作成)する機能だ。
負荷分散におけるヘルスチェックは、ロードバランサの振り先がHEALTHY
かどうかを見るだけで、インスタンスの再作成は行わないが、マネージドインスタンスグループに適用されるヘルスチェックはインスタンスがUNHEALTHY
になったら、削除して再作成する。
ヘルスチェックはHTTP、HTTPS、TCP、SSL(TLS)プロトコルをサポートする。
注意
2018/07/11時点では Betaの機能
- ヘルスチェックの結果、マネージド インスタンス グループによってインスタンスが削除され再作成される場合、VM インスタンスに関連付けられているインスタンス テンプレートによって新しいインスタンスのプロパティが決まります(マネージド インスタンス グループに関連付けられているデフォルトのインスタンス テンプレートであるとは限りません)。 たとえば、instance-template-a を使用して VM インスタンスが作成された後、instance-template-b を使用するようにユーザーがマネージド インスタンス グループを更新したとします。この場合、ヘルスチェックによりその VM インスタンスが再作成されるときには、Compute Engine は引き続き instance-template-a を使用します。これは、ヘルスチェックによるインスタンスの再作成はユーザーではなく Compute Engine によって行われ、Compute Engine には VM インスタンスが新しいテンプレートを使用するべきだという前提がないためです。
- 既存のインスタンスのディスクにデータを書き込んだ場合、インスタンスが削除されて再作成される際にそのデータは失われます。これを回避するには、定期的に永続ディスクのスナップショットを作成したり、Google Cloud Storage などの別のソースにデータをエクスポートしたりするなどの対策を講じます。このため、必要なカスタム設定を含むカスタム イメージをインスタンス テンプレートで指定しておくこともおすすめしています。そうすれば、インスタンスが再作成される際にマネージド インスタンス グループはそのカスタム イメージを使用します。
やってみる
今回はCentOSにNginxをインストールしたカスタムイメージを作成して、そのNginxを落とした際にイメージが再作成されるかというのを試す。
また、そのときに事前に取得した固定GIPで起動できるようにする。
カスタムイメージの作成
gcloud beta compute --project=my-project instances create \
source-custom-image --zone=asia-northeast1-a --machine-type=n1-standard-1 \
--network=default --network-tier=PREMIUM --maintenance-policy=MIGRATE \
--service-account=XXXXXXXXXX-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \
--image=centos-7-v20180611 --image-project=centos-cloud --boot-disk-size=10GB \
--boot-disk-type=pd-standard --boot-disk-device-name=source-custom-image
nginxのインストール
$ sudo yum install -y nginx
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
# ブラウザから起動確認もしておく。
$ sudo shutdown now
custom-imageの作成
gcloud compute --project=my-project images create source-custom-image \
--source-disk=source-custom-image --source-disk-zone=asia-northeast1-a
静的GIPの取得
gcloud beta compute --project=my-project addresses create nginx-01 \
--region=asia-northeast1 --network-tier=PREMIUM
インスタンステンプレートの作成
gcloud beta compute --project=my-project instance-templates create \
nginx-instance-template-1 --machine-type=n1-standard-1 --network=projects/my-project/global/networks/default \
--network-tier=PREMIUM --maintenance-policy=MIGRATE --service-account=XXXXXX-compute@developer.gserviceaccount.com \
--scopes=https://www.googleapis.com/auth/devstorage.read_only,https://www.googleapis.com/auth/logging.write,https://www.googleapis.com/auth/monitoring.write,https://www.googleapis.com/auth/servicecontrol,https://www.googleapis.com/auth/service.management.readonly,https://www.googleapis.com/auth/trace.append \
--image=source-custom-image --image-project=my-project --boot-disk-size=10GB \
--boot-disk-type=pd-standard --boot-disk-device-name=nginx-instance-template-1 \
--address ${先程取得したIP(nginx-01)を設定}
ヘルスチェックの作成
ヘルスチェックは、以下とする。
- 5秒間隔でチェック
- 5秒でタイムアウト
- 異常しきい値3回でNG
- 正常しきい値1回でOK
gcloud compute --project "my-project" health-checks create http nginx-healthcheck --check-interval 5 \
--healthy-threshold 1 --unhealthy-threshold 3 --request-path /
NAME PROTOCOL
nginx-healthcheck HTTP
インスタンスグループの作成
インスタンスグループを作成する
gcloud compute --project "my-project" instance-groups managed create \
"nginx-instance-group-1" --zone "asia-northeast1-a" --base-instance-name \
"nginx-instance-group-1" --template "nginx-instance-template-1" --size "1"
インスタンスグループにAutoHealingを設定する
gcloud beta compute --project "my-project" instance-groups managed set-autohealing nginx-instance-group-1 \
--health-check nginx-healthcheck --initial-delay 120 --zone asia-northeast1-a
実験
Jmeterを使用してGIPに対して毎秒リクエストを送りながらダウンタイムを計測する。
今のインスタンス確認
もちろんRUNNING
$ gcloud compute instances list | grep nginx-instance-group
nginx-instance-group-1-8qt2 asia-northeast1-a n1-standard-1 10.240.0.31 35.200.28.55 RUNNING
nginxを落とす
$ sudo systemctl stop nginx
今のインスタンス確認
STOPPINGになってる
$ gcloud compute instances list | grep nginx-instance-group
nginx-instance-group-1-8qt2 asia-northeast1-a n1-standard-1 10.240.0.31 35.200.28.55 STOPPING
自動修復後のインスタンス確認
インスタンス名に変更は無く、RUNNINGになっている。また、GIPももちろん変更なし。
$ gcloud compute instances list | grep nginx-instance-group
nginx-instance-group-1-8qt2 asia-northeast1-a n1-standard-1 10.240.0.31 35.200.28.55 RUNNING
ダウンタイム
00:02:01で2分くらいのダウンタイムとなっていた。