LoginSignup
0
1

More than 5 years have passed since last update.

LibertyコンテナのJVM引数にPod名を渡す

Last updated at Posted at 2018-12-14

LibertyのJVM引数に、-Xdump:java:file=/tmp/javacore.%Y%m%d.%H%M%S.<Pod名>.%seq.txtのようにPod名を設定したい場合のメモ。各Podが同じPersistentVolumeをマウントしていてそこにコアを出力したいが、ファイル名にPod名を入れたいような場合を想定。jvm.optionsファイルはserver.xmlのように${env.hogehoge}みたいな書き方ができない。2通りのやり方がありそう。

  • LibertyコンテナのCMDを書き換える
  • 環境変数JVM_ARGSDownward APIを使ってマニフェストで設定

LibertyコンテナのCMDを書き換える

上記記事に書いたのと同じような方法で、起動コマンドを上書きし、事前にコンテナに配置したテンプレートから起動時にjvm.optionsファイルを生成する。

jvm.options
-Xdump:java:file=/tmp/javacore.%Y%m%d.%H%M%S.MY_POD_NAME.%seq.txt
start.sh
#!/bin/bash
sed -i -e s/MY_POD_NAME/${HOSTNAME}/g /config/jvm.options
exec /opt/ibm/wlp/bin/server run defaultServer

↑実行権限をつけること

Dockerfile
FROM websphere-liberty:18.0.0.3-kernel
COPY jvm.options /config/jvm.options
COPY start.sh /
CMD ["/start.sh"]

なお、start.shをコンテナの中に入れなくても、マニフェストに記述することもできる。jvm.optionsのテンプレートはConfigMapで注入し、スクリプトはマニフェスト内に記載する。

apiVersion: v1
kind: ConfigMap
metadata:
  name: jvm-config
data:
  jvm.options: -Xdump:java:file=/tmp/javacore.%Y%m%d.%H%M%S.MY_POD_NAME.%seq.txt
---
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: liberty
  name: liberty
spec:
  replicas: 1
  selector:
    matchLabels:
      run: liberty
  template:
    metadata:
      labels:
        run: liberty
    spec:
      containers:
      - image: websphere-liberty:18.0.0.3-kernel
        name: liberty
        args:
        - bash
        - -c
        - |-
          sed -e s/MY_POD_NAME/${HOSTNAME}/g /tmp/jvm-config/jvm.options > /config/jvm.options
          exec /opt/ibm/wlp/bin/server run defaultServer
        volumeMounts:
        - name: jvm-config-volume
          mountPath: /tmp/jvm-config
      volumes:
        - name: jvm-config-volume
          configMap:
            name: jvm-config

環境変数JVM_ARGSとDownward APIを使ってマニフェストで設定

JVM_ARGSという環境変数でもJVMに引数を渡すことができる。Downward APIでPod名を環境変数として定義しつつ、その環境変数を使ってJVM_ARGS環境変数を定義する。

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: liberty
  name: liberty
spec:
  replicas: 1
  selector:
    matchLabels:
      run: liberty
  template:
    metadata:
      labels:
        run: liberty
    spec:
      containers:
      - image: websphere-liberty:18.0.0.3-kernel
        name: liberty
        env:
        - name: MY_POD_NAME
          valueFrom:
            fieldRef:
              fieldPath: metadata.name
        - name: JVM_ARGS
          value: -Xdump:java:file=/tmp/javacore.%Y%m%d.%H%M%S.$(MY_POD_NAME).%seq.txt

${MY_POD_NAME}ではなく$(MY_POD_NAME)とする必要があることに注意。${MY_POD_NAME}だとそれがそのまま文字列として渡されてしまう。$(MY_POD_NAME)を使うことで、このyamlファイル内で定義された変数のみが参照でき、展開されて設定される。

${MY_POD_NAME}の場合
$ kubectl exec -it liberty-88d46548f-4l4ht env | grep JVM_ARGS
JVM_ARGS=-Xdump:java:file=/tmp/javacore.%Y%m%d.%H%M%S.${MY_POD_NAME}.%seq.txt
$
$(MY_POD_NAME)の場合
$ kubectl exec -it liberty-7fb5688bc6-j8lz7 env | grep JVM_ARGS
JVM_ARGS=-Xdump:java:file=/tmp/javacore.%Y%m%d.%H%M%S.liberty-7fb5688bc6-j8lz7.%seq.txt
$
0
1
0

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
0
1