[Oracle Cloud] OKE クラスタを 既存VCN に Custom Create してみた

# はじめに

Oracle Cloud では、Kubernetes マネージドサービスの Oracle Container Engine for Kubernetes (略してOKE) が提供されています。OKE の構成方法は、大きく分けて2種類あります。

- Quick Create : VCN の含めた必要なコンポーネント一式を括作成。ネットワーク CIDR などは固定。変更できない。
- Custom Create : 既に構成されている VCN を使って、OKE を構成。柔軟なネットワーク構成が可能。



OKE を軽く試してみよう、という用途だと Quick Create は一瞬で作成が出来て便利です。一方、本番環境を考えると、既存の VCN に OKE を構成したい事があります。そういう時には、Custom Create が使えます。Custom Create を使うためには、VCN 側で事前に設定が必要です。

今回の記事では、Custom Create の時に、VCN 側で事前に必要な設定を紹介します。細かな設定が多く、かつ、ドキュメントの記載が文章だけなので、出来るだけわかりやすく紹介していきます。



# 既存VCN環境

OKE を追加する前の、一般的な Compute Instance が稼働している VCN 環境を作ります。Public Subnet 1個に、Private Subnet 1個の一般的な環境です。構成図では、こんな感じです。この段階では、OKEは全く関係ありません。

![1593438750042.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/55ba600f-8eb6-ec2f-3f30-a118b6547346.png)





# OKE 用 VCN 設定

既存 VCN に OKE を追加する時は、OKE 用の Subnet を 新規に2個作成するのがお勧めです。既存の Subnet 上に OKE を構成するのも出来ますが、Worker Node のスケール数 や Sercurity List の管理が複雑になります。キレイに管理対象を分割するために 新規にSubnet を 2個追加するのが良いです。

2個の Subnet は、Service LoadBalaner 用と、Worker Node 用です。構成図では、こんな感じです。

![1593441064791.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/6d9a37cc-d29f-4b76-67c7-19775c3e7b12.png)



OCI Console でみると、次のようになります。

- Load Balancer 用 : oke_lb_subnet1 : 10.0.1.0/24
- Worker Node 用: oke_wkr_subnet1 : 10.0.11.0/24

![1593440993557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/b2003787-a7e3-f9fb-02e6-9c20d071dfa8.png)



次に、OKE 用の 2個の Subnet に Route Tables をそれぞれ割り当てます。Route Table も新規で2個作成すると管理が楽なのでお勧めです。

- Load Balancer 用 : Internet と通信するので、Internet Gateway を追加
- Worker Node 用 : 内側から Internet へ通信する用途を考慮して、NAT Gateway、OCIR と通信するので Service Gateway を追加

![1593441476689.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/6c6f2398-f0fa-74d7-9584-a347cd445c1c.png)



OCI Console ではこんな感じです。Load Balancer 用 Route Table

![1593441686131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/aab12be3-a802-473a-2136-b95a2f82898a.png)



Worker Node 用 Route Table

![1593441727220.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/69b34b7c-b314-a026-6912-94a10412e05f.png)



次に、一番複雑な Security List を設定します。これも新規に 2個の Security List を作成するのが管理が楽でお勧めです。

構成図で表すとこんな感じです。注意点があり、構成図には書いていないですが、ステートレス or ステートフル 指定が性能を左右するポイントです。**ステートレスの方が性能は良いので、LB と Worker Node 間や、Worker Node 間の通信は全てステートレスにしています。**

適宜必要な場合は、SSH や ICMP や NodePort の範囲(30000-32767) を追加で指定するのも良いです。

![1593442307334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/08ee0998-bd38-2bdc-5767-51218f19ec31.png)



OCI Console ではこんな感じです。**ステートレスの有無を確認しましょう。**
Load Balancer 用 Ingress Security List。

![1593442517402.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/1ab94ed4-f06f-a1bf-75dc-6fefde3cfc1a.png)



Load Balancer 用 Egress Security List

![1593442535193.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/34f2c1d7-4c65-61e8-dda2-8ca11adb91c3.png)



Worker Node 用 Ingress Security List

![1593442560459.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/256bd363-a47c-4045-7e8d-bb798af66ba0.png)



Worker Node 用 Egress Security List

![1593442583399.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/88afcdc3-d12f-e226-c8fc-8378dd53f9ac.png)



# OKE 作成

ここまで設定すれば、あとは OKE を作るだけです。OKE の画面に移動して、Create Cluster を押します。

![1593399984732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/0dab371c-90a2-f953-a6d1-b86d7b82b885.png)



Custom Create を選び Launch

![1593400015886.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/ad15468a-dbc9-1bf4-5d3a-b5c121fc06bb.png)



パラメーターを適当に入れます。

![1593400089498.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/ffb0b65d-ebe7-415c-47f6-ceeef848a931.png)



Kubernetes Service LB Subnets は、忘れずに事前作成した `oke_lb_subnet1` を入れます。

![1593400155470.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/082b93b8-4746-2113-ba06-696e12943c4a.png)



Subnets は、忘れずに事前作成した `oke_wkr_subnet1` を入れます。

![1593400270913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/e96bc2a1-94f4-13b1-c670-9a5fa194174b.png)



内容を確認し Create

![1593400302511.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/a5bfb2a4-a00e-fc62-3989-4e4c4ff68e3d.png)



Close

![1593400320485.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/42effbc5-a106-28db-4c26-168aff5b7348.png)



OKE が Creating となります

![1593400344574.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/5218aa45-869a-3616-09e6-44754ab1c9c5.png)



Node Pool も作成中です

![1593400368480.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/e294ef02-8f81-04da-e0ba-0531ce84e0ea.png)



一定時間後、OKE Cluster が Active になります

![1593400651991.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/48cfcf08-384c-6e4b-0425-e08c589635d3.png)



NodePool の中の Node が作成されます。

![1593400698268.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/153f2aa5-b27c-226e-1ff5-44dae466f185.png)



一定時間後、Node が Ready となります。

![1593402061792.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/104247/8d6eed0f-bd2b-0f07-16d6-71b2f4a1960a.png)



# 動作確認

ここまでで、OKE クラスタの準備が完了しました。動作確認のために、適当に Deployment と Service LoadBalancer を作成します。

Deployment

```
$ kubectl apply -f https://raw.githubusercontent.com/Sugi275/oke-handson/master/deployment-cowweb.yaml
deployment.apps/cowweb created
```



Service LoadBalancer

```
$ kubectl apply -f https://raw.githubusercontent.com/Sugi275/oke-handson/master/service-cowweb.yaml
service/cowweb created
```



通信確認。牛が表れているので、正常に動作しています。

```
$ curl "http://158.101.70.40/cowsay/say?say=HOSTNAME"
 _________________________
< cowweb-7cb44c5768-dqvjc >
 -------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||
```



# 参考URL

https://docs.cloud.oracle.com/en-us/iaas/Content/ContEng/Concepts/contengnetworkconfig.htm