IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（8.IKS へのコンテナのデプロイ）


#はじめに

「[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた](https://qiita.com/shimauma_Zzzzz/items/9a513abdf02d11fff55b)」の　第8回です。
ここでは、 いよいよ IBM Cloud kubernetes Service (IKS) 上でコンテナを動かします。

実施内容は以下の通りです。

- 変数情報の準備
- Secret, ConfigMap の作成
- Deployment の作成
- service の作成（サービスの公開）

今回、WebSphere-Liberty コンテナに、環境変数を通じて以下の情報を渡します。
下表は、「[第7回のserver.xml](https://qiita.com/shimauma_Zzzzz/items/c586817099cf59abdc29#serverxml)」 で説明した表の一部抜粋です。

|変数|指定方法|取得先|
|:--|:--|:--|
|DBサーバー名|env.DB_SERVERNAME|環境変数 DB_SERVERNAME|
|DBポート番号|env.DB_PORT|環境変数 DB_PORT|
|DB名|env.DB_DBNAME|環境変数 DB_DBNAME|
|DBユーザー名|env.DB_USERNAME|環境変数 DB_USERNAME|
|DBユーザーのパスワード|env.DB_PASSWORD|環境変数 DB_PASSWORD|

DB のユーザー名、パスワードは Secret として作成し、それ以外の情報は ConfigMap で作成します。
その後、 第7回でビルドしたイメージをベースに Deployment を作成ます。
最後に、 service (NodePort) を用いて外部に公開します。

#変数情報の準備

kubectl コマンドを発行するサーバー上の作業ディレクトリに、 
DBのユーザー名、パスワードを記載したファイルを作成します。 ここでは `db2conn.env` というファイル名にします（何でもよいです）
DB のユーザー名、パスワードに関しては、「[第5回の中の資格情報の作成](https://qiita.com/shimauma_Zzzzz/items/9d3234757bb1c70e98c5#%E8%B3%87%E6%A0%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BD%9C%E6%88%90)」 をご覧ください。

```console:db2conn.env
DB_USSERNAME=wtz01550
DB_PASSWORD=z***********v
```

なお、***この env ファイルと、　これをもとに作成する secret の yaml ファイルにはパスワードが記録されていますので外部に公開しないように注意しましょう。*** 
( Secret 内の文字列は base64 でエンコードされているだけで誰でも解読可能です）

次に、ConfigMap 用のファイルもあわせて作成します。ファイル名は `liberty-counter.env` としています。
今回は検証のため、コンテナ内のログを見ることもあるかもしれないので、 `TZ=JST-9` を入れています。（なくてもよいです）
また、 DB 関連の情報（"*" で消しています）は、「[第5回の中の資格情報の作成](https://qiita.com/shimauma_Zzzzz/items/9d3234757bb1c70e98c5#%E8%B3%87%E6%A0%BC%E6%83%85%E5%A0%B1%E3%81%AE%E4%BD%9C%E6%88%90)」 をご覧ください。

```console:liberty-counter.env
TZ=JST-9
DB_SERVERNAME=da****-***-***-***-*****-***.services.**-**.bluemix.net
DB_PORT=50000
DB_DBNAME=BLUDB
```

#Secret, ConfigMap の作成

準備したファイルから、 secret, ConfigMap 用の yaml ファイルを作成します。 
（※一旦 yaml ファイルに落とすのは作業内容を保存しておくため、というレベルの話で、下記のコマンドで `--dry-run=client` を外せばいきなり作成されます。

ここから先、　`kubectl` コマンドを使いますが、 「[第3回の kubernetes config 設定](https://qiita.com/shimauma_Zzzzz/items/893ea7ca238ca5e2b1c7#kubernetes-config-%E8%A8%AD%E5%AE%9A)」を参照し、
`kubectl` コマンドが想定した kubernetes Cluster 上で実行されているかどうかをご確認ください。
なるほど、わからん。という人は以下のコマンドで確認しましょう。

```console
# ibmcloud ks clusters
OK
名前             ID                     状態     作成           ワーカー   ロケーション   バージョン     リソース・グループ名   プロバ イダー
mycluster-free   btkj9i1d09cqfkiimhig   normal   12 hours ago   1          Dallas         1.17.12_1540   Default                classic

# kubectl config current-context
mycluster-free/btkj9i1d09cqfkiimhig
```

IBM Cloud kubernetes service の Cluster が、 current-context に設定されていることがわかります。



##secret 作成

`--from-env-file` オプションで作成しています。 前提の env ファイルを作成せずに `--from-literal` で作成してももちろんかまいません。


```console:secret
# kubectl create secret generic liberty-counter-db2con --from-env-file=db2con.env --dry-run=client -o yaml > liberty-counter_secret.yaml

# cat liberty-counter_secret.yaml

apiVersion: v1
data:
  DB_PASSWORD: em**************g==
  DB_USSERNAME: d3********A=
kind: Secret
metadata:
  creationTimestamp: null
  name: liberty-counter-db2con
```

yaml ファイルから secret を作成します。 liberty-counter-db2con という名前にしています。

```console
# kubectl apply -f liberty-counter_secret.yaml
secret/liberty-counter-db2con created

# kubectl get secret
NAME                     TYPE                                  DATA   AGE
all-icr-io               kubernetes.io/dockerconfigjson        1      8h
default-au-icr-io        kubernetes.io/dockerconfigjson        1      8h
default-de-icr-io        kubernetes.io/dockerconfigjson        1      8h
default-icr-io           kubernetes.io/dockerconfigjson        1      8h
default-jp-icr-io        kubernetes.io/dockerconfigjson        1      8h
default-token-z5nvz      kubernetes.io/service-account-token   3      8h
default-uk-icr-io        kubernetes.io/dockerconfigjson        1      8h
default-us-icr-io        kubernetes.io/dockerconfigjson        1      8h
liberty-counter-db2con   Opaque                                2      9s
```

##ConfigMap

同様に configmap を作成します。 liberty-counter という名前にしています。

```console
# kubectl create configmap liberty-counter --from-env-file=liberty-counter.env --dry-run=client -o yaml

apiVersion: v1
data:
  DB_DBNAME: BLUDB
  DB_PORT: "50000"
  DB_SERVERNAME: da****-***-***-***-*****-***.services.**-**.bluemix.net
  TZ: JST-9
kind: ConfigMap
metadata:
  creationTimestamp: null
  name: liberty-counter
```

yaml ファイルから configmap を作成します。

```console
# kubectl apply -f liberty-counter_ConfigMap.yaml
configmap/liberty-counter created

# kubectl get configmaps
NAME              DATA   AGE
liberty-counter   4      6s
```

#Deployment の作成

さていよいよ Deployment を作成します。
yaml の作り方としては、  `kubectl create deployment liberty-counter --image=イメージ名 --dry-run -o yaml` で作成しておき、
それに secret や configmap を読み込む部分を追記しました。

少し長いですが、丁寧に見れば内容は簡単だと思います。
ポイントとしては以下の点ぐらいと思います。

- replicas は 1 (コマンドで作成したため)
- イメージは IBM Cloud Container Registry に登録したものを指定
- DB_USERNAME と DB_PASSWORD は secretKeyRef を使って Secret から取得
- それ以外の環境変数は configMapKeyRef を使って ConfigMap から取得

```yaml:deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: liberty-counter
  name: liberty-counter
spec:
  replicas: 1
  selector:
    matchLabels:
      app: liberty-counter
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: liberty-counter
    spec:
      containers:
      - image: jp.icr.io/shimauma_zzzzz/default/liberty-counter:v3.0
        name: liberty-counter
        env:
         - name: DB_USERNAME
           valueFrom:
             secretKeyRef:
               name: liberty-counter-db2con
               key: DB_USERNAME
         - name: DB_PASSWORD
           valueFrom:
             secretKeyRef:
               name: liberty-counter-db2con
               key: DB_PASSWORD
         - name: DB_DBNAME
           valueFrom:
             configMapKeyRef:
               name: liberty-counter
               key: DB_DBNAME
         - name: DB_PORT
           valueFrom:
             configMapKeyRef:
               name: liberty-counter
               key: DB_PORT
         - name: DB_SERVERNAME
           valueFrom:
             configMapKeyRef:
               name: liberty-counter
               key: DB_SERVERNAME
         - name: TZ
           valueFrom:
             configMapKeyRef:
               name: liberty-counter
               key: TZ
        resources: {}
status: {}

```

では、早速 Deployment を作成します。

```console
# kubectl apply -f liberty-counter_Deploy.yaml
deployment.apps/liberty-counter created

# kubectl get pods -o wide
NAME                               READY   STATUS    RESTARTS   AGE   IP             NODE            NOMINATED NODE   READINESS GATES
liberty-counter-56b4795b97-9knbv   1/1     Running   0          6s    172.30.45.78   10.xx.yy.zzz   <none>           <none>
```

#service の作成

Deployment まで作成できましたので、外部公開のため NodePort の service を作成します。
これもコマンドで作成できますが、一旦 yaml ファイルに出力させます。

```console
# kubectl create service nodeport liberty-counter --node-port=30080 --tcp=8080:9080 --dry-run -o yaml > liberty-counter_svc.yaml

# cat liberty-counter_svc.yaml

apiVersion: v1
kind: Service
metadata:
  creationTimestamp: null
  labels:
    app: liberty-counter
  name: liberty-counter
spec:
  ports:
  - name: 8080-9080
    nodePort: 30080
    port: 8080
    protocol: TCP
    targetPort: 9080
  selector:
    app: liberty-counter
  type: NodePort
status:
  loadBalancer: {}

```

NodePort の 30080 番ポートを、ClusterIP の 8080 番ポートに接続し、コンテナ内の 9080 (WebSphere-Liberty の httpEndpoint ポート)に接続しています。 なぜ ClusterIP のポートを 8080 にしたのかは忘れました。。。

service を作成します。

```console
# kubectl apply -f liberty-counter_svc.yaml
service/liberty-counter created

# kubectl get svc -o wide
NAME              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE   SELECTOR
kubernetes        ClusterIP   172.21.0.1       <none>        443/TCP          8h    <none>
liberty-counter   NodePort    172.21.135.121   <none>        8080:30080/TCP   5s    app=liberty-counter

```

---
お疲れ様でした。
今回はここまでとし、次回は最終回 [9.アクセステスト] を実施します。

←：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（7.WebSphere Liberty コンテナの準備）](https://qiita.com/shimauma_Zzzzz/items/c586817099cf59abdc29)
↑：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（1.概要）](https://qiita.com/shimauma_Zzzzz/items/9a513abdf02d11fff55b)
→：[IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた（9.アクセステスト）](https://qiita.com/shimauma_Zzzzz/items/1f6943ba4038aeaa4a5d)

---