Red Hat OKD4 on AWS を使って見た

OKD4 が 2020年7月にGAとなった。ドキュメントを読むかぎり、Minishiftとは大きく異なり、ハイブリッドクラウドを意識した内容となっているので、実際に動かしてみることにした。

OKD4 は、The Origin Community Distribution of Kubernetes の略とされる(なんか順番違うけど)。OpenShift v4 の大部分の上流となっているオープンソースプロジェクト Origin から配布される。これは Apache License, Version 2.0. で配布されるオープンソースである。

## ダウンロード

パソコンに、ocコマンドがインストールされていれば、以下のコマンドでダウンロードすることができる。

~~~
$ oc adm release extract --tools quay.io/openshift/okd:4.5.0-0.okd-2020-07-14-153706-ga
~~~

バイナリをブラウザでダウンロードする場合は、https://github.com/openshift/okd/releases から入手できる。


## インストールの実行

OKD4のインストールは、自身のパソコンにインストールするのではなく、Terraform を利用して、AWS, Azure, GCP, RHV, vSphere, OpenStack、そして、ベアメタルなどにインストールする。 今回はAWSを利用して検証した。 

先にダウンロードしたファイルを展開すると、`openshift-install`コマンドが出てくるので、`/usr/local/bin` など配置して、シェルから利用できるようにする。


## AWSの事前準備

以下の条件を満たす必要がある。特にドメイン名を取得する必要がるので、最安レベルでも $9.00 程度の費用が発生する。

* AWSにアカウントを持っておりログイン可能であること。
* Route 53 パブリックでアクセス可能なドメインを持っていること。
* AWSのCLIコマンド aws がセットアップされていること。
* VPC設定があり、インターネットGW、サブネットなど、必要な内容が設定されていること。


## インストールコマンドの実行

上記の条件が整っていないと、次のコマンドが動作しない。それから、インストールを開始してから完了するまでに、およそ40分を要したことから、時間的に余裕がある時に実施した方が良い。対話式で必要な項目を要求するので、順番に従ってインストールする。 質問の中で `Pull Secret`の入力を要求するところには、`{"auths":{"fake":{"auth": "bar"}}}`をインプットすれば良い。これで待っているだけで、マスターノードx3、ワーカーノード x3 のクラスタが出来上がる。

~~~console:
$ openshift-install create cluster
? Platform aws
INFO Credentials loaded from the "default" profile in file "/Users/maho/.aws/credentials" 
? Region ap-northeast-1
? Base Domain takara-teck.uk
? Cluster Name okd4-1
? Pull Secret [? for help] **********************************
INFO Creating infrastructure resources...         
INFO API v1.18.3 up                               
INFO Waiting up to 40m0s for bootstrapping to complete... 
INFO Destroying the bootstrap resources...        
INFO Waiting up to 30m0s for the cluster at https://api.okd4-1.takara-teck.uk: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=/Users/maho/openshift/auth/kubeconfig' 
INFO Access the OpenShift web-console here: https://console-openshift-console.apps.okd4-1.takara-teck.uk 
INFO Login to the console with user: "kubeadmin", and password: "****-****-*****-*****" 
INFO Time elapsed: 38m2s     
~~~

完了時のAWSコンソール画面は次のようになっている。 m4.xlargeだと月額2万くらいなので、全部で10万円/月くらいの料金となる。
![ss-1-aws.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/d3f65304-cfc7-2842-f9f2-62235ad03683.png)


## OKD4 クラスタへのアクセス

インストールコマンドを実行したディレクトリに、認証情報がダウンロードされるので、環境変数 KUBECONFIG にパスを設定することで、ocコマンド、または、kubectl コマンドからクラスタへアクセスすることができる。 OCPではバージョンが少し遅れるが、OKDではかなり新しい。

~~~
$ export KUBECONFIG=`pwd`/auth/kubeconfig
$ oc get node
NAME                                              STATUS   ROLES    AGE   VERSION
ip-10-0-138-142.ap-northeast-1.compute.internal   Ready    worker   17m   v1.18.3
ip-10-0-145-133.ap-northeast-1.compute.internal   Ready    master   32m   v1.18.3
ip-10-0-161-71.ap-northeast-1.compute.internal    Ready    master   32m   v1.18.3
ip-10-0-170-100.ap-northeast-1.compute.internal   Ready    worker   18m   v1.18.3
ip-10-0-193-251.ap-northeast-1.compute.internal   Ready    worker   18m   v1.18.3
ip-10-0-194-197.ap-northeast-1.compute.internal   Ready    master   32m   v1.18.3
~~~

## ウェブコンソールへのアクセス

ウェブ画面へのアクセスも、インストールコマンドのアウトプットにURLとパスワードが表示されているので、その表示に従ってアクセスすれば良い。

![ss-2-okd-login.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/95b325ac-fe40-ad39-303c-5e1f0b9d842d.png)


ログイン後は、OCPv4と同じと思って良い。

![ss-3-okd-overview.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42829/a69f9b08-6293-f2fe-1397-bad20b5228a7.png)


## AWSとの連動程度を確認

高良執筆の本で利用しているサンプルのマニフェストを実行することで、AWSのロードバランサーと連携しているか確認してみる。

~~~
$ git clone https://github.com/takara9/codes_for_lessons
$ cd codes_for_lessons/step09
$ ls -al
total 72
drwxr-xr-x  11 maho  staff   352  7 29 17:13 .
drwxr-xr-x  17 maho  staff   544  7 29 17:13 ..
-rw-r--r--   1 maho  staff  2593  7 29 17:13 README.md
-rw-r--r--   1 maho  staff   423  7 29 17:13 deploy.yml
-rw-r--r--   1 maho  staff   112  7 29 17:13 svc-ext-dns.yml
-rw-r--r--   1 maho  staff   120  7 29 17:13 svc-ext.yml
-rw-r--r--   1 maho  staff   196  7 29 17:13 svc-headless.yml
-rw-r--r--   1 maho  staff   175  7 29 17:13 svc-lb.yml
-rw-r--r--   1 maho  staff   150  7 29 17:13 svc-np.yml
-rw-r--r--   1 maho  staff   158  7 29 17:13 svc-sa.yml
-rw-r--r--   1 maho  staff   244  7 29 17:13 svc.yml
~~~

Nginxのポッドをデプロイしたあと、type=LoadBalancer のサービスをデプロイする。このLoadBalancerはクラウドサービスのロードバランサーのデプロイをリクエストする。

以下の通り、結果は、ELBがデプロイされ、DNS名でアクセスできるようになった。

~~~
maho:step09 maho$ oc apply -f deploy.yml 
deployment.apps/web-deploy created
maho:step09 maho$ oc apply -f svc-lb.yml 
service/web-service-lb created
maho:step09 maho$ oc get svc
NAME             TYPE           CLUSTER-IP     EXTERNAL-IP                                                                    PORT(S)        AGE
kubernetes       ClusterIP      172.30.0.1     <none>                                                                         443/TCP        66m
openshift        ExternalName   <none>         kubernetes.default.svc.cluster.local                                           <none>         51m
web-service-lb   LoadBalancer   172.30.243.5   a97b7ba2627d64bfcaca4880ed09b3e9-1916899538.ap-northeast-1.elb.amazonaws.com   80:30941/TCP   6s
~~~

DNSへ追加されたロードバランサーの情報が安定したところで、curlコマンドでアクセスを試みる。問題なくアクセスできた。

~~~
maho:step09 maho$ curl http://a97b7ba2627d64bfcaca4880ed09b3e9-1916899538.ap-northeast-1.elb.amazonaws.com
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<以下省略>
~~~

## 永続ボリュームの利用

PVCをデプロイしてみたが、権限が不足しているためか、Pending状態から先へ進むことがなかった。 ストレージクラスにはAWS EBS用のプロビジョナーが組み込まれているが、問題解決は料金がかかるので見送る。

~~~
$ oc get pvc
NAME       STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc-1   Pending                                      gp2            78m

$ oc get sc
NAME            PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
gp2 (default)   kubernetes.io/aws-ebs   Delete          WaitForFirstConsumer   true                   118m
~~~

## クリーンナップ

次のコマンドで、EC2インスタンスを消去できる。

~~~
$ openshift-install destroy cluster
INFO Credentials loaded from the "default" profile in file "/Users/maho/.aws/credentials" 
INFO Disassociated                                 instance=i-0c17651e19a37ab61 name=okd4-1-k446v-worker-profile role=okd4-1-k446v-worker-role
INFO Deleted                                       InstanceProfileName=okd4-1-k446v-worker-profile arn="arn:aws:iam::102321567306:instance-profile/okd4-1-k446v-worker-profile" instance=i-0c17651e19a37ab61
INFO Disassociated                                 instance=i-0926f0a10b0442c39 name=okd4-1-k446v-master-profile role=okd4-1-k446v-master-role
INFO Deleted                                       InstanceProfileName=okd4-1-k446v-master-profile arn="arn:aws:iam::102321567306:instance-profile/okd4-1-k446v-master-profile" instance=i-0926f0a10b0442c39
<以下省略>
~~~


## まとめ

OKD4 は Minishitの流れを組み、個人がパソコンを使って自己研鑽で利用できる環境と考えていたが、クラウドやオンプレミスの仮想環境で利用するものであり、デフォルト設定では月額10万程度必要な、本格的な構成が出来上がってしまう。

これは凄い! ユーザー企業で OCPv4 の予算を確保するための効果測定の検証であれば、OKD4を利用しても良いのではと思ってしまう。もちろん、OCP4とOKD4は全く同じソフトウェアではないので、あくまでも代用品である。

FAQには、シングルノードのクラスタを構築できるとあるので、次回に試してみたい。


## 参考資料
[1] OKD Latest Documentation, https://docs.okd.io/latest/installing/installing_aws/installing-aws-default.html
[2] https://github.com/openshift/okd/releases
[3] https://github.com/openshift/okd#getting-started