OpenShift v4.9をAWSへIPIインストールしてみた

#　はじめに

みなさん、こんにちは。
本記事では、`IPI(Installer-Provisioned Infrastructure)`を使って、AWS上へ[Red Hat&reg; OpenShift&reg; Container Platform](https://www.redhat.com/ja/technologies/cloud-computing/openshift) v4.9のクラスタを構築します。

実は個人的に5年くらい前に現OpenShiftのコミュニティ版`OKD`の前身の`origin`を触ったことがあるのですが、
originはansibleベースのインストーラーで大量のplaybookを用いてインストールする必要があり、しんどい思いをした記憶があります…

その印象が強くてちょっと構えてしまいましたが、
かなり進化していてめちゃくちゃ簡単に構築できるので、OpenShift気になってる方、とりあえず試しに触ってみた方が早いと思います！

:::note warn
本手順はローカルPCとしてMacを使った手順となっています。
また、事前に下記を行なって下さい。
・Mac PCへterraformのインストール(<a href=https://qiita.com/ffrr55s/items/5394ea8362d963ca083a>参考</a>)
・AWS IAMにてユーザ作成（<a href=https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html>参考</a>）
・AWS Route53でドメインの取得（<a href=https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/getting-started-s3.html#getting-started-find-domain-name>参考</a>）
:::

## OpenShiftとは

OpenShiftは、Red Hatの提供する商用版の Kubernetes です。コミュニティ版はOKDです。

OpenShiftの標準機能はほぼオープンソースのKubernetesですが、Operatorと呼ばれるKubernetesのAPIを拡張する機能を軸に、CI/CDや可視観測など、クラウドネイティブアプリケーションの開発・運用を効率的に行うために必要な機能をバンドル提供する製品となっています。

Red　Hatのサポートを受けられるサブスクリプションを購入して利用できますが、期間限定の無償利用も可能になっています。

# 1. OpenShiftのインストーラーのダウンロード
## 1-1. [Red Hat Hybrid Cloud Console](https://console.redhat.com/)へアクセス

https://console.redhat.com/

アカウントを作成してログインして下さい（アカウントは無料です）。

## 1-2. [Openshift] - [Clusters] - [Create Clusters]を押下

この時点ではクラスタは作られないので安心してください。

## 1-3. 右画面の下の方の`Run it yourself`の`AWS(x86_64)`を押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/79ac052d-cf13-b120-a547-b59f5182627a.png)


## 1-4. インストールタイプの選択画面が表示されるので、`Installer-provisioned Infrastructure`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/cc95f190-7cab-d9a9-7f79-7d07caa0718b.png)

OpenShitクラスタを自分でdeployしたい場合は、以下の2タイプの方法があります。

| インストールタイプ  |  内容  |
| ---- | ---- |
|  IPI (Installer-Provisioned Infrastructure) | OpenShiftクラスタを展開するインフラストラクチャも含めてプロビジョニング |
| UPI (User-provisioned infrastructure) |自分で事前にプロビジョニングしたインフラストラクチャへOpenShiftクラスタを展開|

IPIは、パブリッククラウドのアカウントを事前に取得の上、OpenShiftクラスタを展開する`openshift-install`というコマンドへCredentialなどを引き渡して実行することで、パブリッククラウドのAPIを用いてインフラストラクチャを自動構築してくれます。

一方、例えば会社でプライベートクラウドを運用している等、オンプレミスの環境へOpenShiftクラスタを展開したい、という場合は`UPI`を選択することになります。

OpenShiftクラスタ自体の運用をオフロードしたい、という場合は、AWS、GCP、Azure、IBM Cloudのマネージドサービスを利用したり、Red Hatが管理している[Red Hat Dedicated](https://cloud.redhat.com/products/dedicated/)を利用するという選択肢もあります。

## 1-5. インストーラーをダウンロード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/a273444b-94ca-19d7-f6d1-bb1e4ec7452d.png)

# 2. deployするOpenShiftクラスタのconfig出力
## 2-1. 作業ディレクトリを作成し、解凍した`openshift-install`を設置

```
$ mkdir work
$ ls openshift-install
openshift-install
```

## 2-2. 公開鍵の作成

deployされるインスタンスへsshするのに使用します。

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

## 2-3. [Red Hat Hybrid Cloud Console](https://console.redhat.com/)から`Pull Secret`をダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/1f6632df-231e-241a-165e-51e7ef4aba2e.png)

## 2-4. config格納用の任意のディレクトリを作成

ここでは、`config`というディレクトリを作成しておきます。

```
$ mkdir config
```

## 2-5. `install-config.yaml`を生成
対話形式で2-2の公開鍵のパスと、2-3でダウンロードしたPull Secret(中身をそのままペースト)を入力します。

:::note warn
MACの
[システム環境設定]-[セキュリティとプライバシー]-[一般]にて、
ダウンロードしたアプリケーションの実行許可をしてから進んでください。
:::

```bash
$ ./openshift-install create install-config --dir=./config     
? SSH Public Key  # 2-2で作成した公開鍵 (.pub)
? Platform aws　　　　　　 # awsを選択
? AWS Access Key ID  # AWS IAMで取得したAccess Key ID
? AWS Secret Access Key # AWS IAMで取得したSecret Access Key ID

# 自動で~/.aws/credentialsが生成されて、ここに入力したKey IDが保存されます。

? Region ap-northeast-1　　 # AWS Region (ここではTokyoリージョンを指定)
? Base Domain # Route53で取得したドメイン
? Cluster Name # 任意のクラスタ名 (サブドメインなどで使用される)
? Pull Secret # 2-3で取得したPull Secretのファイルの中身をベタ貼り                                   
```

`install-config.yaml`の中身は以下の感じになってます。
masterノードやworkerノードの台数を変更したい場合は修正して下さい。
今回は特に編集せずにそのままdeployしてみます。

```yaml:install-config.yaml
apiVersion: v1
baseDomain: example.com # Route53で取得したドメイン
compute:
- architecture: amd64
  hyperthreading: Enabled
  name: worker
  platform: {}
  replicas: 3 # デフォルトでworker ３台の構成
controlPlane:
  architecture: amd64
  hyperthreading: Enabled
  name: master
  platform: {}
  replicas: 3　 # デフォルトでmaster ３台の構成
metadata:
  creationTimestamp: null
  name: dev # 入力したクラスタ名
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  machineNetwork:
  - cidr: 10.0.0.0/16
  networkType: OpenShiftSDN
  serviceNetwork:
  - 172.30.0.0/16
platform:
  aws:
    region: ap-northeast-1 # 選択したAWS Region
publish: External
pullSecret:　 # Pull Secret 
sshKey: |　   #　公開鍵情報
```

:::note info
--dirオプションで指定したディレクトリ配下に.openshift_install_state.jsonがある状態で、2-5のコマンドを実行すると、対話入力が表示されずに過去に入力した情報に基づいてinstall-config.yamlが生成されます。

改めて対話入力でinstall-config.yamlを作成したい場合は、.openshift_install_state.jsonを削除して下さい。
:::

# 3. OpenShiftクラスタのdeploy

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

30分くらいするとdeployが完了します。


```bash
$ ./openshift-install create cluster --dir=./config
INFO Credentials loaded from the "default" profile in file "/path/to/dir/.aws/credentials" 
INFO Consuming Install Config from target directory 
INFO Creating infrastructure resources...         
INFO Waiting up to 20m0s for the Kubernetes API at https://example.com:6443...  
# K8s APIのエンドポイント

INFO API v1.22.3+4dd1b5a up                       
INFO Waiting up to 30m0s for bootstrapping to complete... 
INFO Destroying the bootstrap resources...        
INFO Waiting up to 40m0s for the cluster at https://example.com: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=/path/to/dir/work/config/auth/kubeconfig' 
# 後述のocコマンドやkubectlコマンドを実行する際は、このkubeconfigを参照する

INFO Access the OpenShift web-console here: https://example.com 
INFO Login to the console with user: "kubeadmin", and password: "randompassword"  # Webコンソールのログインで使用されるアカウント情報

INFO Time elapsed: 34m41s 
```

出力されたURLへアクセスすればWebコンソールへ接続できます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/05a6643f-5f79-2a69-0957-7f1eb16408fc.png)


# 4. OpenShiftクライアントツール(`oc`)のダウンロード

[Red Hat Hybrid Cloud Console](https://console.redhat.com/)の[Download]メニューから`Command line interface`をダウンロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/6e766d2b-5ce7-ec91-cf34-93486dfb27b1.png)

## 4-1. ダウンロードファイルを解凍
```
$ tar zxvf openshift-client-mac.tar.gz
```

## 4-2. PATHの通ってるディクレクトリへ配置

```
$ mv oc /usr/local/bin/
```

:::note warn
MACの[システム環境設定]-[セキュリティとプライバシー]-[一般]にて、
ダウンロードしたアプリケーションの実行許可をして下さい。
:::

## 4-3. OpenShiftクラスタへ接続してみる

````
$ export KUBECONFIG=/path/to/dir/work/config/auth/kubeconfig

$ oc cluster-info
Kubernetes control plane is running at https://example.com:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
````

`kubeconfig`を`~/.kube/config`へ配置すれば、
環境変数`KUBECONFIG`の定義不要でocコマンドを実行できます。

```
$ mkdir ~/.kube
$ cp -p /path/to/dir/work/config/auth/kubeconfig ~/.kube/config
$ oc cluster-info
Kubernetes control plane is running at https://example.com:6443

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
```

# 5. IPIインストールで構築されるAWSインフラの構成

`openshift-install`は、以下の図に示す構成でAWS環境を構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/559968/7d0e4a03-347e-e241-3eb9-c1844a183aea.png)

この図には表現していませんが、構築中にbootstrapというインスタンスが起動し、OpenShiftの構築を行なった後に削除されます。

InternetからKubernetes APIの6443ポート宛の通信をELBで受け、ELBがいずれかのAvailability Zone(AZ)内のmasterノードへロードバランシングします。
ユーザのdeployしたアプリケーションPodのingress通信はworkerノードへ分散されます。
 
# 参考資料
- [Product Documentation for OpenShift Container Platform 4.9](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.9)
- [Red Hat Customer Portal 第2章 インストールおよび更新](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.9/html/architecture/architecture-installation#supported-platforms-for-openshift-clusters_architecture-installation)
- [Qiita. Mac に Terraform をインストールする（homebrew 利用）](https://qiita.com/ffrr55s/items/5394ea8362d963ca083a)
- [Amazon Route53 とは](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/Welcome.html)
- [IAM ユーザーのアクセスキーの管理](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_access-keys.html)