TerraformでHA構成のOpenShiftクラスタを1時間で立ち上げる

(本当は30分で立ち上げると書きたかったところでしたが、OpenShiftのインストーラーが走ってる時間が30分くらいあったので。。。)

OpenShiftをHA構成で立ち上げるterraformモジュールを公開したので紹介します。

https://registry.terraform.io/modules/literalice/openshift/aws

OpenShiftはピュアなKubernetesクラスタの上に構築されるので、Kubernetesクラスタを構築できるということでもあります。

OpenShift自体は[openshift-ansible](https://github.com/openshift/openshift-ansible)でインストールするのですが、
AWSのASGやLB、SecurityGroupを設定するのがなかなか面倒なのでその作業を省力化するものです。

この記事ではOpenShift Originを使用しますが、このモジュールは商用版のOCP(OpenShift Container Platform)にも対応しているので、サブスクリプションがあればOCPのクラスタを立てることも可能です。

作成されるOpenShiftの構成は以下のような形になります。

![OpenShift Reference Architecture.png](https://qiita-image-store.s3.amazonaws.com/0/91422/ad6e0142-64ab-c60f-04ad-f78fea218770.png)

## 前提条件

この記事の手順では、AWSの上に新規のVPCとサブネット、ゲートウェイなどのネットワーク設定の他、
`m4.large`のEC2インスタンス2〜4個(master x1〜3、node x1)やLB、セキュリティグループなどが作成されます。

`terraform`が使用するAWSのプロファイルに適切な権限を設定してください。

```bash
export AWS_PROFILE=openshift_administrator
```

また、独自ドメインを運用できることを前提にしていますが、この記事ではfreenomの無料ドメインの取得とその設定方法を紹介します。

## Terraformモジュールの使用準備

`terraform`コマンドが入っていない場合は、以下を参考に導入します。

https://www.terraform.io/intro/getting-started/install.html

[terraform-aws-openshift](https://github.com/literalice/terraform-aws-openshift)を、適当なディレクトリにクローンしてください。

```bash
git clone https://github.com/literalice/terraform-aws-openshift
cd terraform-aws-openshift
```

このプロジェクトは、[Terraformモジュールの標準ディレクトリ構成](https://www.terraform.io/docs/modules/create.html#standard-module-structure)に従い、`examples`ディレクトリに実際にOpenShiftを構築するためのプロジェクトが入っています。

OpenShift Originで構築する`origin`ディレクトリと、OCPで構築する`ocp`ディレクトリがありますが、ここではOriginを利用するのでこのディレクトリに移動します。

```bash
cd examples/origin
```

移動したら、このプロジェクトを以下のように初期化してください。

```bash
terraform init
```

## OpenShiftをインストールするためのインフラを構築する

OpenShiftをインストールする対象のマシン、EC2インスタンスやセキュリティグループ、LBを作成します。

```bash
export AWS_DEFAULT_REGION=ap-northeast-1 # クラスタを作成するリージョン

export TF_VAR_platform_name=platform1 # 任意のクラスタID
export TF_VAR_platform_default_subdomain=openshift-example-xxxx.tk # クラスタにアクセスするためのドメイン

export TF_VAR_master_count=3 # Masterノードの数。HA構成って題しているので3にしていますが、別に1でもいいです

 # OpenShiftの管理機能にアクセスできるIP帯のリスト。 
 # https://www.cman.jp/network/support/go_access.cgi あたりから自分のIPをセットしてください。
export TF_VAR_operator_cidrs='["0.0.0.0/0"]'

make
```

## OpenShiftクラスタにアクセスできるようドメインを設定する

上記コマンドを実行した際、以下のようにドメイン一覧が出力されるはずです。

```
public_dns_nameservers = [
    ns-xxx.awsdns-xx.org,
    ns-xxx.awsdns-xx.co.uk,
    ns-xxx.awsdns-xx.com,
    ns-xxx.awsdns-xx.net
]
```

これは、これから構築するOpenShiftクラスタのドメイン解決を委譲するために使うネームサーバーのリストです。
すでにお名前.comなどでドメインの運用を行なっている場合は、このネームサーバーをOpenShiftドメイン(ここでは `openshift-example-xxx.tk` )のNSレコードに設定することで以下のようなドメイン名を解決できるようになります。

*  `master.openshift-example-xxx.tk` # OpenShiftの管理コンソール
*  `bastion.openshift-example-xxx.tk` # OpenShiftの管理用踏み台サーバー
*  `*.openshift-example-xxx.tk` # OpenShiftにデプロイされたアプリケーションにアクセスするためのワイルドカードドメイン

ここでは、freenomでドメインを無料で取得し、必要なOpenShiftドメインが解決できるよう設定します。

### freenomの無料ドメインを取得する

まず、 [freenom](http://www.freenom.com/ja/index.html)にサインアップしていない場合はサインアップしてログインしてください。

<img width="1018" alt="freenom_01.png" src="https://qiita-image-store.s3.amazonaws.com/0/91422/f45b5774-67f7-646c-c811-d8e4d64e622f.png">

「Services」->「Register a New Domain」からOpenShiftクラスタのドメイン(ここでは `openshift-example-xxx.tk` )を取得します。

<img width="817" alt="freenom_02.png" src="https://qiita-image-store.s3.amazonaws.com/0/91422/7c4ff159-febc-69ff-1ecd-d30f76ce6ca8.png">

「Check Availability」を押下します。

<img width="1150" alt="freenom_03.png" src="https://qiita-image-store.s3.amazonaws.com/0/91422/aebcb158-d323-2caa-cf11-de1967495e40.png">

「CheckOut」を選択します。

### Route53のネームサーバーをfreenomに設定する

Nameserverの欄に、makeを実行した際に出力された以下のドメインから、適当に二つ設定し、「Continue」を押下します。

```json
public_dns_nameservers = [
    ns-xxx.awsdns-xx.org,
    ns-xxx.awsdns-xx.co.uk,
    ns-xxx.awsdns-xx.com,
    ns-xxx.awsdns-xx.net
]
```

<img width="962" alt="freenom_04.png" src="https://qiita-image-store.s3.amazonaws.com/0/91422/0bfcec30-6f93-8dfe-edde-fd41c1040215.png">

次の画面、「Your Details」のところは、何も変更せず「I have read and agree to the Terms & Conditions」にチェックを入れるだけで大丈夫でした。

### ドメインが設定されたことを確認する

```bash
dig master.openshift-example-xxx.tk
```

上記でOpenShift管理コンソールのLBのIPが解決されることを確認します。

なお、まだOpenShiftをインストールしていないので、この時点ではURLにアクセスできません。

## OpenShiftのインストール

上記で設定したドメインが使用できるようになったら、`make install` コマンドでOpenShiftを作成したインフラにインストールします。

```bash
make install
```

エラーが発生した場合は、少し間を置いて再実行してください。

処理内容としては、踏み台にあるinventoryと[OpenShiftをインストールするための公式ansible playbook](https://github.com/openshift/openshift-ansible)を、Terraformの`remote-exec`で使用しているだけです。

## 確認

インスールの`ansible-playbook`実行が終わると、OpenShiftのクラスタにアクセスできるようになっているはずです。
masterのアクセス先URLは`make install`コマンドの実行結果として出力されています。

```
bastion_public_dns = bastion.openshift-sample-xxx.tk
master_url = https://master.openshift-sample-xxx.tk:8443
```
任意のユーザー名/パスワードでログインできるので、一通り機能を確認してみてください。
(近いうちに、任意の認証方法を設定できるようにする予定です。)

## 後片付け

`make destroy` コマンドで、作成した全てのAWSリソースが削除されます。

```bash
make destroy
```

## まとめ

この記事では、OpenShiftのクラスタ構築をTerraformで自動化しました。
OpenShiftの環境が簡単に構築できるので、いろいろと遊んでみていただければと思います。

OpenShiftやKubernetesのクラスタを運用する際は、この記事で行ったように、再現性を高めるため構築を自動化しておくのがいいですね。