#はじめに
「IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた」の 第8回です。
ここでは、 いよいよ IBM Cloud kubernetes Service (IKS) 上でコンテナを動かします。
実施内容は以下の通りです。
- 変数情報の準備
- Secret, ConfigMap の作成
- Deployment の作成
- service の作成(サービスの公開)
今回、WebSphere-Liberty コンテナに、環境変数を通じて以下の情報を渡します。
下表は、「第7回のserver.xml」 で説明した表の一部抜粋です。
変数 | 指定方法 | 取得先 |
---|---|---|
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回の中の資格情報の作成」 をご覧ください。
DB_USSERNAME=wtz01550
DB_PASSWORD=z***********v
なお、この env ファイルと、 これをもとに作成する secret の yaml ファイルにはパスワードが記録されていますので外部に公開しないように注意しましょう。
( Secret 内の文字列は base64 でエンコードされているだけで誰でも解読可能です)
次に、ConfigMap 用のファイルもあわせて作成します。ファイル名は liberty-counter.env
としています。
今回は検証のため、コンテナ内のログを見ることもあるかもしれないので、 TZ=JST-9
を入れています。(なくてもよいです)
また、 DB 関連の情報("*" で消しています)は、「第5回の中の資格情報の作成」 をご覧ください。
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 設定」を参照し、
kubectl
コマンドが想定した kubernetes Cluster 上で実行されているかどうかをご確認ください。
なるほど、わからん。という人は以下のコマンドで確認しましょう。
# 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
で作成してももちろんかまいません。
# 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 という名前にしています。
# 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 という名前にしています。
# 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 を作成します。
# 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 から取得
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 を作成します。
# 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 ファイルに出力させます。
# 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 を作成します。
# 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 コンテナの準備)
↑:IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた(1.概要)
→:IKS + Db2 on IBM Cloud で DBアクセスアプリを動かしてみた(9.アクセステスト)