KubernetesでWildFlyを動かそう

はじめに

前回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アプリケーションからデータベースにアクセスすることはしていないので、次回は何かサンプルで連携するものを作ろうと思う。

タイトルとURLをコピーしました