|
|
WebOTX Manual V10.4 (第4版) 目次を表示 |
本節では、コンテナオーケストレーションツール環境下における、下記観点の運用指針について説明します。
オンプレミス環境とコンテナオーケストレーションツール環境では、その運用指針に以下のような違いがあります。
| 運用観点 | オンプレミス環境 | コンテナオーケストレーションツール環境 |
|---|---|---|
| ドメインの設定情報の更新 | 運用管理コマンド等、運用操作で変更します。 | WebOTXコンテナビルド時に設定を変更します。 または、WebOTX Application Serverのカスタムリソースを編集し、変更します。 |
| アプリケーション固有の設定情報の更新 | マシンの環境変数を変更したり、運用管理コマンド等を使用し、JVMオプションを変更します。 | コンテナの環境変数を参照するようアプリケーションを改造し、変更します。 または、アプリケーションにMicroProfile Configを実装し、設定情報をシステムプロパティ、環境変数、設定ファイル(propertiesファイル)から設定を注入し、変更します。 |
| 性能分析 | VisualVMなどのJVM解析ツールを使用し、アプリケーションの詳細情報を取得し、分析します。 | 分散するサービスを対象として、MicroProfile OpenTracingと分散トレース情報可視化ツールを使用し、アプリケーションの性能を分析します。 |
| 障害解析 | WebOTXやアプリケーションのログを直接参照します。 | ELKスタックを使用し、各種ログを蓄積させ、取得します。 |
| タスクマネージャやTopを使用し、CPUやメモリの使用率を取得します。 | Prometheusを使用し、コンテナごとのCPUやメモリの使用率を取得します。 |
ドメインの設定情報に関する更新は、WebOTX Application Serverコンテナのプロファイルにより手順が変わります。
WebOTX Application Server Standard / Express フルプロファイル版コンテナの場合、生成されたコンテナイメージを使用し、otxadminコマンドを実行するようDockerfileを作成し、コンテナイメージをビルドすることで、ドメインの設定を変更できます。
設定変更手順については、[構築・運用 > コンテナ型仮想化 > WebOTX Application Server のコンテナイメージ > 生成済みのWebOTX Application Serverのコンテナイメージに対する追加構成]をご参照ください。
WebOTX Application Server Express マイクロサービスプロファイル版の場合、WebOTX Uber JARのMavenプロジェクトの設定ファイルを変更し、Uber JARを再作成することでドメインの設定を変更することができます。
変更したい設定により、編集する設定ファイルが違います。
詳しくは、[アプリケーション開発ガイド > その他のアプリケーション > マイクロサービスプロファイルを使用したWebOTX Uber JARの作成 > 設定一覧]をご参照ください。
domain.xmlに関する設定を定義したconfig.propertiesファイルを、configPropertiesPathに指定します。以下のような設定を変更できます。
| プロパティ | 既定値 |
|---|---|
| server.admin-service.jmx-connector.system.port | 6212 |
| server.network-config.network-listeners.network-listener.http-listener-1.port | 8080 |
| server.network-config.network-listeners.network-listener.http-listener-2.port | 8443 |
| server.java-config.system-jvm-options | なし |
| server.network-config.network-listeners.network-listener.http-listener-1.enabled | TRUE |
| server.network-config.network-listeners.network-listener.http-listener-2.enabled | TRUE |
| server.network-config.network-listeners.network-listener.http-listener-1.protocol | http-protocol |
| server.network-config.network-listeners.network-listener.http-listener-2.protocol | https-protocol |
| server.resources.jdbc-datasource.<JNDI名>.jndiName | なし |
ドメイン起動直後及びアプリケーション配備後に実行する任意のコマンドを羅列したファイル(任意設定ファイル)をWebOTX Uber JARプラグインの下記configrurationに指定することで、任意のタイミングでコマンドを実行し、ドメインの設定を変更することができます。
| configuration | 実行タイミング |
|---|---|
| preStartCmdsConfPath | ドメイン起動前 |
| postStartCmdsConfPath | ドメイン起動後 |
| postDeployCmdsConfPath | アプリケーション配備後 |
以下のコマンドで、設定変更したWebOTX Uber JARのMavenプロジェクトをビルドします。
cd <WebOTX Uber JAR Mavenプロジェクトのトップディレクトリ>
mvn clean package
前項で作成したWebOTX Uber JARプロジェクトの成果物を含むコンテナイメージをビルドします。
cd <WebOTX Uber JAR Mavenプロジェクトのtargetディレクトリ>
docker (podman) build -t <任意のコンテナイメージのタグ名> .
前項で作成したコンテナを起動し、domain.xmlを確認することで設定反映を確認することができます。
コンテナ内のdomain.xmlは、以下のコマンドでローカルコピーすることができます。
docker(podman) cp <起動したコンテナID>:/opt/WebOTX/domains/domain1/config/domain.xml <任意のdomain.xmlコピー先>
コピーしたdomain.xmlをテキストエディタ等で開き、設定を確認してください。
コンテナオーケストレーションツール環境下に存在するWebOTX Application Serverコンテナを、設定変更したコンテナイメージに更新する手順について、記載します。
以下のコマンドで、コンテナをビルドします。
cd <更新したいコンテナのDockerfileのあるパス>
docker(podman) build -t <Amazon ECRにアップロードしたWebOTX Application Serverコンテナのタグ> .
さらに、ビルドしたコンテナをAmazon ECRへアップロードします。
docker(podman) push <Amazon ECRにアップロードしたWebOTX Application Serverコンテナのタグ>
以下のコマンドで、コンテナをビルドします。
cd <更新したいコンテナのDockerfileのあるパス>
oc project <WebOTX Application Server のnamespace>
oc start-build <WebOTX Application ServerコンテナのBuildConfig名> --from-dir=.
さらに、以下のコマンドで、OpenShift内に保存されたコンテナイメージのタグを確認します。
oc get is
WebOTX Application Server Podのカスタムリソースファイルを以下のように編集します。
- spec deployment: image: <WebOTX Application Server コンテナイメージ名>
以下のコマンドで、WebOTXのPodを更新します。
kubectl(oc) delete -f <WebOTX Application Server カスタムリソースファイル> -n <WebOTX Application Serverのnamespace>
kubectl(oc) apply -f <WebOTX Application Server カスタムリソースファイル> -n <WebOTX Application Serverのnamespace>
詳しくは、以下をご参照ください。
アプリケーション固有の設定情報変更には、コンテナの環境変数によって変更する方針があります。
本項では、この方針に沿った手順を説明します。
Memo
アプリケーションにMicroProfile Configを実装し、設定情報をシステムプロパティ、環境変数、設定ファイル(propertiesファイル)から
注入することもできます。
詳細は、[アプリケーション開発ガイド > その他のアプリケーション > マイクロサービスアプリケーションの開発 > MicroProfile Config]をご参照ください。
アプリケーションの設定情報を、OSの環境変数から取得するように、アプリケーションを改造します。
改造後、当該アプリケーションを含むWebOTX Application Serverコンテナイメージを作成し、コンテナオーケストレーションツール環境下へ反映します。
コンテナオーケストレーションツール環境下のコンテナイメージ更新方法については、本ページ [ドメインの設定情報の更新 > WebOTX Application Server Podの更新]をご参照ください。
環境変数一覧を記載したConfigMapを作成します。
以下にConfigMapのyamlファイルの例を記載します。
apiVersion: v1 kind: ConfigMap metadata: name: <任意のConfigMap名> data: <環境変数名>: <環境変数値>
以下のコマンドで、ConfigMapをWebOTXのnamespaceへ適用します。
kubectl(oc) create -f <作成したConfigMapのyamlファイル> -n <WebOTXのnamespace>
前項で作成したConfigMapをコンテナ環境変数として読み込むよう、WebOTXのカスタムリソースファイルを編集します。
- spec.deployment.envFrom:
configMapName: <作成したConfigMap名>
以下のコマンドでカスタムリソースを更新し、WebOTXのPodを更新します。
kubectl(oc) delete -f <WebOTX Application Server カスタムリソースファイル> -n <WebOTX Application Serverのnamespace>
kubectl(oc) apply -f <WebOTX Application Server カスタムリソースファイル> -n <WebOTX Application Serverのnamespace>
本項では、アプリケーションの性能分析を行うために、MicroProfile OpenTracingを実装し、可視化ツールを使用することで分散トレースを実現する方法について説明します。
クラスタ内の各ノード、PodのCPU、メモリ使用率の取得については、[構築・運用 > コンテナ環境の開発から運用まで > 監視]をご参照ください。
本項で使用するOSS、サービスについて説明します。
アプリケーションへのリクエストによって動作する複数の処理(ステップ)の関係性, また、その処理毎にかかった時間(トレース情報)を計測し、外部へ発信することができるOSSです。
発信されたトレース情報を収集、可視化できるサービスです。
分散トレースは、以下のような流れで実現されます。


Istioを使用し、Amazon EKS環境へJaegerをインストールする手順を、以下に記載します。
Memo
本手順では、簡易的に性能分析環境を再現するため、Jaeger all-in-oneを使用しています。
本番環境用にJaegerを構築する際は、Jaeger公式ドキュメントをご参照ください。
[Jaeger公式ページ > Getting Started > Kubernetes templates]
IstioがEKSクラスタ上にインストールされていること。
Jaegerは、Istioのアドオンとしてインストールします。
Istioのインストールについては、Istio公式ドキュメントをご参照ください。
以下のコマンドで、Jaegerをインストールします。
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.9/samples/addons/jaeger.yaml
Memo
最新の手順は、以下のIstio公式ドキュメントをご参照ください。
https://istio.io/latest/docs/ops/integrations/jaeger/#installation
Istio Ingress Gateway経由で、JaegerのWebUIを公開します。
以下のコマンドでIstio Ingress GatewayのEXTERNAL-IPを取得します。
kubectl get svc -n istio-system istio-ingressgateway
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
istio-ingressgateway LoadBalancer 10.100.217.168 abcdefghijklmnopqrstuvwxyzabcdef-1234567890.ap-northeast-1.elb.amazonaws.com 15021:30903/TCP,80:31965/TCP,443:30600/TCP,31400:31052/TCP,15443:31255/TCP 5h15m
以下のコマンドで、JaegerのWebUIのサービスが存在されていることを確認し、サービス名を把握します。
kubectl get svc -n istio-system tracing
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tracing ClusterIP 10.100.80.147 <none> 80/TCP 14m
Istio Ingress Gatewayでjaegerを公開できるよう、以下のようにyamlファイルを作成します。
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: sample-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: caller
spec:
hosts:
- "*"
gateways:
- sample-gateway
http:
- match:
- uri:
prefix: "/"
route:
- destination:
host: tracing.istio-system.svc.cluster.local
port:
number: 80
Memo
この例では、Istio Ingress Gatewayの80ポートへのアクセスを、JaegerのWebUIに転送するよう設定しています。
以下のURLで、JaegerのWebUIへアクセスできることを確認します。
http://<Istio Ingress GatewayのEXTERNAL-IP値>:80/
OpenShiftのサービスメッシュの構成要素であるJaegerを使用します。
OperatorHubより、Red Hat OpenShift Jaegerをインストールし使用します。
詳しくは、OpenShift公式ドキュメントをご参照ください。
[Product Documentation for OpenShift Container Platform 4.7 > サービスメッシュ > Jaeger Operator のインストール ]
| 項目 | 値 |
|---|---|
| Update Channel | stable |
| Installation Mode | All namespaces on the cluster (default) |
| Installed Namespace | openshift-operators |
| Approval Strategy | Automatic |
| 項目 | 説明 |
|---|---|
| Name | (任意)作成されるJaegerサービス群の名前です。 |
| Label | (任意)作成されるJaegerサービス群のラベルです。空でもJaegerを作成可能です。 |
以下のコマンドで、JaegerのWebUIのURLを取得し、ブラウザでアクセスできることを確認します。
oc get route -n openshift-operators
アプリケーションの各処理に、MicroProfile OpenTracing実装を追加し、WebOTX Application Serverコンテナへ反映します。
MicroProfile OpenTracingの実装方法は、[アプリケーション開発ガイド > その他のアプリケーション > マイクロサービスアプリケーションの開発 > MicroProfile OpenTracing」をご参照ください。
本項では、以下で紹介されているサンプルを基に説明します。
[構築・運用 > コンテナ環境の開発から運用まで > アプリケーション開発手法 > 新規アプリケーションの開発 > アプリケーションの統合 > sample_uberjar_project.zip]
トレース情報をJaegerへ送信するため、WebOTX Application ServerのJavaシステムプロパティに以下を追加します。
| プロパティ名 | 設定値 |
|---|---|
| JAEGER_SERVICE_NAME | jaegerservice |
| JAEGER_ENDPOINT | <jaeger-collectorのサービス名>.istio-system.svc.cluster.local:<jaeger-collectorのポート> |
jaeger-collectorのサービス名, ポートは以下のコマンドで取得できます。
kubectl get svc -n istio-system jaeger-collector
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jaeger-collector ClusterIP 10.100.194.51 <none> 14268/TCP,14250/TCP 6h8m
上記の例では、JAEGER_ENDPOINT値は以下のようになります。
jaeger-collector.istio-system.svc.cluster.local:14268
トレース情報をJaegerへ送信するため、WebOTX Application ServerのJavaシステムプロパティに以下を追加します。
| プロパティ名 | 設定値 |
|---|---|
| JAEGER_SERVICE_NAME | jaegerservice |
| JAEGER_AGENT_HOST | <jaeger Agentを公開するサービス名>.<Jaegerのあるnamespace>.svc.cluster.local |
| JAEGER_AGENT_PORT | 6831 |
| JAEGER_SAMPLER_MANAGER_HOST_PORT | <jaeger Collectorを公開するサービス名>.<Jaegerのあるnamespace>.svc.cluster.local:5778 |
各サービス名は以下のようになります。
Agentを公開するサービス:<[Jaegerのインストール]で作成したJaegerの"Name">-agent
Collectorを公開するサービス:<[3-3-3-1-2-2. Jaegerのインストール]で作成したJaegerの"Name">-collector
・OpenShiftに配備したJaegerのサービス一覧例
oc get svc -n openshift-operators
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
jaeger-all-in-one-inmemory-agent ClusterIP None <none> 5775/UDP,5778/TCP,6831/UDP,6832/UDP 92s
jaeger-all-in-one-inmemory-collector ClusterIP 172.30.176.66 <none> 9411/TCP,14250/TCP,14267/TCP,14268/TCP 92s
jaeger-all-in-one-inmemory-collector-headless ClusterIP None <none> 9411/TCP,14250/TCP,14267/TCP,14268/TCP 92s
jaeger-all-in-one-inmemory-query ClusterIP 172.30.235.139 <none> 443/TCP 92s
jaeger-operator-metrics ClusterIP 172.30.54.164 <none> 8383/TCP,8686/TCP 2m33s
上記の例では、JAEGER_AGENT_HOST、JAEGER_SAMPLER_MANAGER_HOST_PORT値は以下のようになります。
JAEGER_AGENT_HOST : jaeger-all-in-one-inmemory-agent.openshift-operators.svc.cluster.local JAEGER_SAMPLER_MANAGER_HOST_PORT : jaeger-all-in-one-inmemory-collector.openshift-operators.svc.cluster.local:5778
Jaegerに関するWebOTXの詳しい設定は、[アプリケーション開発ガイド > その他のアプリケーション > マイクロサービスアプリケーションの開発 > MicroProfile OpenTracing > Jaeger Client の設定項目]をご参照ください。
以下のコマンドでWebOTXのカスタムリソースを更新し、WebOTXのPodを更新します。
kubectl(oc) delete -f <WebOTX Application Server カスタムリソースファイル> -n <WebOTX Application Serverのnamespace>
kubectl(oc) apply -f <WebOTX Application Server カスタムリソースファイル> -n <WebOTX Application Serverのnamespace>
予め、WebOTX Application Serverに配備したアプリケーションへリクエストし、MicroProfile OpenTracingが実装されている処理を通し、Jaegerへ情報を蓄積させます。
本項では、以下のサンプルがKubernetes環境上へ配備されているとして説明します。
[アプリケーション開発手法 > 新規アプリケーションの開発 > アプリケーションの統合 > sample_uberjar_project.zip]
Jaegerへ情報を蓄積させるため、以下のエンドポイントにアクセスします。
<WebOTX Application ServerのURL>/sample-app-1.0-SNAPSHOT/sample_service_a/service_a
JaegerのWebUIにアクセスし、左ペイン[Search]からトレース情報を絞り込み、検索します。
絞り込み項目には、以下のようなものがあります。
| 項目名 | 説明 |
|---|---|
| Service | トレース情報を発したサービス名です。WebOTX Application ServerのJavaシステムプロパティ"JAEGER_SERVICE_NAME"値となります。 |
| Operation | "all"、"HTTP GET <エンドポイントのパス>"等、そのトレース情報の動作の形態です。 |
| Tags | アプリケーションの処理(スパン)に設定したタグです。 |
| Lookback | トレース情報が発生した時間です。 |
| Min / Max Duration | スパンにかかった最短 / 最大の時間です。 |
| Limit Results | 一度に表示する検索結果の量です。 |
検索結果より、"jaegerservice: SampleServiceA.serviceA"を選択すると、以下のような画面となります。

このようにして、アプリケーションの関係が複雑となっていても、各処理区間の性能が一目で分析できるようになります。
コンテナオーケストレーションツール環境下で障害が発生した場合、以下の要素を使用して解析することができます。
| 大項目 | 中項目 | 小項目 | 説明 |
|---|---|---|---|
| WebOTX | ログ | WebOTXのログ | 障害発生時の各種ログを参照し、原因を探ることができます。 |
| アプリケーション固有のログ | |||
| コンテナ内の任意のファイル | |||
| Kubernetesクラスタ | Events | WebOTXのPod | KubernetesのPod Eventを参照し、各コンテナに関する情報を取得することができます。 |
| ノード | Kubernetesのノード Eventを参照し、WebOTXのPodが動作しているノードに関する情報を取得することができます。 | ||
| マシンリソース | CPU使用率 | 障害発生時のマシンリソース使用率を参照することができます。参照方法については、[構築・運用 > コンテナ環境の開発から運用まで > 監視 > Kubernetesノードリソース監視の実現方針]をご参照ください。 | |
| メモリ使用率 |
ログ取得の手法について記載します。
WebOTX、また、アプリケーション固有のログ取得、参照方法については、[構築・運用 > コンテナ環境の開発から運用まで > 監視 > ログ監視の実現方針]をご参照ください。
kubectl (oc) get po -n <WebOTXのnamespace>
kubectl (oc) describe po -n <WebOTXのnamespace> <WebOTXのPod名>
※取得結果中の、"spec.containers.name"値を取得します。
kubectl (oc) cp -n <WebOTXのnamespace> -c <WebOTXのコンテナ名> <WebOTXのPod名>:<WebOTXのコンテナ内のファイルのフルパス> <ローカル環境の任意のパス>
以下のコマンドで、Podやノードの状態、Eventを取得することができます。
kubectl (oc) describe (po / node) -n <WebOTXのnamespace> <WebOTXのPod / ノード名>
取得した結果から以下を取り出します。
| 情報種別 | Kubernetesリソース | 情報取得箇所 |
|---|---|---|
| 状態 | Pod | Status |
| ノード | Conditions.Type | |
| イベント | Pod、ノード共通 | Events |
| 値 | 概要 |
|---|---|
| Running | Podは正常に稼働しています。 |
| Failed | Pod内のいずれかのコンテナの異常終了により、Podが終了しています。 |
その他のPodの状態については、Kuberenetes公式ドキュメントをご参照ください。
https://kubernetes.io/ja/docs/concepts/workloads/pods/pod-lifecycle/
| ノードのCondition.Type値 | 概要 |
|---|---|
| Ready | ノードの状態が有効で、Podを配備できるとき、Trueとなります。 |
| DiskPressure | ノードの空きディスク容量が少ないことを表しています。 |
| MemoryPressure | ノードの空きメモリ容量が少ないことを表しています。 |
その他のノードの状態については、Kuberenetes公式ドキュメントをご参照ください。
https://kubernetes.io/ja/docs/concepts/architecture/nodes/Podのイベントが出力される例を記載します。
WebOTX Operator配備時、存在しないコンテナイメージを指定した際、以下のようなイベントが出力されます。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 37s default-scheduler Successfully assigned webotx/webotx-operator-5ff578b899-w7hcx to <ノード名>
Normal AddedInterface 35s multus Add eth0 [10.131.0.29/23]
Normal BackOff 30s kubelet, <ノード名> Back-off pulling image "webotx-ope:10.4"
Warning Failed 30s kubelet, <ノード名> Error: ImagePullBackOff
Normal Pulling 16s (x2 over 35s) kubelet, <ノード名> Pulling image "webotx-ope:10.4"
Warning Failed 12s (x2 over 31s) kubelet, <ノード名> Failed to pull image "webotx-ope:10.4": rpc error: code = Unknown desc = Error reading manifest 10.4 in docker.io/library/webotx-ope: errors:
denied: requested access to the resource is denied
unauthorized: authentication required
Warning Failed 12s (x2 over 31s) kubelet, <ノード名> Error: ErrImagePull
取得したイベントの"Message"値の内、「Failed to pull image "webotx-ope:10.4" (中略) Error reading manifest 10.4 in docker.io/library/webotx-ope」とあるので、
docker.ioのコンテナレジストリから"webotx-ope"というコンテナイメージを探していたことが分かります。
docker.ioにはそのようなコンテナイメージは存在しないため、
「yamlファイルで指定するコンテナイメージのタグの記述が間違っている」可能性が推測できます。
このようにイベントのメッセージを読み解くことで、障害の原因を探ることができます。
ノードのイベントが出力される例を記載します。
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal NodeHasDiskPressure 7m (x2 over 2h) kubelet, <ノード名> Node <ノード名> status is now: NodeHasDiskPressure
Warning EvictionThresholdMet 6m (x4 over 2h) kubelet, <ノード名> Attempting to reclaim ephemeral-storage
取得したイベントの"Reason"の内、NodeHasDiskPressureが出力されており、ノードの状態が"DiskPressure"に移行したことが分かります。
このメッセージを基に、ノードのディスク容量を確認し、空き容量を確保する等の対処を行うことができます。
Prometheusを使用し、障害発生時のマシンリソースの使用率を把握することができます。
Prometheusの構築、使用方法については、[構築・運用 > コンテナ環境の開発から運用まで > 監視 > Kubernetesノードリソース監視の実現方針]をご参照ください。
PrometheusのWebUIを使用し、PromQLの実行結果をグラフ化し、障害発生時前後のマシンリソースの使用状況を把握することができます。

構成要素の説明
各PromQLの例は、[構築・運用 > コンテナ環境の開発から運用まで > 監視 > PromQLの実行]をご参照ください。