MicroProfile Config/HealthとKubernetes
富士通技術者ブログ~Javaミドルウェア~
2022年2月4日 初版
廣石 真也
MicroProfile Config/HealthがKubernetesと親和性が高い理由
MicroProfileはコンテナ環境での利用に適していると言われますが、どういった部分が適しているのでしょうか。デファクトスタンダードなコンテナ環境となったKubernetes上で、LauncherなどのMicroProfile規約に準拠した実装を利用した場合に、どのようなメリットがあるかご紹介します。
LivenessとReadiness
Kubernetesにはコンテナの状態を監視する「Liveness Probe」と「Readiness Probe」と呼ばれる活性プローブがあります。
Liveness Probeは、コンテナのヘルスチェックに失敗(例えば、アプリケーションが起動しているのにも関わらず応答できなくなったような状態を検知)すると、Kubernetesにコンテナを再起動させて復旧します。またReadiness Probeは、コンテナのヘルスチェックに失敗(例えば、コンテナがトラフィックを受け入れられない状態を検知)すると、Kubernetesが対象となるコンテナへリクエストを振り分けないようにします。
参考
Liveness Probeを利用する場合、KubernetesのPod定義に対して以下のように定義します。以下の例ではコンテナがリクエストを処理できるか判断する条件として、コンテナを起動してから3秒後に最初のLiveness Probeを実行し、8080ポートをリッスンしているコンテナ内のサーバーに対しHTTPのGETリクエストを発行し、サーバー内の「/health/live」パスに対するハンドラが正常な応答をすることで、Kubernetesのコンテナが稼働しているかを判断します。
livenessProbe:
httpGet:
path: /health/live
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
上記のように、Liveness ProbeとReadiness Probeの判断条件は、Kubernetes利用者が定義する必要があります。
Kubernetesの仕組みを簡単に利用するために、MicroProfileにはMicroProfile HealthというAPIが存在します。このAPIでは、Liveness用の/health/liveとReadiness用の/health/readyのエンドポイントが用意されています。また、@Livenessや@Readinessのアノテーションを利用することにより、判断方法をカスタマイズすることができます。
これを利用することで、KubernetesのLiveness ProbeとReadiness Probeで利用する稼働状態を確認するHTTP APIを簡単に用意できます。
KubernetesのConfigMapとMicroProfile Config
クラウドネイティブの考え方では、環境に依存する情報(接続先のURLなど)をアプリケーションのソースコードから切り離すことが推奨されています。これにより、アプリケーションのソースコードの編集やビルドを行わず、同一のソースコードや実行ライブラリーを利用できます。
開発したアプリケーションを素早く本番環境に展開するためには、設定情報の外出しは重要です。
この環境に依存する情報を切り離すために、Kubernetesでは環境定義を一元管理できる「Config Map」という仕組みが用意されています。Podの定義でコンテナの環境変数にConfig Mapの値をロードすることで、コンテナから環境に依存する情報を外出しすることが可能となります。
参考
同様にアプリケーションではMicroProfile Configを利用することで、環境変数やJavaのシステムプロパティなど外付けの情報をAPIもしくはアノテーションで参照することができます。これを利用してConfig Mapからロードされた環境変数を参照することで、完全に環境に依存しないアプリケーションとすることができます。
環境変数、Javaのシステムプロパティなどに設定された情報は、MicroProfile ConfigのAPIから、設定方法の種類によらず統一的な方法で取得することができます。
@ApplicationScoped
public class ConfigSample {
@Inject
private Config config;
public String getSampleProp() {
return config.getValue("sample.prop", String.class);
}
}
また、@CoonfigPropertyアノテーションを使用して、設定情報をフィールドに注入して利用することもできます。
@ApplicationScoped
public class ConfigSample {
@Inject
@ConfigProperty (name="sample.prop")
private String sampleProp;
}
今後に向けて
MicroProfileがKubernetesの親和性が高いことをご理解いただけたでしょうか?コンテナ技術の利用が今後も拡大し、それに合わせてMicroProfileの機能は今後も拡張が予定されています。今後のMicroProfileの拡張にご期待ください。
本コンテンツに関するお問い合わせ
お電話でのお問い合わせ

Webでのお問い合わせ

当社はセキュリティ保護の観点からSSL技術を使用しております。