【備忘録】OCP4.9 プライベートクラスターの既存VPCへのインストール手順

# 目的
OpenShift Container platform 4.9をインストールしたい。
なお、インストール先はAWSの既存VPCで、パブリックドメインなどが使用できない環境に導入したい。
ここまで限定的な場面はあまり無いと思うので、あくまで自分用手順として記録。

# 参照手順
[インストール OpenShift Container Platform 4.9](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.9/html/installing/index)
以下に記載の環境から、今回は参照手順の[4.9 プライベートクラスターのAWSへのインストール]が該当する。

# インストール先環境情報（制約事項）
- VPCは既に生成されており、クラスターデプロイ予定のサブネットも用意されている
- OCP4.9のインストーラを実行するEC2インスタンスは用意されている
- Route53ではプライベートホストゾーンのみ使用可（パブリックホストゾーンの使用は不可）
- インターネットへの通信はプロキシを介す
- デプロイするクラスターはシングルAZ構成とする

# インストール作業
以下にインストール手順を記載するが、AWSマネジメントコンソールの情報は、2022/7/14時点の情報に基づいている。
そのため、UIのアップデート等があった場合は適宜読み替えること。

### 1：OpenShiftインストール用IAMユーザの作成
OpenShiftインストール時に、AWSリソースの追加や変更を行うユーザが必要なため、専用のIAMユーザを作成する。

1. AWSマネジメントコンソールで、「IAM」サービスを選択する
1. 「ユーザを追加」を選択する
1. ユーザ名を入力し、「アクセスキー・プログラムによるアクセス」にチェックを入れ、「次のステップ：アクセス権限」へ
1. 生成するIAMユーザに「AdministratorAccess」ポリシーをアタッチして、「次のステップ：タグ」へ
1. 必要に応じてタグを追加し、「次のステップ：確認」へ
1. 確認画面で設定内容に問題ないか確認し、「ユーザの生成」を行う
1. ユーザの**アクセスキー・シークレットアクセスキーを記録**する

### 2：VPCエンドポイントの設定

インターネット接続が制限されているなどの非接続環境の場合、
OpenshiftクラスタのインストールにEC2、ELB、S3のサービスのVPCエンドポイントが必要となる。

##### EC2エンドポイントの作成
1. AWSマネジメントコンソールで、「VPC」サービスを選択する
1. 「エンドポイント」→「エンドポイントを作成」を選択する
1. 名前を「ec2.ap-northeast-1.amazonaws.com」と入力し、「AWSのサービス」を選択する
    - 東京リージョン以外の場合は、ap-northeast-1を適宜置き換える
1. 「com.amazonaws.ap-northeast-1.ec2」を選択する
1. 対象VPCを選択し、「DNS名を有効化」にチェックする
1. エンドポイントをアタッチする対象サブネットを選択する
1. エンドポイントにアタッチするセキュリティグループを選択する
    - エンドポイントへは、OpenShiftクラスタだけでなくインストーラを実行するサーバからも通信を行うので、セキュリティグループのルールに注意すること
1. ポリシーは必要に応じて設定する（今回はフルアクセス）
1. タグも必要に応じて設定し、「エンドポイントを作成」を選択して作成する

##### ELBエンドポイントの作成
1. AWSマネジメントコンソールで、「VPC」サービスを選択する
1. 「エンドポイント」→「エンドポイントを作成」を選択する
1. 名前を「elasticloadbalancing.ap-northeast-1.amazonaws.com」と入力し、「AWSのサービス」を選択する
    - 東京リージョン以外の場合は、ap-northeast-1を適宜置き換える
1. 「com.amazonaws.ap-northeast-1.elasticloadbalancing」を選択する
1. 対象VPCを選択し、「DNS名を有効化」にチェックする
1. エンドポイントをアタッチする対象サブネットを選択する
1. エンドポイントにアタッチするセキュリティグループを選択する
    - エンドポイントへは、OpenShiftクラスタだけでなくインストーラを実行するサーバからも通信を行うので、セキュリティグループのルールに注意すること
1. ポリシーは必要に応じて設定する（今回はフルアクセス）
1. タグも必要に応じて設定し、「エンドポイントを作成」を選択して作成する

##### S3エンドポイントの作成
1. AWSマネジメントコンソールで、「VPC」サービスを選択する
1. 「エンドポイント」→「エンドポイントを作成」を選択する
1. 名前を「s3.ap-northeast-1.amazonaws.com」と入力し、「AWSのサービス」を選択する
    - 東京リージョン以外の場合は、ap-northeast-1を適宜置き換える
1. 「com.amazonaws.ap-northeast-1.s3」（今回はGateway型）を選択する
1. 対象VPCを選択する
1. ルートテーブルを選択する
1. ポリシーは必要に応じて設定する（今回はフルアクセス）
1. タグも必要に応じて設定し、「エンドポイントを作成」を選択して作成する

### 3：インストーラ実行サーバの設定

##### インストーラサーバの前提
Linux OSでAWS CLIが導入されていること。

##### AWS CLIの設定
ミラーサーバに導入されているAWS CLIのプロファイルを、作成したOpenshiftインストール用IAMユーザに変更する。OpenShiftインストール作業は、作成したIAMユーザで行われるため、作成IAMユーザでAWS CLIが実行されるようにする必要がある。

##### インストール作業用ディレクトリの作成
インストール作業を行うディレクトリを作成する。
```
$  mkdir <installation_directory>
```

##### クラスタノードのSSHアクセス用キーペアの生成
ノードへのSSHアクセスを認証するために使用されるキーペアを生成する。
キーは各ノード~/.ssh/authorized_keysのcoreユーザーのリストに追加され、パスワードなしの認証が可能となる。

- 認証用の鍵を生成する
```
$ ssh-keygen -t ed25519 -N '' -f <パス>/<ファイル名> 
```
- 公開鍵が表示できることを確認する
```
$ cat <パス>/<ファイル>.pub
```
- 秘密鍵IDをローカルユーザーのSSHエージェントに追加する
```
$  eval "$(ssh-agent -s)"
```
- 秘密鍵をssh-agentに追加する
```
$  ssh-add <パス>/<ファイル名>
```

### 4：OpenShiftインストーラの入手
1. [OpenShiftインストーラダウンロードページ](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.9/html/installing/index)にアクセスする
1. インターネットタイプのページに移動し、オペレーティングシステムのインストールプログラムをダウンロードする
1. ダウンロードしたファイルをインストール実行サーバに保存し、インストール作業用ディレクトリに解凍する
```
$  tar -xvf openshift-install-linux.tar.gz -C <installation_directory>
```

### 5：Pull Secretのダウンロード
1. [OpenShiftインストーラダウンロードページ](https://access.redhat.com/documentation/ja-jp/openshift_container_platform/4.9/html/installing/index)にアクセスする
1. Red Hat OpenShift Cluster Manager サイトの 「Pull Secret」ページから、インストールプルシークレットをダウンロードする
1. ダウンロードしたファイルをインストール実行サーバのインストール作業用ディレクトリに保存する

### 6：インストール設定ファイルの作成
内部ネットワークからのみアクセスできるプライベートクラスターをデプロイする場合、インストール設定ファイル（install-config.yaml）を手動で作成する必要がある。

- 以下のような内容のinstall-config.yamlファイルを作成して、インストール作業用ディレクトリに保存する
```yaml:install-config.yaml
apiVersion: v1
baseDomain: <basedomain>　※_(アンダースコア)は使用できないことに留意
proxy:
  httpProxy: <プロキシの情報>
  httpsProxy: <プロキシの情報>
  noProxy: <basedomain>,.apps.<clsutername>.<basedomain> ※必要に応じてさらに除外したいURLを追加
controlPlane:   
  hyperthreading: Enabled 
  name: master
  platform:
    aws:
      zones:
      - ap-northeast-1a
      type: m5.xlarge　※インスタンスタイプは変更しても良い
  replicas: 3
compute: 
- hyperthreading: Enabled 
  name: worker
  platform:
    aws:
      zones:
      - ap-northeast-1a
      type: m5.2xlarge　※インスタンスタイプは変更しても良い
  replicas: 3　　※最低2以上、推奨3以上
metadata:
  name: <clsutername>　※_(アンダースコア)は使用できないことに留意
networking:
  clusterNetwork:
  - cidr: 10.128.0.0/14
    hostPrefix: 23
  machineNetwork:
  - cidr: <VPC内ネットワークCIDRを指定>
  networkType: OpenShiftSDN
  serviceNetwork:
  - 172.30.0.0/16
platform:
  aws:
    region: ap-northeast-1 
    amiID: ami-0ba4e1ecb12d04732　※Openshift4.9内でバージョンを固定したい場合指定。指定しない場合最新
    subnets: 
    - <subnet-id>　※インストールする対象サブネットIDを指定
fips: false 
publish: Internal
sshKey: '<作成したsshkey>' 
pullSecret: '<ダウンロードしたプルシークレット>'
```
なお、noProxyの.apps.\<clsutername>.\<basedomain>は、以下ナレッジに基づいて記載している。
[MSG: OAuthRouteCheckEndpointAccessibleControllerDegraded and RouteHealthDegraded with Service Unavailable on OCPv4](https://access.redhat.com/solutions/5895401)

### 7：OpenShiftインストーラの実行
カレントディレクトリをOpenShiftインストーラが配置されているディレクトリに切り替え、インストールを実施する。
※インストールを開始するとinstall-config.yamlは無くなるため、必要に応じてバックアップしておくこと。
```
$  ./openshift-install create cluster --dir <installation_directory> --log-level=debug
※--log-levelは、info、warn、debug、errorがある。
```
およそ、30分から45分程度でクラスターのインストールが完了する。
以下のようなメッセージが出力されていることを確認する。
```
INFO Install complete!
INFO To access the cluster as the system:admin user when using 'oc', run 'export KUBECONFIG=/home/myuser/install_dir/auth/kubeconfig'
INFO Access the OpenShift web-console here: https://console-openshift-console.apps.mycluster.example.com
INFO Login to the console with user: "kubeadmin", and password: "xxxxx-xxxxx-xxxxx-xxxxx"
INFO Time elapsed: 36m22s
```

上記メッセージに記載されているURLにアクセスし、ログインできるところまで確認したらインストールは完了となる。

# おわりに
Openshift Container Platform 4.9のインストール方法の中でも、制約事項が多い環境へのインストール手順を自分用にまとめた。
本インストール方法は、インストーラ実行時にトライアンドエラーとなる場面が多くなりがち（元々のVPC設定が要因でエラーとなることが多い）であった。そのため、今後同様のインストールが必要になった際に、VPC設定要因かOpenShift設定要因か切り分けを行いやすくするために本手順を役立てたい。