Kubernetes環境にWebSphere Libertyのコンテナをデプロイする場合の、Libertyの設定方法の選択肢を調べました。
- server.xmlに設定を書いて、コンテナイメージ内にserver.xmlを含める
- 環境変数で渡す
- ConfigMapにserver.xmlを書いてマウントする
という方法がありそうです。
Libertyの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以下のトピックでも、このような構成が標準であることが言及されています。
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をファイルとしてマウントします。
mountPath
にconfigDropins
ディレクトリーを指定してしまうと、この下に複数の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
参考リンク
Running Liberty applications in IBM Cloud Private
Kubernetes: ConfigMap / Secret の内容を一度に環境変数として読み込む (envFrom)