OpenShift 4 を AWS上に構築してみた

# 概要

OpenShift 4 が 2019-06-04 にリリースされました。

いくつかの環境向けにインストールプランが用意されているようですが、まずは、インストールが簡単そうな AWS へのインストールを試してみました。

ここでは VPCやサブネット, EC2インスタンス, ELB, Elastic IP など、ほとんどすべてのAWSリソースをインストーラが作ってくれる **Installer-Provisioned Infrastructure (IPI)** というプランにてインストールを行います。
自前で用意したEC2インスタンスなどを用いる場合には、 **User-Provisioned Infrastructure** というインストールプランが用意されています。

OpenShift のインストーラはインターネットに接続が可能なPC (macOS か Linux がオススメ) で動かす必要がありますので、どちらかを用意してお試しください。

OpenShift のインストール完了までの所要時間は、1時間程度、AWSの準備も含めると2時間程度見ておけば、ここに書いてあることはとりあえず試せると思います。


# 事前準備
## AWSの準備

AWSの一般的な話なので、公式ドキュメントの紹介(リンク)のみで、詳細な手順はここでは割愛します。

* [Route 53 でドメインをホストしておく (Route 53 で OpenShift4 のクラスタで使うドメイン)](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/registrar.html)
* [インストールに使う IAMユーザ作成 (要 AdministratorAccess ポリシーのアタッチ)](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_users_create.html)
* [作成したユーザのアクセスキー作成](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html)

## インストール環境の準備

* [AWS CLI のインストール](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
* [作成したアクセスキーでAWSに接続できるようにしておく](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-configure.html)
* OpenShift CLI のインストール (macOS だと Homebrew でインストールできます)

```bash
brew install openshift-cli
```

* macOS か Linux のマシンで SSHキー を作成する (ホストにSSHするとき用?)

```bash
ssh-keygen -t rsa -b 4096 -f ~/.ssh/<SSH_KEY_NAME>
```

## OpenShift インストーラのダウンロード/展開

```bash
cd ${WORKSPACE}
wget https://mirror.openshift.com/pub/openshift-v4/clients/ocp/latest/openshift-install-mac-4.1.0.tar.gz
tar zxvf openshift-install-mac-4.1.0.tar.gz
```


## Secret のダウンロード

インストールの設定をするときに、Red Hat のサイトから入手する必要のある Secret (OpenShiftのインストール認証キー?) の入力を求められるので、予めダウンロードしておく

* https://cloud.redhat.com/openshift にアクセスして Red Hat アカウント でログインする
* Create Cluster -> Self-Installed Cluster -> AWS -> Installer-Provisioned Infrastructure と選択していく
 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/838fc833-4792-d14a-3151-14fddee387aa.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/407999cb-7bd2-f013-b351-1bb4ed61876e.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/8091c222-3b7a-1af5-7f04-eba528462f50.png)

* **Download Pull Secret** より、Secretをダウンロードしておく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/6516119b-2fa6-f6d4-4297-a7f8094d4395.png)

# インストール

## インストール環境の設定

展開した、インストーラ(CLI)を用いてインストール環境の準備をしておく

```bash
# 設定を保存しとくディレクトリを作っとく
mkdir config
# インストーラのCLIを使って設定を生成 (対話形式)
./openshift-install create install-config --dir=./config                                                                                                                                                                                                                                                                                                                                                                                             
? SSH Public Key <生成した SSH 公開鍵 (.pub) とついてる方>
? Platform aws
? Region <インストールしたいリージョンを選択>
? Base Domain <Route 53 でホストしてるドメインを選択>
? Cluster Name <クラスタ名を入力 ※サブドメインなどに使われます>
? Pull Secret [? for help] <ダウンロードした Secret の txt の中身をコピーして貼り付け>
```

## インストール実行

インストーラで生成した設定が入ってるディレクトリを指定してクラスタ作成(インストール)
私の場合は、だいたい1時間ぐらいかかりました。

```bash
./openshift-install create cluster --dir=./config

# 以下インストールログ
INFO Consuming "Install Config" from target directory
INFO Creating infrastructure resources...
INFO Waiting up to 30m0s for the Kubernetes API at https://api.CLUSTERNAME.YOURDOMAIN:6443...
INFO API v1.13.4+838b4fa up
INFO Waiting up to 30m0s for bootstrapping to complete...
INFO Destroying the bootstrap resources...
INFO Waiting up to 30m0s for the cluster at https://api.CLUSTERNAME.YOURDOMAIN:6443 to initialize...
INFO Waiting up to 10m0s for the openshift-console route to be created...
INFO Install complete!
INFO To access the cluster as the system:admin user when using 'oc', run 'export KUBECONFIG=${WORKSPACE}/config/auth/kubeconfig'
INFO Access the OpenShift web-console here: https://console-openshift-console.apps.CLUSTERNAME.YOURDOMAIN
INFO Login to the console with user: kubeadmin, password: *****-*****-*****-*****
```

## コンソールにアクセス

インストール実行して最後に表示される web-console の URL (https://console-openshift-console.apps.CLUSTERNAME.YOURDOMAIN) にブラウザでアクセス
ID と パスワードも 初期インストール時に設定されているものもログに出ているので、こちらを入力して、ログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/9e05a248-4121-e906-990f-c28e35640fc3.png)


無事、OpenShift の Webコンソールが表示されました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57967/3a1354fd-1509-bbd0-1108-6a59ccb17e09.png)


# 所感

## OCPのインストールについて

OpenShift 3.x の頃はインベントリファイルに何百という変数を設定した上で ansible-playbook でインストールしていたので、それと比較するとずっとOpenShift のインストールが格段に楽になり、始めやすくなり、OpenShiftの検証を始めやすくなったと思います。

体感では工数比、数十倍〜数百倍ぐらいは改善された感じがあります。

ただし、インストールした段階では、最小構成でしかないので、 3.x の頃は OpenShift のインストールの際に合わせて、EFKなどのロギングのコンポーネントスタックなども合わせてデプロイされていましたが、今回からは個別に Operator でインストールする必要があるようです。
※node-exporter や Prometheusなどのモニタリング機能は初回インストール時に構成されていました。


## 課題

* 本番運用を考えると、現行のシステムとの統合も考える必要性を考えると、UPIのインストールプランを選択することが多いのではないかと思います。
UPIの場合はどの程度設定を自分で作り込む必要があるのかなども追々検証していきたいと思います。

* OpenShift は Enterprise 向けの K8s ディストリビューションであることを謳っているにもかかわらず、4.1ではOpenShiftのすべてのノードがインターネットへの接続を求められます(Proxy経由での接続設定もできない)。4.2 (Q3 CY2019リリース予定) では Disconnected 環境へのインストールもサポートされるようなので、インターネット接続ができない環境が要求される場合にはこちらを待つ必要があります。

* OpenShift のコンポーネントが何かと、Operatorによりプロビジョニングされるようになり、通常運用はかなりライトになった感じがありますが、デフォルトから設定を変えたかったり、トラブルシュートを行うことを想定して、対象のOperatorのカスタムリソースのYAMLのフォーマットや Custom Controller が何を行うのかを理解しておく必要があるかもしれません。 


# 参考資料

* [OpenShift Container Platform 4.1 Documentation](https://docs.openshift.com/container-platform/4.1/welcome/index.html)