Kuber(minikube)でnode.js + PostgreSQLを使う


[この記事](https://qiita.com/zaburo/private/96ca9a1197f72dccfbe3)の続き。

## minikubeのインストール

Mac前提であれば基本以下で動きますが、詳細はこちらをどうぞ。

```bash
brew install minikube
```

```bash
minikube start
```

## 前準備

### DB 接続文字列の書き換え

node.js側のコードのDB接続文字列を構成に合わせて変更します。
接続先ホストはdbコンテナを公開するServiceの名前になります（コンテナ名とかは動的になるから）。

```js
// PostgreSQL connect info
const pool = new pg.Pool({
    user: "postgres",
    host: "my-db",
    database: "postgres",
    password: "postgres",
    port: 5432
});
```

>kubernetesのpod名にはアンダースコア使えないみたい。。。なので-に変更。


### ローカルイメージの取り込み

DockerでビルドしたローカルImageをminikubeで利用するためにはminikube側のリポジトリに取り込む必要があるみたいです。

>なお、Tagがついてないと(latestでは）取り込めないみたい。
>タグがついてない場合はdocker tag image_id image:tagでタグ付します。

```bash
minikube image load my_node:v1
minikube image load my_postgres:v1
```

## 動かしてみる

### PostgreSQLコンテナとサービスのデプロイ

PostgreSQLをデプロイ。内部からしかアクセスしないのでServiceのtypeはClusterIPにしてみました。

```bash
kubectl create deployment my-db --image=my_postgres:v1
kubectl expose deployment  my-db --type=ClusterIP --port=5432
```

:::note
上記のService名（my-db）がDBのhost名となります。
:::

### node.jsコンテナとサービスのデプロイ

外部に公開するのでSerivceのtypeはNodePort。本番だとLBだろうけど。

>Webなのでレプリカを増やしてみるのもありかも。

```bash
kubectl create deployment my-app --image=my_node:v1
kubectl expose deployment  my-app --type=NodePort --port=3000
```

### 動作確認

以下のコマンドでプロキシされたWebが起動する。

```bash
minikube service my-app
```

>期待通り動きました。

### 片付け

片付け。

```bash
kubectl delete deployment my-app
kubectl delete deployment my-db
kubectl delete service my-app
kubectl delete service my-db
```


## マニフェストファイルの生成と利用

ここではコマンドラインでkubernetesの設定を行いましたが、実運用ではマニュフェストファイル（各種yaml）を利用することが一般的です。０ベースで記述することもできますが、コマンドラインを--dry-runすることで、検証および雛形の出力ができるのでやってみます。

### Deployment雛形の生成

#### コンポーネント生成コマンド（実コマンド）

```bash
kubectl create deployment my-db --image=my_postgres:v1
```

#### 雛形生成コマンド

```bash
kubectl create deployment --image=my_postgres my-db --dry-run=client -o yaml > db-deployment.yml
```


#### 生成ファイル

```yml
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: my-db
  name: my-db
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-db
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: my-db
    spec:
      containers:
      - image: my_postgres
        name: my-postgres-4rrbr
        resources: {}
status: {}
```


### Service雛形の生成

#### コンポーネント生成コマンド（実コマンド）

```bash
kubectl expose deployment  my-db --type=ClusterIP --port=5432
```

#### 雛形生成コマンド

```bash
kubectl create service clusterip my-db --tcp=5432:5432 --dry-run=client -o yaml > db-service.yml
```


#### 生成ファイル

```yml
apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: my-db
  name: my-db
spec:
  ports:
  - name: 5432-5432
    port: 5432
    protocol: TCP
    targetPort: 5432
  selector:
    app: my-db
  type: ClusterIP
status:
  loadBalancer: {}
```


### 各種ファイルの利用

```bash
kubectl apply -f [yaml]
```

>kubectl create -f [yaml]でもいい。微妙に動作が違うので注意。詳しくは[こちら](https://qiita.com/tkusumi/items/0bf5417c865ef716b221)を参考に。

## 参考

* https://info.drobe.co.jp/blog/engineering/minikube-driver
* https://miyazi888.hatenablog.com/entry/2022/05/22/194940
* https://amateur-engineer-blog.com/kubectl-create-manifest/
* https://goodbyegangster.hatenablog.com/entry/2021/01/20/205735
* https://qiita.com/sourjp/items/f0c8c8b4a2a494a80908
* https://qiita.com/tkusumi/items/0bf5417c865ef716b221