概要

  • こんにちわ、新川です。今回もOracle Cloud Infrastructure (OCI) の検証結果をブログにまとめます。本日はOCI を学習する方にとってファーストステップとなるハンズオンを想定してみました! OCI Compute サービスと関連する基本的なサービスを活用した構築ハンズオンとなります。
  • ハンズオンの内容としては、まずロードバランサーを作成し、次にOCI Compute インスタンスをスケーリングさせるためのインスタンス構成、インスタンスプールを作成します。続いて、オートスケーリングのポリシー導入を行います。OCI Compute インスタンスは、起動時にCloud-init スクリプトによってWebサーバーが導入され、サーバーのホスト名とIPアドレスを表示するサンプルページが配置されます。最後に、負荷ツールをかけながらロードバランサー経由でWebサーバーへアクセスして、負荷分散やスケールアウト/ スケールインを体験します。
  • OCI の構築を行いながら、より実案件に近いサーバー構築に挑戦しましょう。

 

前提条件

  • 本記事では、以下の環境がすでに準備されている前提で進めます。
  • Oracle Cloud アカウントが作成されていること。まだ作成していなければ、以下のブログを参考にアカウントを作成してください。
  • VCNおよびサブネットが作成されていること。まだVCN を作成していなければ、以下のブログを参考に作成してください。
  • オートスケーリングのベースとなるインスタンスには、Oracle Linux 9 のOSを使用します。

 

オートスケーリング構築手順

VCNおよびサブネットの準備

  • VCNおよびサブネット、ルートテーブルが作成済みであることを確認します。サブネットは、パブリックサブネット、プライベートサブネットの2つが作成されていることを確認します。また、パブリックサブネット用のルートテーブルはDestination 0.0.0.0 のターゲットにInternet Gateway が設定され、プライベートサブネット用のルートテーブルはDestination 0.0.0.0 のターゲットにNAT Gateway が設定されていることを確認しましょう。

 

  • 次に、セキュリティリストのSecurity rules を確認します。今回は、以下のようにVCN のCIDR内の通信を許可するIngress Ruleを追加しております。

 

ロードバランサーの作成

  • ここから、インターネットからの通信を受けるロードバランサーを作成します。
  • OCIの管理コンソールにて、左ナビゲーションから「Networking」→「Load balancer」を選択します。
  • 「Create load balancer」を選択します。
  • 「Load balancer name」を入力、「Choose visibility type」に「Public」、「Assign a public IP address」に「Ephemeral」を選択します。

 

  • ロードバランサーを配置するネットワークを設定します。Virtual cloud network、Subnet を選択します。作成済みのVCN、パブリックサブネットを選択します。
  • 続いて、Bandwidthの「Choose a minimum bandwidth」は「10」、「Choose a maximum bandwidth」は「10」を指定します。その他の設定はデフォルトで構いません。「Next」を選択します。

 

  • 次に、「Load balancing policy」は、「Weighted round robin」を選択します。

 

  • 次に、「Select instances」の設定では、インスタンスの選択は行いません。

 

  • Health check policy は、「Protocol」に「HTTP」、「Port」に「80」が選択されていることを確認します。その他の設定はデフォルトで構いません。
  • 「Backend set name」を入力します。

 

  • Security List は、先ほど設定済みのため、「Manually configure security list rules after the backend servers are added」を選択します。
  • その他の設定はデフォルトで構いません。「Next」を選択します。

  • 次に、HTTPリスナーを設定します。
  • 「Listener name」を入力します。「Specify the type of traffic your listener handles」に「HTTP」、「Specify the port your listener monitors for ingress traffic」に「80」が選択されていることを確認します。
  • その他の設定はデフォルトで構いません。「Next」を選択します。

  • 今回、Error logs、Access logs の設定は任意です。必要に応じて、設定を行います。検証のみであれば、無効でも構いません。「Next」を選択します。
  • 最後にReview の画面で「Submit」を選択します。

 

  • ロードバランサーが作成されました。バックエンドは存在しないため、以下のようにステータスが「Incomplete」となっています。次に進みます。

 

 

インスタンス構成の作成

  • OCIの管理コンソールにて、左ナビゲーションから「Compute」→「Instance configurations」を選択します。
  • 「Create instance configuration」を選択します。
  • 「Name」を入力します。
  • Placement はデフォルトで構いません。
  • Image and shape において、「Image」にOracle Linux 9 のイメージを選択します。

 

  • 続いて、Image and shape の「Advanced options」を展開します。
  • 「Initialization script」に後述のCloud-init スクリプトを貼り付けます。

 

  • 以下、Cloud-init スクリプトに指定する内容です。WordPress で公開用に一部加工しています。
  • もし、インスタンス起動時にCloud-init スクリプトが正常に実行されない場合は、ログファイル /var/log/cloud-init-output.log を確認しましょう。

 

#!/bin/bash

dnf install -y oracle-epel-release-el9
dnf --enablerepo=ol9_developer_EPEL install -y httpd stress-ng
systemctl enable --now httpd

firewall-cmd --permanent --add-service=http
firewall-cmd --reload

HOSTNAME=$(curl -sL --retry 3 --max-time 5 http://169.254.169.254/opc/v1/instance/hostname)
PRIVATE_IP=$(hostname -I | awk '{print $1}')

mkdir -p /var/www/html

cat << EOF > /var/www/html/index.html
<html>
<head>
  <title>OCI AutoScaling Verification</title>
</head>
<body>
  <div class="container">
    <h1>OCI AutoScaling Demo</h1>
    <hr>
    <p class="info">Server Hostname: <span class="highlight">${HOSTNAME}</span></p>
    <p class="info">Server IP Address: <span class="highlight">${PRIVATE_IP}</span></p>
  </div>
</body>
</html>
EOF

chown apache:apache /var/www/html/index.html

 

  • Availability configuration、Oracle Cloud Agent は、デフォルト通り選択します。「Next」を選択します。

 

 

  • Security はデフォルトで構いません。「Next」を選択します。
  • Primary network の設定を行います。「Select existing virtual cloud network」を選択します。
  • Virtual cloud network、Subnet を選択します。作成済みのVCN、プライベートサブネットを選択します。

 

  • Add SSH keys において、新たにキーを作成する場合は「Generate a key pair for me」、既存のキーを使用する場合は「Upload public key file (.pub)」あるいは「Paste public key」を選択して既存の公開キーを指定します。
  • その他の設定は、デフォルトで構いません。「Next」を選択します。

 

  • Boot volume はデフォルトで構いません。「Next」を選択します。
  • 最後にReview の画面で「Create」を選択します。

  • インスタンス構成が作成されました。

インスタンスプールの作成

  • OCIの管理コンソールにて、左ナビゲーションから「Compute」→「Instance pools」を選択します。
  • 「Create instance pool」を選択します。
  • 「Name」を入力します。
  • 「Number of instances」に「1」を指定します。
  • 「Instance configuration」に先ほど作成したインスタンス構成を選択します。「Next」を選択します。

 

  • Availability domains において、Primary VNIC の設定を行います。
  • Virtual cloud network、Subnet を選択します。作成済みのVCN、プライベートサブネットを選択します。

 

  • 「Attach a load balancer」を有効にし、「Load balancer type」に「Load balancer」を選択、「Load balancer」、「Backend Set」に作成済みのロードバランサー、バックエンドを選択、「Port」に「80」を選択します。「Next」を選択します。

 

  • 最後にReview の画面で「Submit」を選択します。

 

  • インスタンスプールが作成されました。以下の画像は、インスタンスプール作成のジョブ画面です。
  • 指定通りインスタンスが1台起動し、ロードバランサーにアタッチされました。

インスタンスにログイン・OS 設定のチェック

  • 以下の画像は、ナビゲーション・メニューから「Compute」→「Instances」を選択した画面です。

 

  • Cloud Shell を使用して、インスタンス OS にssh接続を行います。なお、Cloud Shell はプライベートネットワークに切り替えて作業を行います。Cloud Shell をプライベートネットワークに切り替える方法は、こちらのブログを参照ください。
  • インスタンス OS にssh接続後、以下のように、httpdサービスがインストールされサービスが起動していること、localhost にcurl を行ってhtml が返ることを確認します。
systemctl status httpd
curl http://localhost

 

オートスケーリングポリシーの設定

  • 続いて、インスタンスプールにオートスケーリングを設定します。
  • OCIの管理コンソールにて、インスタンスプールが選択された状態から、「Actions」→「Create autoscaling configuration」を選択します。

 

  • 「Name」を入力します。「Next」を選択します。

 

  • Autoscaling policiesにおいて、「Add autoscaling policy」を選択します。
  • 「Type」に「CPU utilization」を選択します。
  • 「Autoscaling policy name」を入力します。

 

  • 続けて、Scale-out rule、Scale-in rule、Scaling limits を設定します。
  • 「Scale-out operator」に「Greater than (>)」選択、「Scale-out threshold percentage」に「60」、「Number of instances to add」に「1」を指定します。
  • 「Scale-in operator」に「Less than (<)」選択、「Scale-in threshold percentage」に「40」、「Number of instances to remove」に「1」を指定します。
  • 「Minimum number of instances」に「1」、「Maximum number of instances」に「4」、「Initial number of instances」に「1」を指定します。
  • 「Add policy」を選択します。

 

  • Autoscaling policy が作成されました。「Next」を選択します。

 

  • 最後にReview の画面で「Create」を選択します。

オートスケーリングの検証

負荷ツールの実行

  • インスタンス起動時の Cloud-init スクリプトでインストールされた stress-ng を使用し、CPU使用率を意図的に高騰させます。
    • cpuオプションで負荷をかけるワーカープロセスの数を指定します。インスタンスのOCPU数に合わせて、変更します。
stress-ng --cpu 2 &
  • top コマンドで、CPU使用率を監視します。数秒以内に、CPU使用率が99% まで上がりました。
top -c

 

スケールアウトの確認

  • OCIの管理コンソールにて、左ナビゲーションから「Compute」→「Instance pools」を選択します。
  • インスタンスプールを選択し、「Monitoring」を選択します。
  • メトリクスのCPU Utilization を確認します。メトリクスからもCPU使用率が上がり、100% に張り付いていることが確認できます。

 

  • 次に、「Details」を選択し、「Attached instances」を確認します。スケールアウトのルールに合致したため、インスタンスが1台から2台に増えたことが確認できます。

 

  • OCIの管理コンソールにて、左ナビゲーションから「Networking」→「Load balancer」を選択します。
  • ロードバランサーを選択し、「Backend sets」を選択します。
  • 以下の画像は、バックエンドのヘルスステータスです。起動したインスタンスは、自動的にロードバランサー配下に追加されました。

 

  • 続いて、ブラウザからロードバランサーのIPアドレスにアクセスし、cloud-init スクリプトで配置したページが表示されることを確認します。

  • 再読み込みすると、もう1台のサーバーへアクセスが切り替わります。

 

スケールインの確認

  • 続いて、スケールインの検証を行います。pkill コマンドで、stress-ng の一連のプロセスを停止させます。
pkill stress-ng

 

  • メトリクスのCPU Utilization を確認します。メトリクスからもCPU使用率が約0% に戻ったことが確認できます。

 

  • ロードバランサーのバックエンドのヘルスステータスを確認します。
  • スケールインのルールに合致したため、インスタンスが「Drained」のステータスに変わりました。ロードバランサーからインスタンスが切り離されたことが確認できます。スケールインの際、古くから起動していた順に削除対象となります。

 

  • インスタンスプールを選択し、「Details」を選択します。
  • 「Attached instances」を確認します。管理下のインスタンスが削除されたことを確認します。

まとめ

  • OCI Compute でオートスケーリング構成のウェブサーバーの構築、オートスケーリングの検証を行いました。設定画面は視覚的に分かりやすく、迷うことなく設定を行うことができました。また、cloud-init スクリプトを使用することで、OS 設定の手間を省いています。
  • OCI 学習のファーストステップとして、活用ください。