RHEL8でkongを動かしてみた

# はじめに
とある事情より、`RHEL8`上で`kong`を構築することになった。
RHEL8では`Docker`は公式なサポートはないらしく、`podman`を使わねばならないらしく、そこそこハマったのでメモっておく。

podmanの考え方はここがわかりやすかった。
https://www.designet.co.jp/faq/term/?id=UG9k

kongのインストール手順はここを見た。
https://docs.konghq.com/install/docker/

## TL;DR
自分が実践して、これがベストかな？と思ったやり方はこれ。

* podをAP用、DB用作る。
    * DBはAPから呼ばれるため、固定IPを付与。APから呼ばれるためポートをexposeしておく。
    * APは特にIP付与が不要なため、つけない。ただし、ポートはexposeしておく。
* 各podでDB、APを起動する。これはマニュアルどおり。

## podmanとは
RHELのマニュアルを色々読んだり、ガチャガチャ触ってみたところの感想。薄い感想だけど、、、

* dockerの置き換え
* とはいえ、随所に違いはある。特にネットワークまわりの考え方の違いに焦る。
* kubernetesみたいにpodを作ることができる。ただ、凝ったことはできないようだ。
* docker-composeが使えない。(サードパーティではあるようだが)
> これが困った、、、dockerだとdocker-composeあってこんな困らなくてよかったのに。https://qiita.com/kotauchisunsun/items/ce9e476cb52b8eeffc88

このあたりを参考にした。

* https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html-single/building_running_and_managing_containers/index
* https://qiita.com/t-kigi/items/a14dfd3c2c1620f54c43

## kongとは
AWSでいう、API Gateway。とはいえ、AWSのほうが断然使いやすい印象だが、、、オンプレだし、便利なのかな。
これはまだ全然触ってないので、よくわかってない。
エクセルソフトさんが日本語マニュアル出してくれるのでもっと熟読しなきゃ。

* https://www.xlsoft.com/jp/products/kong/docs.html

内部的には、nginxとcassandra or postgresで動くみたい。普通のWebAP/DB構成か。

使い方はここ。
https://www.aizulab.com/blog/install-kong/

## 悩んだところ

APとDBを別podにするかまとめるか、悩んだ。
ただ、podをまとめると、DB->APの順に起動する必要があるのだが、
APの起動がDBよりも早くエラーになっちゃう。依存関係どうやってつければいいのかわからず、
別podにした。

正直、kubernetesみたいなことできないので、podにするメリットがよくわからんかった。
サイドカーとかするなら役立つのかな。

## 実際の手順

### pod作成

DBのpodには固定IP振っておく。ネットワークはデフォルトでよさそう。

```shell
$ podman pod create --name kong-ap-pod -p 8000:8000 -p 8443:8443 -p 8001:8001 -p 8444:8444 -p 1337:1337
$ podman pod create --name kong-db-pod -p 5432:5432  --ip 10.88.0.30
$ podman pod ps
# 確認結果
POD ID        NAME         STATUS   CREATED        INFRA ID      # OF CONTAINERS
6cf2f94d97e9  kong-db-pod  Created  4 seconds ago  8ee7a9e55579  1
828c47a39971  kong-ap-pod  Created  9 seconds ago  e05f0103600c  1
```

### DB起動
```shell
$ podman run -d --name kong-database \
   -e "POSTGRES_USER=kong" \
   -e "POSTGRES_DB=kong" \
   -e "POSTGRES_PASSWORD=kong" \
   --pod kong-db-pod \
   postgres:9.6
```

### bootstrap
こいつは初回のみ実行なので、podには入れない。


```shell
$ podman run \
   -e "KONG_DATABASE=postgres" \
   -e "KONG_PG_HOST=kong-database" \
   -e "KONG_PG_USER=kong" \
   -e "KONG_PG_PASSWORD=kong" \
   -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
   --add-host kong-database:10.88.0.30 \
   kong:latest kong migrations bootstrap
```

### AP起動
`--add-host`でDBサーバのIPを指定してあげないと、別podなので名前解決できない。

```shell
$ podman run -d --name kong-ap \
   -e "KONG_DATABASE=postgres" \
   -e "KONG_PG_HOST=kong-database" \
   -e "KONG_PG_USER=kong" \
   -e "KONG_PG_PASSWORD=kong" \
   -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
   -e "KONG_PROXY_ACCESS_LOG=/dev/stdout" \
   -e "KONG_ADMIN_ACCESS_LOG=/dev/stdout" \
   -e "KONG_PROXY_ERROR_LOG=/dev/stderr" \
   -e "KONG_ADMIN_ERROR_LOG=/dev/stderr" \
   -e "KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl" \
   --add-host kong-database:10.88.0.30 \
   --pod kong-ap-pod \
   kong:latest
```

### 管理(GUI)konga起動
商用版じゃないとGUIがないようなので、サードパーティのGUI機能を入れておく。
ただし、この`konga`はcassandraでは動かないので、`postgres`一択だった。

```shell
$ podman run -d --name konga \
   -e "DB_ADAPTER=postgres" \
   -e "DB_HOST=kong-database" \
   -e "DB_USER=kong" \
   -e "DB_PASSWORD=kong" \
   --add-host kong-database:10.88.0.30 \
   --pod kong-ap-pod  pantsel/konga
```

### 動作確認
これでリターンがあればOKらしい。
https://docs.konghq.com/install/docker/

```shell
$ curl http://localhost:8001/
```

### yaml
podmanで作ったpodからyamlが作れた。これは便利。

```shell
$ podman generate kube pod名
```