OKE(Oracle Container Engine for Kubernetes) を Rancher で監視したい

# OKE(Oracle Container Engine for Kubernetes) を Rancher で管理したいです

この記事は ウィルゲート [Advent Calendar 2019](https://qiita.com/advent-calendar/2019/willgate) の14日目の記事です。

Rancher から華麗に Oracle Cloud を操る記事です。

## 始めに

~~**【注意！】 この手順通りやった結果、エラーになる事象にあたってます。
この通りにやっても上手くできません。**~~

【追記】エラー解消しました

Rancher はオンプレ、クラウド上に作成した Kubernetes だけではなく、各クラウドサービスが展開している [Amazon EKS](https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/what-is-eks.html) や [GKE](https://cloud.google.com/kubernetes-engine/?hl=ja) といったマネージド Kubernetes 環境を管理できる機能があります。([公式](https://rancher.com/products/rancher/multi-cluster-management/))


内部的には Driver と呼ばれるプラグイン機能を使って、各クラウドの API を叩いて Kubernetes 環境を操作するようなイメージです。

Oracle Cloud には、OKE(Oracle Container Engine for Kubernetes) というマネージドな Kubernetes サービスがあります。
今回はその環境を Rancher から管理できるようにし、Rancher からクラスタを作成してみます。

Driver には [Kontainer Engine Oracle Container Engine Driver](https://github.com/rancher-plugins/kontainer-engine-driver-oke) を使います。

**ただし今回構築する構成は、Oracle 社、 Rancher Lab 社が公式サポートしていない構成です。**


以下のバージョンで挑戦しました。

* Rancher:v2.3.3
* Kontainer Engine Oracle Container Engine Driver:1.0.0, 1.0.1 

~~重ねての説明になりますが、この記事通りにやっても上手く行かない可能性が高いです。~~

【追記】Driver の作者の方が修正してくれました

## Oracle Cloud での作業

コンパネにログインして、『開発者サービス』→『コンテナ・クラスタ』と進みます。

![](https://i.imgur.com/gVYYxHT.png)

『クラスタの作成』をクリック！

![](https://i.imgur.com/vjySXZU.png)

> RelatedResourceNotAuthorizedOrNotFound: Unable to retrieve required tenancy details - please ensure OKE service policy is set up correctly.

のメッセージが出て作成できません。

![](https://i.imgur.com/chzj5db.png)


そうです。準備が必要なのです。

ポリシーとコンパートメントを作成します。

コンパートメントとは Oracle Cloud の概念で論理的な区画です。

まずアカウントを作成すると、『テナント』が割り当てられます。それを論理的に区切るのが『コンパートメント』です。

AWS にはない概念で、VM インスタンスやボリュームなど各種リソースをその単位で分割管理できます。 

今回は準備として
 
* OKE が テナント内のリソースを操作できるポリシーの作成
* OKE 専用のコンパートメント（区画）の作成


をします。

OKE 専用のコンパートメント作成は必須ではありませんが、管理上のメリットがあるので今回は作成します。


### ポリシーの作成

コンソールから　『アイデンティティ』→『ポリシー』と進みます。


![](https://i.imgur.com/CDk8CmS.png)

『ポリシーの作成』を押すと以下のよう画面がてくるので設定します

![](https://i.imgur.com/w1cYGS4.png)


* 名前：oke-test
* 説明：Allow service OKE to manage all-resources in tenancy
* ポリシーのバージョニング：ポリシーを最新のバージョンに維持 (デフォルトのまま)
* ステートメント：allow service OKE to manage all-resources in tenancy

最後のステートメントでポリシーの定義をしています。コメントじゃなくて構文に従っています。

基本的な構文は以下の通りです。

`Allow <subject> to <verb> <resource-type> in <location> where <conditions>`

詳細な情報は[公式ドキュメント](https://docs.oracle.com/cd/E97706_01/Content/Identity/Concepts/policysyntax.htm)をご覧ください。

### コンパートメントの作成

『アイデンティティ』→『コンパートメント』と進みます

![](https://i.imgur.com/FHKFoTB.png)

以下のように設定して『コンパートメントの作成』をクリックすると作成できます。

![](https://i.imgur.com/IwdW4CF.png)

## Rancher 側の作業

以下の作業は Rancher 側から行います。

今回は AWS EC2 に作ったインスタンスに Docker を入れた状態の Ubuntu サーバを使います。

構築方法に関しては[拙稿](https://qiita.com/ryota_hnk/items/d866b3bd981572d407e3#aws-%E3%81%AB-rancher-%E3%82%B5%E3%83%BC%E3%83%90%E6%A7%8B%E7%AF%89)をご覧ください。


### API Key の作成


まずは鍵を作成します。

```bash
$ mkdir .oci
$ openssl genrsa -out ~/.oci/oci_api_key.pem 2048
$ chmod go-rwx ~/.oci/oci_api_key.pem
$ openssl rsa -pubout -in ~/.oci/oci_api_key.pem -out ~/.oci/oci_api_key_public.pem
```

作成した『~/.oci/oci_api_key_public.pem』の中身をクリップボードにコピーしておいてください。


### API Key の登録

この作業は Oracle Cloud のコンパネから行います。

画面右上からプロファイルの設定画面に移動します。

![](https://i.imgur.com/DVYso30.png)

『公開キーの追加』をクリックします。

![](https://i.imgur.com/PoDSXyI.png)

先ほど作成した『~/.oci/oci_api_key_public.pem』の中身をコピペして『追加』をクリックします。


![](https://i.imgur.com/ViMJyqG.png)


## OKE Cluster Driver のインストール

次はドライバを Rancher サーバにインストールします。

まずは Rancher サーバにログインし、『Tools』→『Drivers』と進みます


![](https://i.imgur.com/fGnVKjS.png)

『Add Cluster Driver』をクリックします。

![](https://i.imgur.com/s3nhE6g.png)

設定画面で以下のように設定し、『Create』をクリックします。

URLは執筆時点での最新です。リポジトリで最新の情報を確認してください。


* Download URL:https://github.com/rancher-plugins/kontainer-engine-driver-oke/releases/download/v1.0.1/kontainer-engine-driver-oke-linux
* Custom UI URL:https://cdn.jsdelivr.net/gh/rancher-plugins/ui-cluster-driver-oke@v1.0.1-5/dist/component.js
* Whitelist Domains: 
   * ``*.github.com``
   * ``*.jsdelivr.net``
![](https://i.imgur.com/q7Rpwwn.png)

ドライバ一覧画面で、『Active』になればOKです。

![](https://i.imgur.com/jccd8n9.png)

## Rancher から OKE クラスタを作成

『Cluster』→『Add Cluster』と進みます。

![](https://i.imgur.com/4cl1TRj.png)


クラスタ作成画面の一覧の右下の 『Oke』の文字が見えます！押しましょう！

![](https://i.imgur.com/YP1ig7b.png)

Oke の設定画面に切り替わります。（ここで切り替わら無い事象になり、 [issue](https://github.com/rancher-plugins/kontainer-engine-driver-oke/issues/5) を挙げて直してもらいました。）

まずは以下の項目に設定をします。

* Cluster Name:クラスターの名前（任意）

OCID や fingerprint はコンソールから確認します。
OCIDは以下のような書式の値です。
`ocid1.tenancy.oc1..aaaaaaaabbbbbbbbbb888ccccccccccddddddddddeeeeeeeeefffffffff` 

* Tenancy OCID:プロファイル→テナンシ画面で確認
* Compartment OCID:アイデンティティ→コンパートメント画面で確認
* Region:Tokyo
* User OCID:ユーザーの詳細画面で確認
* User fingerprint:ユーザーの詳細画面で確認

* User Private Key:Rancher サーバで作成した `oci_api_key.pem` の中身を張る

![](https://i.imgur.com/b8QoiUE.png)

ここまで設定したら『Authenticate & Configure Cluster』をクリックしてクラスタの設定をします。

以下の値を設定します。『Nodes Per Subnet Count』は Worker 用のサブネット毎に作成する Node の数です。

* Kubernetes Version:v1.13.5(デフォ)
* Nodes Per Subnet Count:1（デフォ）

設定したら『Configure Virtual Cloud Network』をクリックします。

![](https://i.imgur.com/7k0nAst.png)



ネットワーク設定画面では、

* Quick Create
* Existing
* Custom Create 

から選択できます。今回は手早く新規作成出来る『Quick Create』を選択し、『Node Instance Configuration』をクリックします。

![](https://i.imgur.com/GNXIEQ5.png)

ここでは Node として使うインスタンスと、 OS を設定します。
Always Free に含まれていないインスタンスもあるので注意して下さい。

今回は以下のように設定します。

* Instance Shape:VM.Standard.E2.1.Micro
* Operating System:Oracle-Linux-7.6
* SSH public key for nodes:Node に SSH 接続したい場合は公開鍵を貼って下さい

あとは『Create』をクリックすればOKです。

![](https://i.imgur.com/IUTlR53.png)


## ここでエラー

画面がクラスタ一覧画面に切り替わってしばらくするとこんなエラーが

![](https://i.imgur.com/sVXPBQm.png)

`Rpc error: code = Unavailable desc = transport is closing`

通信が切れてる？

Ranhcer コンテナのログを確認してみる。

```
2019/12/12 14:13:58 [ERROR] Cluster c-tl5ff previously failed to create
time="2019-12-12T14:13:58Z" level=info msg="Creating a new VCN and required network resources for OKE cluster c-tl5ff"
2019/12/12 14:14:04 there are less availability domains than required subnets
2019/12/12 14:14:04 [INFO] kontainerdriver kd-bbqmf stopped
2019/12/12 14:14:04 [ERROR] ClusterController c-tl5ff [cluster-provisioner-controller] failed with : rpc error: code = Unavailable desc = transport is closing       
time="2019-12-12T14:14:04Z" level=info msg="RPC GrpcServer listening on address 127.0.0.1:35779"
```

NWの作成でエラー？通信が切れてNWを作れなかったのかとコンソールから確認してみると

![](https://i.imgur.com/MbQdxwe.png)

なんか出来てるっぽい。APIは叩けてるみたいだ。

どっちに原因があるのかわからない…聞こう…

Rancher の Slack で聞いてみる。

![](https://i.imgur.com/2tXSFCq.png)

![](https://i.imgur.com/lnI81cp.png)

Rancher のログに出ていた『there are less availability domains than required subnets』あたりが怪しいと思ってます。

Tokyoリージョンは AD が1つしかない（[公式資料](https://docs.oracle.com/cd/E97706_01/Content/General/Concepts/regions.htm)）ので、それが関係してるような気がしてます。

絶賛調査中！

## 感想

というわけで大変申し訳ありませんが、私の力量では当初の野望を成就させる事が出来ませんでした。

もちろん今後も調査は続けますし、解決したら皆さんにご報告します。

これを見た皆さんからの

* ここを見たら原因分かるかもよ？
* 私はこの構成で成功しました

などの情報は正座で受け付けております。

明日のアドベントカレンダーは [@N06AR](https://qiita.com/N06AR) の「SwiftでSlackBotを作った話」です。乞うご期待！

## 参考にした資料

有難うございました。そしてすまぬ

* [OKEでKubernetesを始めてみよう](https://oracle-japan.github.io/paasdocs/documents/containers/handson/getting-started)
* [OKE(Oracle Container Engine for Kubernetes)の始め方](https://qiita.com/hhiroshell/items/5e812a4cccbdbb16a3fb)
* [OKE Clusters from Rancher 2.0](https://medium.com/swlh/oke-clusters-from-rancher-2-0-409131ad1293)
* [Policy Configuration for Cluster Creation and Deployment](https://docs.cloud.oracle.com/iaas/Content/ContEng/Concepts/contengpolicyconfig.htm#PolicyPrerequisitesService)
* [リージョンと可用性ドメイン](https://docs.oracle.com/cd/E97706_01/Content/General/Concepts/regions.htm)
* [VCNおよびサブネット](https://docs.oracle.com/cd/E97706_01/Content/Network/Tasks/managingVCNs.htm#overview)

## 【追記】Driver を直してくれた【エラー解消】

Rancher Slack に進展がありました。

![2019-12-15_09h06_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/dc111fb8-8d0d-eab9-8c49-a70f4fce014c.png)

作者の方が現れて、『お前がいうように、『there are less availability domains than required subnets』あたりが怪しいから、issue立てておいたわ』とのこと。

で、『修正したブランチをリリースしたから試してみてくれ』と言われました。

修正版は以下です

[https://github.com/rancher-plugins/kontainer-engine-driver-oke/releases/tag/v1.1.1-wip](https://github.com/rancher-plugins/kontainer-engine-driver-oke/releases/tag/v1.1.1-wip)

Driver の設定画面のURL を変えておきます。それ以外の作成手順は先ほど紹介したものと同じです。

* Download URL:https://github.com/rancher-plugins/kontainer-engine-driver-oke/releases/download/v1.1.1-wip/kontainer-engine-driver-oke-linux
* Custom UI URL:https://cdn.jsdelivr.net/gh/rancher-plugins/ui-cluster-driver-oke@v1.0.1-5/dist/component.js
* Whitelist Domains: 
   * ``*.github.com``
   * ``*.jsdelivr.net``

![2019-12-15_09h14_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/55047d92-ab37-c737-e9f5-b5dd82109974.png)

これで無事に Cluster を作成する事が出来ました！バンザイ！

![2019-12-14_11h53_50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/8d151a78-5a49-7919-57b7-8fe70111af2f.png)

どういう修正をしてくれたかというと、[issue](https://github.com/rancher-plugins/kontainer-engine-driver-oke/issues/6) 見てもらえるとわかるんですが、作成するサブネットをAD（Availability Domain）固有から、リージョン固有のサブネットに変更したようです。


### 用語の解説

ちょっと解説しますと、Oracle Cloud の概念として、まず地理的な領域として『リージョン』があります。（東京とか、米国西部(フェニックス)とか）

で、リージョンの中にデータセンターがある訳ですが、1つ以上のデータセンターを『AD（Availability Domain）』と呼びます。
ADはそれぞれ独立していて、AD間は低遅延かつ広帯域なNWで接続されていて、暗号化通信を行っています。

そして、その中に作成するネットワークに目を移すと、まず『仮想クラウド・ネットワーク(VCN)』という大きなプライベートネットワークがあり、その中を『サブネット』区切ります。

（以下の図は[公式資料](https://docs.oracle.com/cd/E97706_01/Content/Network/Tasks/managingVCNs.htm#overview)から引用しました。）

![network_regional_subnet.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/756f71d4-406f-d3d5-5b8d-f13dec126613.png)

この図を見てもらえるとわかるように、サブネットには、ADに固定されているサブネットと、ADを跨いでいるサブネットがあります。前者を『AD固有サブネット』、後者を『リージョナルサブネット』と言います。

コンソールのサブネット作成画面にもその違いが説明されています。

![2019-12-15_09h54_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151399/28f6b829-ef58-9a84-a838-b6fee893c98a.png)

話をDriver に戻すと、最初の不具合は、TokyoリージョンはADが1つしかないのに、AD固有のサブネットを複数作ろうとしていたのが原因でした。

それをリージョナルサブネットを作るようにしてくれたのが修正内容です。

おかげさまで遂にOKEもRancherで扱えるようになりました。皆さんも課金には気を付けてより良いRancher/OKE/Kubernetes ライフをお楽しみください。

お読み頂き有難うございました。