LoginSignup
7
3

More than 5 years have passed since last update.

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

Posted at

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

7
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
3