GCEのオートヒーリングを試す


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 [email protected] \
--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分くらいのダウンタイムとなっていた。