LoginSignup
10

More than 5 years have passed since last update.

Kubernetes環境のLibertyでのConfigMapを使った環境変数とかserver.xmlの設定方法

Last updated at Posted at 2018-06-14

Kubernetes環境にWebSphere Libertyのコンテナをデプロイする場合の、Libertyの設定方法の選択肢を調べました。

  • server.xmlに設定を書いて、コンテナイメージ内にserver.xmlを含める
  • 環境変数で渡す
  • ConfigMapにserver.xmlを書いてマウントする

という方法がありそうです。

LibertyのDockerイメージ

公式Dockerイメージでは

/config -> /opt/ibm/wlp/usr/servers/defaultServer
/output -> /opt/ibm/wlp/output/defaultServer

というシンボリックリンクがあり、

WLP_OUTPUT_DIR=/opt/ibm/wlp/output
LOG_DIR=/logs

という環境変数がセットされています。
LibertyのKnowledgeCenter以下のトピックでも、このような構成が標準であることが言及されています。

Liberty Helm chart

server.xmlは次の通り何も書かれておらず、

<?xml version="1.0" encoding="UTF-8"?>
<server description="new server">

    <!-- Enable features -->
    <featureManager>
        <!-- <feature></feature> -->
    </featureManager>

</server>

次のようにDockerfileを書き、server.xmlを上書きして使うことが想定されています。

FROM websphere-liberty:kernel
COPY server.xml /config/
RUN installUtility install --acceptLicense defaultServer

環境変数

一部の設定は環境変数としても定義できます。
また、server.xmlでは${env.MYSQL_SERVERNAME}のように記述することで環境変数から値を取得することもできます。

Deploymentに直接定義

環境変数をDeploymentに直接定義する場合は以下のようにします。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: liberty
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: liberty
    spec:
      containers:
      - name: liberty
        image: websphere-liberty:kernel
        ports:
        - containerPort: 9080
        env:
        - name: WLP_LOGGING_CONSOLE_FORMAT
          value: "json"
        - name: WLP_LOGGING_CONSOLE_LOGLEVEL
          value: "info"
        - name: WLP_LOGGING_CONSOLE_SOURCE
          value: "message,trace,accessLog,ffdc"

ConfigMapに環境変数を定義

ConfigMapに格納した環境変数をDeploymentから参照するには、以下のようにします。

apiVersion: v1
kind: ConfigMap
metadata:
  name: liberty-env-config
data:
  consoleFormat: "json"
  consoleLoglevel: "info"
  consoleSource: "message,trace,accessLog,ffdc"

キー毎にconfigMapKeyRefを記載します。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: liberty
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: liberty
    spec:
      containers:
      - name: liberty
        image: websphere-liberty:kernel
        ports:
        - containerPort: 9080
        env:
        - name: WLP_LOGGING_CONSOLE_FORMAT
          valueFrom:
            configMapKeyRef:
              name: liberty-env-config
              key: consoleFormat
        - name: WLP_LOGGING_CONSOLE_LOGLEVEL
          valueFrom:
            configMapKeyRef:
              name: liberty-env-config
              key: consoleLoglevel
        - name: WLP_LOGGING_CONSOLE_SOURCE
          valueFrom:
            configMapKeyRef:
              name: liberty-env-config
              key: consoleSource

envFromで環境変数をまとめて渡す

環境変数をたくさん列挙するのが面倒な場合はまとめて渡すこともできます。
ConfigMapは先ほどと同じですが、ConfigMapのキー名には環境変数名を使うようにします。

apiVersion: v1
kind: ConfigMap
metadata:
  name: liberty-env-config
data:
  WLP_LOGGING_CONSOLE_FORMAT: "json"
  WLP_LOGGING_CONSOLE_LOGLEVEL: "info"
  WLP_LOGGING_CONSOLE_SOURCE: "message,trace,accessLog,ffdc"

Deploymentではenvの代わりにenvFromを指定し、configMapRefでConfigMapの名前を指定すると全てのキーが環境変数として展開されます。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: liberty
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: liberty
    spec:
      containers:
      - name: liberty
        image: websphere-liberty:kernel
        ports:
        - containerPort: 9080
        envFrom:
        - configMapRef:
            name: liberty-env-config

server.env

メリットがあるかわかりませんが、ConfigMapにserver.envを格納し、ファイルとしてマウントすることで環境変数を渡すことも可能です。

apiVersion: v1
kind: ConfigMap
metadata:
  name: server-env-config
data:
  server.env: |-
    WLP_LOGGING_CONSOLE_FORMAT=json
    WLP_LOGGING_CONSOLE_LOGLEVEL=info
    WLP_LOGGING_CONSOLE_SOURCE=message,trace,accessLog,ffdc

Deploymentでは、このConfigMapをファイルとしてマウントします。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: liberty
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: liberty
    spec:
      containers:
      - name: liberty
        image: websphere-liberty:kernel
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: server-env-vol
          mountPath: /config/server.env
          subPath: server.env
      volumes:
      - name: server-env-vol
        configMap:
          name: server-env-config
          items:
          - key: server.env
            path: server.env

server.xmlをマウントする

Libertyの設定はserver.xmlに書かれているため、設定変更時には通常はイメージの再ビルドが必要になりますが、server.xmlをマウントするか、LibertyではconfigDropinsディレクトリーにserver.xmlのサブセットを含めることができるので、ConfigMapを使って設定を外部からコンテナにDrop inすることもできます。

xmlをconfigDropins/defaultsに配置した場合はその設定がserver.xmlに存在しない場合のデフォルト値となり、configDropins/overridesに配置した場合はserver.xmlの設定を上書きします。

ログの設定を記述したserver.xmlを含むConfigMapを作成します。

apiVersion: v1
kind: ConfigMap
metadata:
  name: logging-config
data:
  logging.xml: |-
    <?xml version="1.0" encoding="UTF-8"?>
    <server>
      <httpAccessLogging id="accessLogging" />
      <httpEndpoint id="defaultHttpEndpoint" accessLoggingRef="accessLogging" />
      <logging consoleFormat="json" consoleLoglevel="info" consoleSource="message,trace,accessLog,ffdc" />
    </server>

Deploymentでは、このConfigMapをファイルとしてマウントします。
mountPathconfigDropinsディレクトリーを指定してしまうと、この下に複数のxmlをマウントできないので、mountPathにはファイルパスを書き、さらにsubPathにファイル名を指定しています。ただしこの方法だとConfigMapの変更が動的にPodに反映されないと思われます。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: liberty
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: liberty
    spec:
      containers:
      - name: liberty
        image: websphere-liberty:kernel
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: logging-config-vol
          mountPath: /config/configDropins/overrides/logging.xml
          subPath: logging.xml
      volumes:
      - name: logging-config-vol
        configMap:
          name: logging-config
          items:
          - key: logging.xml
            path: logging.xml

参考リンク

WAS V9 Liberty基盤設計セミナー資料

Running Liberty applications in IBM Cloud Private

Logging and Trace

Kubernetes: ConfigMap / Secret の内容を一度に環境変数として読み込む (envFrom)

Configuring environment variables during container startup

Liberty サーバーでの Microservice Builder ファブリックの使用

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10