2017年1月17日火曜日

GCE でクロスリージョン+オートスケーリング 第二回

GCE でクロスリージョン+オートスケーリング 第二回

前回では,GCE でこんなものを作ってみようかな,ということについての概要を書きました。今回はそれを具体的に作っていきます。

構成



上図は,今回作成する構成を簡単に表したものです。"負荷分散(ロードバランサ)" で HTTPS(443)ポートでリクエストを受け付け,"ターゲットプロキシ" で SSL 終端処理を行います。その後 "URLマップ" で /site1 という URL と /site2 という URL へのリクエストを解釈して,それぞれ異なる "バックエンドサービス" に振り分けます。

"インスタンスグループ"はそれぞれの "バックエンドサービス" 内に 2 つづつ用意し,異なるリージョンに配置します。これはリージョンを跨ぐ負荷分散を実現するための準備です。

"インスタンスグループ" 内のインスタンスは "自動スケーリング" によりスケールイン/アウトを繰り返すよう設定します。この場合は "管理対象インスタンスグループ" として作成します。このため,インスタンスの雛形を定義する "イメージ" を作成し,さらにその起動設定を "インスタンステンプレート" で定義する必要があります。

では,まず "イメージ" の作成から具体的にやっていきましょう。今回は "負荷分散(ロードバランサ)" の "バックエンド" となる "インスタンスグループ" の作成まで行うこととします。

なお,以降 GCE の Web GUI コンソールは使わず,全て gcloud コマンドで行います。gcloud コマンドの操作方法についてはここでは触れません。gcloud からの認証(gcloud auth login)やプロジェクトの作成,およびデフォルトのプロジェクト設定についても既に行っていることとします。

また,GCE に作るオブジェクトの名前は全て「mygce-」というプレフィクスをつけたいと思います。

"イメージ" の作成まで

まず,インスタンスの雛形となる "イメージ" を作成します。今回は GCP が公開している CentOS 7 の "イメージ" をベースとし,その上に Apache (httpd)が稼働するようにします。また,前出の図のように機能が異なる Web サーバに URL で振り分けを行いますので,2 つの "イメージ" を作成します。今後、これらのサイトを便宜上「site1」「site2」と呼びます。

site1 の "イメージ" の作成

site1 の "イメージ" は,「"ディスク" 作成」→「インスタンス起動」→「Apache等インストール/設定」→「インスタンスを削除して "ディスク" 解放」→「"イメージ" 作成」といった手順で作成します。
  1. "公開イメージ" から "ディスク" 作成

    CentOS7 の "公開イメージ" から名前が「mygce-site1-disk」という "ディスク" を作成します。"ゾーン" は任意のものを設定しています。
  2. $ gcloud compute disks create mygce-site1-disk \
      --image-family=centos-7 \
      --image-project=centos-cloud \
      --zone asia-east1-b

  3. 作成した "ディスク" をブートディスクとしてアタッチしてインスタンスを生成

    1 で作成した "ディスク" からインスタンスを立ち上げます。この後,これにログインして好みの設定にしていきます。"ゾーン" は任意です。--metadata で「ryo」というユーザでログインする際に必要な ssh 公開鍵(~/.ssh/id_rsa.pub)を渡しています。インスタンス名を「mygce-site1-tmp-instance」としています。
  4. # Windows の人は ssh 鍵の渡し方を適当に工夫してください.
    # --metadata-from-file なんてオプションもありますよ。
    $ gcloud compute instances create mygce-site1-tmp-instance \
      --disk name=mygce-site1-disk,boot=yes \
      --metadata "ssh-keys=ryo:$(cat ~/.ssh/id_rsa.pub)" \
      --zone asia-east1-b

  5. OS にログインしてカスタマイズ

    上記 2 の実行が成功すると,作成されたインスタンスの IP アドレスが表示されます(下記では xxx.xxx.xxx.xxx で表示しています)。ssh でそれにログインします
  6. $ ssh ryo@xxx.xxx.xxx.xxx
    ログイン後,まず httpd をインストールします。また,今回は URL によりアクセスするサイトを振り分けますので,どちらのサーバにアクセスしたかブラウザからわかるようにします。Apache の DocumentRoot ディレクトリ以下に「site1」とだけ記した index.txt というファイルを配置します。
    [ryo@mygce-site1-tmp-instance]$ sudo yum install httpd -y
    [ryo@mygce-site1-tmp-instance]$ sudo mkdir /var/www/html/site1
    [ryo@mygce-site1-tmp-instance]$ echo "site1" | sudo tee /var/www/html/site1/index.txt
    [ryo@mygce-site1-tmp-instance]$ sudo systemctl enable httpd
    [ryo@mygce-site1-tmp-instance]$ exit

  7. "ディスク" を消さないようにインスタンス削除

    上記 2 で作成したインスタンス「mygce-site1-tmp-instance」を削除します。これは,インスタンスに関連付けられたディスクからはイメージの作成ができないためです。なお下記コマンド例では -q で削除の確認を行わないようにしていますのでご注意ください。
  8. $ gcloud compute instances delete mygce-site1-tmp-instance --zone asia-east1-b -q

  9. "ディスク" から "イメージ" 作成

    下記コマンドで,上記 1, 3 で作成/編集した "ディスク"「mygce-site1-disk」から「mygce-site1-image」という名前の "イメージ" を作成します。この際,--family というオプションが必要になりますが,これは任意の文字列を指定します。ここでは「mygce-site1-image-family」としました。
  10. $ gcloud compute images create mygce-site1-image \
      --source-disk-zone=asia-east1-b \
      --source-disk mygce-site1-disk \
      --family mygce-site1-image-family


site2 の "イメージ" の作成

site2 の "イメージ" は「site1 の "イメージ" から "ディスク" 作成」→「インスタンス起動」→「/var/www/html/index.txt の内容を変更」→「インスタンス削除」→「"イメージ" 作成」という手順で行います。
  1. site1 の "イメージ" から "ディスク" 作成

    これまでに作成した 1 つ目の "イメージ" を元に下記コマンドで "ディスク" 「mygce-site2-disk」を作成します。この際,--image-family オプションに上記 5 で指定した「mygce-site1-image-family」与えます。
  2. $ gcloud compute disks create mygce-site2-disk \
      --image-family=mygce-site1-image-family \
      --zone=asia-east1-b

  3. 作成した "ディスク" をブートディスクとしてアタッチしてインスタンスを生成

    上記 1 で作成した "ディスク"「mygce-site2-disk」からインスタンスを生成します。ssh 鍵は 1 つ目のインスタンスを作成したときと同じように指定します。インスタンス名は「mygce-site2-tmp-instance」としました。
  4. $ gcloud compute instances create mygce-site2-tmp-instance \
      --disk name=mygce-site2-disk,boot=yes \
      --metadata "ssh-keys=ryo:$(cat ~/.ssh/id_rsa.pub)" \
      --zone asia-east1-b

  5. OS にログインしてカスタマイズ

    上記 2 の実行が成功すると,作成されたインスタンスの IP アドレスが表示されます(下記では xxx.xxx.xxx.xxx で表示しています)。ssh でそれにログインします。
  6. $ ssh ryo@xxx.xxx.xxx.xxx
    ログイン後,Apache の DocumentRoot ディレクトリ下にある index.txt の内容を「site2」に変更します。
    [ryo@mygce-site2-tmp-instance]$ sudo mkdir /var/www/html/site2
    [ryo@mygce-site2-tmp-instance]$ echo "site2"  | sudo tee /var/www/html/site2/index.txt
    [ryo@mygce-site2-tmp-instance]$ sudo systemctl enable httpd
    [ryo@mygce-site2-tmp-instance]$ exit

  7. "ディスク" を消さないようにインスタンス削除

    上記 2 で作成したインスタンス「mygce-site2-tmp-instance」を削除します。これは,インスタンスに関連付けられた "ディスク" からは "イメージ" の作成ができないためです。なお下記コマンド例では -q で削除の確認を行わないようにしていますのでご注意ください。
  8. $ gcloud compute instances delete mygce-site2-tmp-instance --zone asia-east1-b -q

  9. ディスクからイメージ作成

    下記コマンドで,上記 1, 3 で作成/編集した "ディスク"「mygce-site2-disk」から「mygce-site2-image」という名前の "イメージ" を作成します。この際,--family というオプションが必要になりますが,これは任意の文字列を指定します。ここでは「mygce-site2-image-family」としました。
  10. $ gcloud compute images create mygce-site2-image \
      --source-disk-zone=asia-east1-b \
      --source-disk mygce-site2-disk \
      --family mygce-site2-image-family

"インスタンスグループ" の作成まで

"負荷分散(ロードバランサ)" の "バックエンド" となる "インスタンスグループ" を作成します。今回は,米国と日本の 2 つのリージョンに跨る負荷分散を行いますので,"インスタンスグループ" を site1, site2 のそれぞれで 2 つのリージョンに作成します。

site1 の "インスタンスグループ" の作成

  1. site1 の "インスタンステンプレート" の作成

    "インスタンスグループ" を作成する前に "インスタンステンプレート" 「mygce-site1-template」を作成します。この際,マシンタイプを小さな g1-small で指定します。"イメージ" の源泉は上記で作成した「mygce-site1-image」です。ログインできるように ssh の公開鍵も登録します。
  2. $ gcloud compute instance-templates create mygce-site1-template \
      --machine-type g1-small \
      --image-family mygce-site1-image-family \
      --metadata "ssh-keys=ryo:$(cat ~/.ssh/id_rsa.pub)"

  3. 日本のリージョンに site1 の "インスタンスグループ" を作成

    まず日本リージョンの "ゾーン"「asia-east1-b」に「mygce-site1-ig-asia」という "インスタンスグループ" を作成します。"インスタンステンプレート" は上記 1 で作成した「mygce-site1-template」を指定します。
  4. $ gcloud compute instance-groups managed create mygce-site1-ig-asia \
      --size 1 \
      --template mygce-site1-template \
      --zone asia-east1-b

  5. "オートスケーリング" の設定

    "インスタンスグループ"「mygce-site1-ig-asia」に "自動スケーリング" を設定します。ここでは,最小インスタンス数 1, 最大インスタンス数 3, スケールアウトの CPU 閾値を 80% とします。
  6. $ gcloud compute instance-groups managed set-autoscaling mygce-site1-ig-asia \
      --max-num-replicas 3 \
      --min-num-replicas 1 \
      --target-cpu-utilization 0.8 \
      --scale-based-on-cpu \
      --zone asia-east1-b

  7. 米国のリージョンに site1 の "インスタンスグループ" を作成

    米国リージョンの "ゾーン"「us-east1-b」に「mygce-site1-ig-us」という "インスタンスグループ" を作成します。"インスタンステンプレート" は上記 1 で作成した「mygce-site1-template」を指定します。
  8. $ gcloud compute instance-groups managed create mygce-site1-ig-us \
      --size 1 \
      --template mygce-site1-template \
      --zone us-east1-b

  9. "オートスケーリング" の設定

    "インスタンスグループ"「mygce-site1-ig-us」に "自動スケーリング" を設定します。ここでは,最小インスタンス数 1, 最大インスタンス数 3, スケールアウトの CPU 閾値を 80% とします。
  10. $ gcloud compute instance-groups managed set-autoscaling mygce-site1-ig-us \
      --max-num-replicas 3 \
      --min-num-replicas 1 \
      --target-cpu-utilization 0.8 \
      --scale-based-on-cpu \
      --zone us-east1-b

site2 の "インスタンスグループ" の作成

site2 のインスタンスグループの作成は site1 とほぼ同じですが,以下一応コマンドを全て記しておきます。
  1. site2 の "インスタンステンプレート" の作成

    "インスタンスグループ" を作成する前に "インスタンステンプレート" 「mygce-site2-template」を作成します。この際,マシンタイプを小さな g1-small で指定します。"イメージ" の源泉は上記で作成した「mygce-site2-image-family」です。ログインできるように ssh の公開鍵も登録します。
  2. $ gcloud compute instance-templates create mygce-site2-template \
      --machine-type g1-small \
      --image-family mygce-site2-image-family \
      --metadata "ssh-keys=ryo:$(cat ~/.ssh/id_rsa.pub)"

  3. 日本のリージョンに site2 の "インスタンスグループ" を作成

    まず日本リージョンの "ゾーン"「asia-east1-b」に「mygce-site2-ig-asia」という "インスタンスグループ" を作成します。"インスタンステンプレート" は上記 1 で作成した「mygce-site2-template」を指定します。
  4. $ gcloud compute instance-groups managed create mygce-site2-ig-asia \
      --size 1 \
      --template mygce-site2-template \
      --zone asia-east1-b

  5. "オートスケーリング" の設定

    "インスタンスグループ"「mygce-site2-ig-asia」に "自動スケーリング" を設定します。ここでは,最小インスタンス数 1, 最大インスタンス数 3, スケールアウトの CPU 閾値を 80% とします。
  6. $ gcloud compute instance-groups managed set-autoscaling mygce-site2-ig-asia \
      --max-num-replicas 3 \
      --min-num-replicas 1 \
      --target-cpu-utilization 0.8 \
      --scale-based-on-cpu \
      --zone asia-east1-b

  7. 米国のリージョンに site2 の "インスタンスグループ" を作成

    米国リージョンの "ゾーン"「us-east1-b」に「mygce-site2-ig-us」という "インスタンスグループ" を作成します。"インスタンステンプレート" は上記 1 で作成した「mygce-site2-template」を指定します。
  8. $ gcloud compute instance-groups managed create mygce-site2-ig-us \
      --size 1 \
      --template mygce-site2-template \
      --zone us-east1-b

  9. "オートスケーリング" の設定

    "インスタンスグループ"「mygce-site2-ig-us」に "自動スケーリング" を設定します。ここでは,最小インスタンス数 1, 最大インスタンス数 3, スケールアウトの CPU 閾値を 80% とします。
    $ gcloud compute instance-groups managed set-autoscaling mygce-site2-ig-us \
      --max-num-replicas 3 \
      --min-num-replicas 1 \
      --target-cpu-utilization 0.8 \
      --scale-based-on-cpu \
      --zone us-east1-b

これでリージョンを跨ぐ負荷分散を考慮した 2 つのサイトの "インスタンスグループ" を作成することができました。次回はこの続きで,"負荷分散(ロードバランサ)" の部分を作成していきます。

GCE でクロスリージョン+オートスケーリング 第二回

0 件のコメント:

コメントを投稿