3scaleのHA構成を構築する

初版: 2020/12/16
著者: 田畑義之, 株式会社日立製作所 (GitHubアカウント: [@y-tabata](https://github.com/y-tabata))

# はじめに
3scaleとは、OSSのAPI管理製品です。今回は2020年10月28日にリリースされた3scaleの最新バージョン2.9.1のHA構成を、3scaleのOpenShift Operatorを用いて構築してみます。3scaleの詳細は、Think ITの連載「[フルセットのOSSベースAPI管理基盤3scale入門](https://thinkit.co.jp/series/8697)」をご参照ください。

本記事は、あくまで執筆者の見解であり、日立製作所及びRed Hatの公式なドキュメントではありません。

# 3scaleのHA構成とは
そもそも、3scaleのHA構成とは何でしょうか。3scaleはOpenShift上で動作するので、障害が発生しても、liveness probeやreadiness probe、restart policyといったOpenShiftの機能によって、最小のダウンタイムで障害箇所を自動復旧するように設計できます。

しかし、システムによってはこの最小のダウンタイムでさえも許されないことがあります。そのようなシステムでは、システムのコンポーネントを冗長化し、一方のコンポーネントに障害が発生しても他方のコンポーネントで業務を継続できるように、HA構成をとることが一般的です。3scaleでも、そのような目的のためにHA構成をとることができます。

3scaleは以下のようなPodで構成されています。HA構成では、重要なPodはレプリカ数を増やして冗長化します。また重要な情報を持つDBやファイルストレージは、レプリケーション構成を組むために、OpenShift外に構築します。

| Pod名              | 説明                                                         | HA構成のとき                            |
| ------------------ | ------------------------------------------------------------ | --------------------------------------- |
| apicast-production | 本番環境用のAPIゲートウェイ。                                | **レプリカ数を2以上にして冗長化する。** |
| apicast-staging    | ステージング環境用のAPIゲートウェイ。                        | **レプリカ数を2以上にして冗長化する。** |
| system-app         | 管理者ポータルや開発者ポータルを提供する。                   | **レプリカ数を2以上にして冗長化する。** |
| system-sidekiq     | 非同期でsystemコンポーネントのバックグラウンドタスクを実行する。 | **レプリカ数を2以上にして冗長化する。** |
| system-sphinx      | 管理者ポータルのテキスト検索機能用のインデックスサービス。   | レプリカ数は1のままでOK。               |
| system-memcache    | 管理者ポータルや開発者ポータル用のキャッシュサービス。       | レプリカ数は1のままでOK。               |
| system-mysql       | 管理者ポータルや開発者ポータル用各種リソースを格納するメインデータベース。 | OpenShift外に構築するため、Podは不要。  |
| system-redis       | systemコンポーネントのタスクを保存するデータベース。         | OpenShift外に構築するため、Podは不要。  |
| backend-listener   | 認証機能やレポート機能を担当する。                           | **レプリカ数を2以上にして冗長化する。** |
| backend-worker     | 非同期でbackendコンポーネントのバックグラウンドタスクを実行する。 | **レプリカ数を2以上にして冗長化する。** |
| backend-cron       | backendコンポーネントの失敗したタスクを再スケジュールする。  | **レプリカ数を2以上にして冗長化する。** |
| backend-redis      | 認証機能やレポート機能用のデータや、backendコンポーネントのタスクを保存するデータベース。 | OpenShift外に構築するため、Podは不要。  |
| zync               | OpenID Connect関連の通知を受信し、zync-queにデータ同期を委任する。 | **レプリカ数を2以上にして冗長化する。** |
| zync-que           | OpenShiftのRouteの作成・管理や、Red Hat Single Sign-Onとのデータ同期を担当する。 | **レプリカ数を2以上にして冗長化する。** |
| zync-database      | zyncコンポーネントのタスクを保存するデータベース。           | レプリカ数は1のままでOK。               |

# 3scaleのHA構成を構築してみる
それでは、実際に3scaleのHA構成を構築してみましょう。今回はAWS上のOpenShift 4.5の環境を用いて構築します。

## 事前準備
まずは、事前準備です。DBやファイルストレージをOpenShift外に構築しましょう。今回は以下のようなAWSサービスを使います。

| DB/ファイルストレージ       | AWSサービス                  |
| --------------------------- | ---------------------------- |
| system-mysqlの代替となるDB  | Amazon RDS for MySQL[^1]     |
| system-redisの代替となるDB  | Amazon ElastiCache for Redis |
| backend-redisの代替となるDB | Amazon ElastiCache for Redis |
| ファイルストレージ          | Amazon S3                    |

[^1]: DBパラメータグループを変更して、log_bin_trust_function_creators=1とする必要があります。

## 3scale Operatorのインストール
次に、3scale Operatorをインストールしましょう。
OperatorHubで、「3scale」と検索すると、3scaleに関連するOperatorが表示されます。
![operator_hub.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267112/11a34906-b090-20c7-5ecd-cd7f8587158f.png)

ここでは、Community版の「3scale API Management」というOperatorを選択します。
Operatorを選択すると、Operatorの概要が表示されますので、「Install」をクリックします。
![operator_summary.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267112/5e68160d-aee4-da62-a38f-e0d143db867f.png)

Operatorのインストール画面が表示されます。今回は3scale 2.9をインストールするので、Update Channelに「threescale-2.9」を指定し、「Install」をクリックします。
![operator_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267112/547da03e-966e-98b4-49ed-62d9d1571493.png)

以上で、3scale Operatorのインストールは完了です。

## 3scaleのインストール
3scaleをインストールしていきましょう。
まずは、OpenShift外に構築したDBやファイルストレージに接続するために、Secretを4つ作成します。

(1) system-mysqlの代替となるDB接続用のSecret

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: system-database
stringData:
  URL: "mysql2://root:<rootユーザのパスワード>@<Amazon RDSのエンドポイント>/system"
  DB_USER: "root"
  DB_PASSWORD: "<rootユーザのパスワード>"
type: Opaque
```

(2) system-redisの代替となるDB接続用のSecret

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: system-redis
stringData:
  URL: "redis://<Amazon ElastiCache for Redisのプライマリエンドポイント>/1"
  NAMESPACE: ""
  MESSAGE_BUS_URL: "redis://<Amazon ElastiCache for Redisのプライマリエンドポイント>/8"
  MESSAGE_BUS_NAMESPACE: ""
type: Opaque
```

(3) backend-redisの代替となるDB接続用のSecret

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: backend-redis
stringData:
  REDIS_STORAGE_URL: "redis://<Amazon ElastiCache for Redisのプライマリエンドポイント>/0"
  REDIS_STORAGE_SENTINEL_HOSTS: ""
  REDIS_STORAGE_SENTINEL_ROLE: ""
  REDIS_QUEUES_URL: "redis://<Amazon ElastiCache for Redisのプライマリエンドポイント>/1"
  REDIS_QUEUES_SENTINEL_HOSTS: ""
  REDIS_QUEUES_SENTINEL_ROLE: ""
type: Opaque
```

(4) ファイルストレージ接続用のSecret

```yaml
apiVersion: v1
kind: Secret
metadata:
  name: aws-auth
stringData:
  AWS_ACCESS_KEY_ID: <Amazon S3にアクセスできるAWS IAMユーザのアクセスキーID>
  AWS_SECRET_ACCESS_KEY: <Amazon S3にアクセスできるAWS IAMユーザのシークレットアクセスキー>
  AWS_BUCKET: <Amazon S3バケット名>
  AWS_REGION: ap-northeast-1
type: Opaque
```

4つのSecretの準備が終わったら、インストールした3scale OperatorのAPIManager作成画面を表示します。
![create_apimanager.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267112/2a55656f-4040-8720-80d4-b1394df88bd3.png)

APIManager作成画面のYAML Viewに、以下のようなYAMLを書き、「Create」をクリックします。

```yaml
apiVersion: apps.3scale.net/v1alpha1
kind: APIManager
metadata:
  name: example-apimanager
  namespace: 3scale
spec:
  wildcardDomain: apps.<OCPクラスタ名>.<OCPクラスタのベースドメイン名>
  system:
    fileStorage:
      simpleStorageService:
        configurationSecretRef:
          name: aws-auth
    appSpec:
      replicas: 2
    sidekiqSpec:
      replicas: 2
  backend:
    listenerSpec:
      replicas: 2
    workerSpec:
      replicas: 2
    cronSpec:
      replicas: 2
  apicast:
    productionSpec:
      replicas: 2
    stagingSpec:
      replicas: 2
  zync:
    appSpec:
      replicas: 2
    queSpec:
      replicas: 2
  highAvailability:
    enabled: true
```

以上で、3scaleのインストールは完了です。以下のように、3scaleのHA構成に必要なPodが作成されていることを確認できます。

```bash
NAME                              READY   STATUS      RESTARTS   AGE
3scale-operator-f8f74c985-rtbjw   1/1     Running     0          10m
apicast-production-1-deploy       0/1     Completed   0          3m
apicast-production-1-ftghr        1/1     Running     0          2m55s
apicast-production-1-vn87t        1/1     Running     0          2m54s
apicast-staging-1-6wfsv           1/1     Running     0          2m57s
apicast-staging-1-9ng79           1/1     Running     0          2m57s
apicast-staging-1-deploy          0/1     Completed   0          3m
backend-cron-1-deploy             0/1     Completed   0          3m59s
backend-cron-1-m752m              1/1     Running     0          3m55s
backend-cron-1-ng7hl              1/1     Running     0          3m55s
backend-listener-1-deploy         0/1     Completed   0          3m59s
backend-listener-1-md5wt          1/1     Running     0          3m55s
backend-listener-1-z69w5          1/1     Running     0          3m55s
backend-worker-1-56dvv            1/1     Running     0          3m55s
backend-worker-1-deploy           0/1     Completed   0          3m59s
backend-worker-1-pp8bg            1/1     Running     0          3m55s
system-app-1-deploy               0/1     Completed   0          3m38s
system-app-1-hook-post            0/1     Completed   0          66s
system-app-1-hook-pre             0/1     Completed   0          3m35s
system-app-1-t6wch                3/3     Running     0          2m38s
system-app-1-x57dd                3/3     Running     0          2m38s
system-memcache-1-deploy          0/1     Completed   0          3m38s
system-memcache-1-rsmj2           1/1     Running     0          3m34s
system-sidekiq-1-deploy           0/1     Completed   0          3m38s
system-sidekiq-1-jknvg            1/1     Running     0          3m35s
system-sidekiq-1-tcclr            1/1     Running     0          3m35s
system-sphinx-1-2m22d             1/1     Running     0          3m34s
system-sphinx-1-deploy            0/1     Completed   0          3m37s
zync-1-4txrj                      1/1     Running     1          3m16s
zync-1-deploy                     0/1     Completed   0          3m23s
zync-1-kmng2                      1/1     Running     0          3m16s
zync-database-1-b7hl5             1/1     Running     0          3m16s
zync-database-1-deploy            0/1     Completed   0          3m23s
zync-que-1-2g8b5                  1/1     Running     2          3m15s
zync-que-1-deploy                 0/1     Completed   0          3m23s
zync-que-1-sfw6r                  1/1     Running     2          3m15s
```

管理者ポータルにアクセスしてみましょう。管理者ポータルのURLは、Routesから確認できます。名前がzync-3scale-provider-xxxxx、URLが`https://3scale-admin.<wildcardDomain>`であるRouteが管理者ポータル用のRouteです。
![routes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267112/4676e4d0-9d98-5e83-0c33-6f06fee2bd31.png)

管理者ポータルのユーザ名とパスワードは、Secretsから確認できます。ユーザ名はADMIN_USERの値、パスワードはADMIN_PASSWORDの値です。
![secrets.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267112/931fcdae-e5ec-26fa-b01f-1b55ac85e1e7.png)

管理者ポータルにアクセスし、ユーザ名とパスワードを入力すると、Intro Wizardが表示されます。
![intro_wizard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267112/a3239894-3779-9caf-3ed8-3826c95c40ab.png)

Intro Wizardをクリアすると、管理者ポータルのダッシュボードが表示されます。
![admin_portal.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/267112/110b1669-6636-f0f6-e938-c88884774c63.png)

# おわりに
本稿では、3scaleのHA構成の構築方法をご紹介しました。HA構成にすることで、3scaleの活躍する場面がより広がるかと思います。是非この機会に使ってみてはいかがでしょうか。