はじめに
前回Kubernetes上にMySQLを立て、またeclipseでWildFlyの開発環境を作成した。今回はこれらを用いKubernetes上でWildFlyサービスを立ててみようと思う。なおWildFlyだけでもSSL化はできるが、ここでは先に作成したIngressを使うことにしている。

環境構築
WildFlyの環境設定ファイルのコピー
開発環境で作成したwarファイル(test.war)とコンフィギュレーションファイルをAzure Storageの適当なディレクトリにコピーする。ここでは/home/work配下にする。
- test.war
- standalone-full.xml
- mgmt-users.properties
- modules配下のMySQLドライバ(modules.xmlとmysql-xxx-bin.jar)
コンテナイメージの作成
このディレクトリに以下のDockefileを作成します。WildFlyを起動させる前に、先ほどのファイルをコンテナにコピーしているだけです。
# imageを取得する
FROM jboss/wildfly
# 実行ユーザを指定する
USER jboss
# warファイルをデプロイディレクトリへ追加する
ADD --chown=jboss:jboss test.war /opt/jboss/wildfly/standalone/deployments/
# MySQLドライバをコンテナにコピーする
WORKDIR /opt/jboss/wildfly
COPY --chown=jboss:jboss modules ./modules
RUN find ./modules/com -type d | xargs chmod 755 &&\
find ./modules/com -type f | xargs chmod 644
# コンフィグをコンテナにコピーする
COPY --chown=jboss:jboss configuration/* ./standalone/configuration/
RUN chmod 664 ./standalone/configuration/* &&\
find ./standalone/configuration -name mgmt* | xargs chmod 600 &&\
find ./standalone/configuration -name appl* | xargs chmod 600
# WildFlyを起動する
CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-c", "standalone-full.xml", "-b", "0.0.0.0", "-bmanagement", "0.0.0.0"]
ここからは「Kubernetesを試そう」で書いた手順と同じです。まず、コンテナイメージをビルドします。
$ az acr build --registry registry0511 --image wildfly:v1.0 .
Packing source code into tar to upload...
(略)
- image:
registry: registry0511.azurecr.io
repository: wildfly
tag: v1.0
digest: sha256:d8769112918bf9a76c2e2a12cf442d052be5ebfba6f495fca0d350d3a5716976
runtime-dependency:
registry: registry.hub.docker.com
repository: jboss/wildfly
tag: latest
digest: sha256:8fd455d9483964bd8cb22b8a9c8099c57d84e9f7df5a1d00e007f18e41d1dc32
git: {}
Run ID: ce6 was successful after 37s
WildFlyサービスのデプロイ
WildFly用のマニフェスト(web-deployment.yaml)を作成します。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-deployment
spec: # ======================== Deploymentのスペック =========================
replicas: 1 # レプリカ数
selector:
matchLabels: # 検索条件
app: web-wildfly
template: # ================== テンプレート =================================
metadata:
labels:
app: web-wildfly
env: production
spec:
containers:
- image: registry0511.azurecr.io/wildfly:v1.0 # コンテナイメージの場所
name: wildfly-container # コンテナ名
ports:
- containerPort: 8080 # ポート番号
imagePullSecrets:
- name: acr-pull-key # コンテナレジストリのPULLキー
マニフェストを適用して、ポッドが上がっている事を確認します。
$ kubectl apply -f web-deployment.yaml
# コンテナ作成中
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web-deployment-545964b584-2bz8w 0/1 ContainerCreating 0 9s
# 起動完了
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
web-deployment-545964b584-2bz8w 1/1 Running 0 3m42s
内部ロードバランサーの起動
ロードバランサ―のマニフェスト(internal-lb-service.yaml)を作成します。内部に起動させるのでazure-load-balancer-interrnalをtrueにしています。
apiVersion: v1
kind: Service
metadata:
name: internal-lb
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
spec: # ======================== スペック =================================
type: LoadBalancer
ports:
- port: 80 # 自身のポート番号
targetPort: 8080 # 振り先のポート番号
protocol: TCP
selector: # =========== 接続先(POD)の条件 =============================
app: web-wildfly
マニフェストを適用して、サービスが起動していることを確認します。
$ kubectl apply -f internal-lb-service.yaml
service/internal-lb created
# サービスが起動。EXTERNAL-IPは内部アドレス。
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
internal-lb LoadBalancer 10.0.125.169 10.240.0.6 80:31782/TCP 48s
Ingressルートの適用
外部トラフィックをロードバランサ―に向けるIngressルートを作成します。TLS終端や証明書の作成についてはこちらを参照。
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: demo-ingress
namespace: default
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: letsencrypt
spec: # ======================== スペック =================================
tls:
- hosts:
- demo-ingress.japaneast.cloudapp.azure.com
secretName: tls-secret
rules:
- host: demo-ingress.japaneast.cloudapp.azure.com
http:
paths:
- backend: # パス指定なし(すべて)
serviceName: internal-lb # 振り先
servicePort: 80
動作確認
ブラウザでhttps://demo-ingress.japaneast.cloudapp.azure.com/api/hello/textにアクセスすると、無事「Hello, World」と表示される。
管理コンソールからMySQLとの疎通を確認する。

今回はWebアプリケーションからデータベースにアクセスすることはしていないので、次回は何かサンプルで連携するものを作ろうと思う。