CockroachDBでのデータベースとユーザーの作成

では９日目やっと三分の一ってとこですね。
今日は昨日やり残したデータベースとユーザーの作成を行います。

## Jobの定義

クラスターのセットアップと同様に、一回だけ実行するJobリソースとして定義します。

```yaml:app-db-init.yaml
apiVersion: batch/v1
kind: Job
metadata:
  name: qiita-advent-calendar-2019
  namespace: qiita
  labels:
    app: qiita-advent-calendar-2019-db-init
spec:
  template:
    spec:
      containers:
      - name: db-init
        image: cockroachdb/cockroach:v2.1.4
        imagePullPolicy: IfNotPresent
        command:
        - "/bin/bash"
        - "/opt/scripts/user-schema-bootstrap.sh"
        env:
        - name: COCKROACH_HOST
          value: "cockroachdb-proxy"
        - name: COCKROACH_PORT
          value: "26257"
        - name: DB_NAME
          value: "qiita_advent_calendar_2019_db"
        - name: DB_USER
          value: "qiita_advent_calendar_2019"
        volumeMounts:
        - name: cockroachdb-scripts
          mountPath: /opt/scripts
          readOnly: true
      restartPolicy: OnFailure
      volumes:
      - name: cockroachdb-scripts
        configMap:
          name: cockroachdb-scripts
```

CockroachDBのコンテナ上でスクリプトを実行するだけのシンプルなJobです。
そして走らせるスクリプト本体は以下のようにConfigMapを使って渡します。

```yaml:cockroach-scripts.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: cockroachdb-scripts
  namespace: qiita
data:
  user-schema-bootstrap.sh: |
    #!/bin/bash
    set -e

    if [ -z "$DB_USER" ]; then
        echo "DB_USER envvar is not set"
        exit 1
    fi

    if [ -z "$DB_NAME" ]; then
        echo "DB_NAME envvar not set"
        exit 1
    fi

    SQL_CMD="/cockroach/cockroach -d system sql" > /dev/null

    $SQL_CMD << EOF
      CREATE USER IF NOT EXISTS $DB_USER;
      CREATE DATABASE IF NOT EXISTS $DB_NAME;
      GRANT ALL ON DATABASE $DB_NAME TO $DB_USER;
    EOF
```

## Jobの実行

では、ConfigMapを作成してJobを実行してみましょう。

```sh
$ kubectl apply -f kubernetes/cockroach-scripts.yaml
configmap/cockroachdb-scripts created

$ kubectl -n qiita get configmaps
NAME                  DATA   AGE
cockroachdb-scripts   1      9s
```

```sh
$ kubectl apply -f kubernetes/app-db-init.yaml
job.batch/qiita-advent-calendar-2019 created

$ kubectl -n qiita get jobs.batch qiita-advent-calendar-2019
NAME                         COMPLETIONS   DURATION   AGE
qiita-advent-calendar-2019   1/1           6s         55s

$ kubectl -n qiita get pods qiita-advent-calendar-2019-n7hq7
NAME                               READY   STATUS      RESTARTS   AGE
qiita-advent-calendar-2019-n7hq7   0/1     Completed   0          38s
```

どうやらJobの実行は完了したようです。

`kubectl exec`コマンドを使ってCockroachにアクセスし、実際にDBとユーザーが作られたか確認してみましょう。

```sh
$ kubectl -n qiita exec -it cockroachdb-0 -- /cockroach/cockroach sql --url postgres://root@localhost:26257 --insecure
    ...
root@localhost:26257/defaultdb> show users;
          user_name           
+----------------------------+
  qiita_advent_calendar_2019  
  root                        
(2 rows)

Time: 16.6267ms

root@localhost:26257/defaultdb> show databases;
          database_name          
+-------------------------------+
  defaultdb                      
  postgres                       
  qiita_advent_calendar_2019_db  
  system                         
(4 rows)

Time: 10.7199ms
```

無事データベースとユーザーが作られているのが確認できました。

---

明日はこのデータベースにアプリからアクセスしてみたいと思います。ではまた明日。