CNE Kubernetes Ready: 外部依存関係の設定
Kubernetes Readyデプロイメントは、永続化、検索、オブジェクトストレージ、ライセンス管理、およびシークレット管理のために、外部で管理されるプラットフォームサービスに依存しています。 liferay-default Helm チャートはこれらの依存関係をプロビジョニングしません。 その代わりに、Liferayコンテナに設定を注入する拡張ポイントを提供します。
外部サービスは、Kubernetes Secrets、ConfigMaps、マウントされたファイル、およびHelmの値を介してLiferayに接続します。
これらのパターンでは、データベース、検索、ストレージをポッドの外に移動させることで、LiferayがKubernetes上でステートレスなワークロードとして実行されるようにします。
概念と用語
Kubernetes Ready構成パターンでは、Liferay固有の概念がいくつか使用されています。 以下の抜粋を読む前に、このセクションをざっと読んでください。
OSGi PID: Liferay は OSGi .config ファイルからランタイム構成を読み込みます。 ファイル名は、構成コンポーネントの永続識別子 (PID) と一致します。たとえば、 com.liferay.portal.search.elasticsearch8.configuration.ElasticsearchConfiguration.config のようになります。 Liferay は /opt/liferay/osgi/configs/ を監視し、JVM を再起動せずに変更を適用します。
ポータルプロパティ環境変数エンコーディング: Liferay は環境変数を介してポータルプロパティを受け入れます。 エンコーディングは . を置き換えます _PERIOD_ と、キャメルケースの各大文字が _UPPERCASE<LETTER> で区切られています。 例えば、プロパティ jdbc.default.driverClassName は LIFERAY_JDBC_PERIOD_DEFAULT_PERIOD_DRIVER_UPPERCASEC_LASS_UPPERCASEN_AME になります。 大文字を含むポータルプロパティを設定する場合は、必ずこのルールを使用してください。
${env.X} vs $[env:X]: どちらの構文も実行時に環境変数を解決しますが、解決するファイルは異なります。
${env.VARIABLE_NAME}は、Liferay の portal-properties レイヤー (customEnvの値内で使用) によって解決されます。$[env:VARIABLE_NAME]は OSGi.configプレースホルダー形式です (configmap.dataエントリ内で使用されます)。
両者を混在させるのは意図的なものです。周囲のファイルと一致する形式を使用してください。
B"true" および型付きプロパティ値: OSGi .config 構文では型付き値が必要です: B"true" boolean の場合、 ["a","b"] は配列用、それ以外のものはすべて通常の二重引用符付き文字列です。 型接頭辞を省略すると、パーサーは文字列として処理します。
クラスタリンク: Liferay のクラスタ内通信チャネル (ポート 7800)。StatefulSet レプリカ間のキャッシュ無効化およびクラスタリングメッセージに使用されます。 liferay-default-headless サービスを経由してルーティングされます。 ポート 7800 を外部に公開しないでください。
設定モデル
liferay-default チャートは、Liferay コンテナに設定を注入するためのいくつかの拡張ポイントを公開します。
この表は、標準的なチャート拡張ポイントを定義しています。
| 拡張ポイント | 目的 |
|---|---|
customEnv | 環境変数をコンテナに直接追加します |
customEnvFrom | SecretsまたはConfigMapsから環境変数をインポートします。 |
configmap.data | インラインOSGi構成ファイルを作成します |
customVolumes | Kubernetesボリュームを追加します |
customVolumeMounts | ファイルをコンテナファイルシステムにマウントします |
ほとんどの運用環境では、以下の特定の構成が使用されます。
- 認証情報用のKubernetes Secrets
customEnvFrom環境変数の注入用- OSGi
.configサービス構成用ファイル - 免許証や証明書用のマウントシークレット
秘密管理
Kubernetes Readyで推奨されるパターンは、外部依存関係ごとに個別のSecretを作成することです。
このアプローチにより、認証情報のローテーション、RBACポリシー、ボールトの同期、環境の分離、および運用上のトラブルシューティングが簡素化されます。
標準サンプル構成を作成するには、以下のコマンドを実行してください。
kubectl --namespace liferay create secret generic liferay-database \
--from-literal=DATABASE_HOST=db.internal.example.com \
--from-literal=DATABASE_PORT=5432 \
--from-literal=DATABASE_NAME=lportal \
--from-literal=LIFERAY_JDBC_PERIOD_DEFAULT_PERIOD_USERNAME=liferay \
--from-literal=LIFERAY_JDBC_PERIOD_DEFAULT_PERIOD_PASSWORD='********'
kubectl --namespace liferay create secret generic liferay-search \
--from-literal=ELASTICSEARCH_URL=https://search.internal.example.com:9200 \
--from-literal=ELASTICSEARCH_USERNAME=liferay \
--from-literal=ELASTICSEARCH_PASSWORD='********'
kubectl --namespace liferay create secret generic liferay-object-storage \
--from-literal=S3_BUCKET_NAME=acme-liferay-documents \
--from-literal=S3_BUCKET_REGION=us-east-1 \
--from-literal=S3_ACCESS_KEY_ID=AKIA... \
--from-literal=S3_SECRET_ACCESS_KEY='********'
Gitリポジトリに平文の認証情報を保存しないでください。 本番環境では、外部のシークレット管理システム(External Secrets Operator、HashiCorp Vault、AWS Secrets Manager、Azure Key Vault、Google Secret Manager、Sealed Secretsなど)からシークレットを取得します。
customEnvFrom を使用してシークレットをインポートしています
チャートの customEnvFrom 拡張ポイントは、Secret または ConfigMap のすべてのキーを Liferay コンテナ内の環境変数として挿入します。
この設定では、外部のシークレットをデプロイ環境にマッピングします。
customEnvFrom:
x-liferay-database:
- secretRef:
name: liferay-database
x-liferay-search:
- secretRef:
name: liferay-search
x-liferay-object-storage:
- secretRef:
name: liferay-object-storage
インジェクション後、コンテナは、Liferay の customEnv 設定内の ${env.VARIABLE_NAME} プレースホルダーを介して値を参照します。
${env.DATABASE_HOST}
${env.ELASTICSEARCH_URL}
${env.S3_BUCKET_NAME}
データベース設定
ポータルプロパティにマッピングされた環境変数を使用して、Liferayデータベースへの接続を設定します。
PostgreSQLの設定
この例では、PostgreSQLデータベースの接続マッピングを処理します。
customEnv:
x-liferay-database:
- name: LIFERAY_JDBC_PERIOD_DEFAULT_PERIOD_DRIVER_UPPERCASEC_LASS_UPPERCASEN_AME
value: org.postgresql.Driver
- name: LIFERAY_JDBC_PERIOD_DEFAULT_PERIOD_URL
value: jdbc:postgresql://${env.DATABASE_HOST}:${env.DATABASE_PORT}/${env.DATABASE_NAME}?useUnicode=true&characterEncoding=UTF-8&useFastDateParsing=false
デプロイメントは、 liferay-database Secret から customEnvFrom を介してデータベースのユーザー名とパスワードをロードします。
MySQLの設定
この例では、MySQLデータベース接続のマッピングを処理します。
customEnv:
x-liferay-database:
- name: LIFERAY_JDBC_PERIOD_DEFAULT_PERIOD_DRIVER_UPPERCASEC_LASS_UPPERCASEN_AME
value: com.mysql.cj.jdbc.Driver
- name: LIFERAY_JDBC_PERIOD_DEFAULT_PERIOD_URL
value: jdbc:mysql://${env.DATABASE_HOST}:${env.DATABASE_PORT}/${env.DATABASE_NAME}
デプロイ前に、 Liferay互換性マトリックス に対してデータベースの互換性を確認してください。
検索設定
OSGi .config ファイルを /opt/liferay/osgi/configs にマウントして、Liferay 検索コネクタを設定します。
適切なコネクタの選択は、DXPのバージョンと検索エンジンのバージョンによって異なります。
| DXPバージョン | コネクター |
|---|---|
| DXP 2026.Q1 LTS+ | Elasticsearch 8 |
| DXP 7.3から2025年第4四半期まで | Elasticsearch 7 |
| 任意の(代替案) | OpenSearch |
Elasticsearch 7 の設定
この設定では、Elasticsearch 7 エンジンのアタッチメントを登録します。
configmap:
data:
com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration.config: |
authenticationEnabled=B"true"
httpSSLEnabled=B"true"
networkHostAddresses=["$[env:ELASTICSEARCH_URL]"]
operationMode="REMOTE"
password="$[env:ELASTICSEARCH_PASSWORD]"
productionModeEnabled=B"true"
username="$[env:ELASTICSEARCH_USERNAME]"
customVolumeMounts:
x-liferay-search:
- mountPath: /opt/liferay/osgi/configs/com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration.config
name: liferay-configmap
subPath: com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration.config
Elasticsearch 8 の設定
この設定では、Elasticsearch 8 エンジンのアタッチメントを登録します。
configmap:
data:
com.liferay.portal.search.elasticsearch8.configuration.ElasticsearchConfiguration.config: |
authenticationEnabled=B"true"
httpSSLEnabled=B"true"
networkHostAddresses=["$[env:ELASTICSEARCH_URL]"]
password="$[env:ELASTICSEARCH_PASSWORD]"
productionModeEnabled=B"true"
username="$[env:ELASTICSEARCH_USERNAME]"
customVolumeMounts:
x-liferay-search:
- mountPath: /opt/liferay/osgi/configs/com.liferay.portal.search.elasticsearch8.configuration.ElasticsearchConfiguration.config
name: liferay-configmap
subPath: com.liferay.portal.search.elasticsearch8.configuration.ElasticsearchConfiguration.config
OpenSearchのデプロイメントでは、異なるOSGi PIDと互換性マトリックスが使用されます。
OpenSearchの設定
プラットフォームがElasticsearchではなくOpenSearchを使用している場合は、対応するOSGi PIDを使用してOpenSearchエンジンのアタッチメントを登録してください。
configmap:
data:
com.liferay.portal.search.opensearch2.configuration.OpenSearchConfiguration.config: |
authenticationEnabled=B"true"
networkHostAddresses=["$[env:OPENSEARCH_URL]"]
password="$[env:OPENSEARCH_PASSWORD]"
productionModeEnabled=B"true"
username="$[env:OPENSEARCH_USERNAME]"
customVolumeMounts:
x-liferay-search:
- mountPath: /opt/liferay/osgi/configs/com.liferay.portal.search.opensearch2.configuration.OpenSearchConfiguration.config
name: liferay-configmap
subPath: com.liferay.portal.search.opensearch2.configuration.OpenSearchConfiguration.config
DXP リリースでサポートされている OpenSearch バージョンについては、 Liferay 互換性マトリックス を確認してください。
オブジェクトストレージ構成
本番環境へのデプロイに使用するドキュメントとメディアコンテンツを、Podのファイルシステムではなく、外部オブジェクトストレージに保存します。
S3構成
この例では、外部のAmazon S3ストレージとの統合を扱います。
customEnv:
x-liferay-storage:
- name: LIFERAY_DL_PERIOD_STORE_PERIOD_IMPL
value: com.liferay.portal.store.s3.S3Store
configmap:
data:
com.liferay.portal.store.s3.configuration.S3StoreConfiguration.config: |
bucketName="$[env:S3_BUCKET_NAME]"
s3Region="$[env:S3_BUCKET_REGION]"
accessKey="$[env:S3_ACCESS_KEY_ID]"
secretKey="$[env:S3_SECRET_ACCESS_KEY]"
customVolumeMounts:
x-liferay-storage:
- mountPath: /opt/liferay/osgi/configs/com.liferay.portal.store.s3.configuration.S3StoreConfiguration.config
name: liferay-configmap
subPath: com.liferay.portal.store.s3.configuration.S3StoreConfiguration.config
Google Cloud Storage、Azure Blob Storage、MinIO、およびその他のS3互換APIにも、同等のストレージ実装が存在します。
クラウドワークロードID(IRSA、GKEワークロードID、またはAzure ADワークロードID)を使用する場合は、Secretsから静的アクセスキーを削除し、 accessKey と secretKey をOSGi S3構成から除外します。
OSGi設定ファイルのマウント
Kubernetes Readyデプロイメントで構成値をマウントするには、この標準構造を適用してください。
-
configmap.dataを介して OSGi 設定ファイルを定義します。 -
それらを
/opt/liferay/osgi/configsにマウントします。
このリソース定義は、マウントが完了した例を示しています。
configmap:
data:
com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration.config: |
productionModeEnabled=B"true"
customVolumeMounts:
x-search:
- mountPath: /opt/liferay/osgi/configs/com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration.config
name: liferay-configmap
subPath: com.liferay.portal.search.elasticsearch7.configuration.ElasticsearchConfiguration.config
Liferay は起動時にマウントされた .config ファイルを自動的に読み込みます。
ライセンス構成
LiferayライセンスをKubernetes Secretに保存し、自動デプロイディレクトリにマウントします。
秘密を創造する:
kubectl --namespace liferay create secret generic liferay-license \
--from-file=license.xml=./license.xml
秘密をマウントする:
customEnv:
x-license:
- name: LIFERAY_DISABLE_TRIAL_LICENSE
value: "true"
customVolumes:
x-license:
- name: liferay-license
secret:
secretName: liferay-license
customVolumeMounts:
x-license:
- mountPath: /etc/liferay/mount/files/deploy/license.xml
name: liferay-license
subPath: license.xml
Liferayは起動時にライセンスを自動的にデプロイします。
推奨生産パターン
本番環境向けのKubernetes Readyデプロイメントでは、以下のアーキテクチャ構成が使用されます。
values.yaml
Secrets
├── liferay-database
├── liferay-search
├── liferay-object-storage
└── liferay-license
configmap.data
├── ElasticsearchConfiguration.config
└── S3StoreConfiguration.config
customEnvFrom
└── injects Secrets into the container
customVolumeMounts
└── mounts OSGi configs and license.xml