Dev Services for Kubernetes
Dev Services for Kubernetes は、開発モードとテスト実行時にKubernetes APIサーバー(と必要なetcd)を自動的に起動します。そのため、手動で起動する必要はありません。アプリケーションは自動的に設定されます。
以下の testcontainers がサポートされています: kind 、 k3s 、または api only(デフォルト)
Dev Services for Kubernetes の有効化/無効化
Kubernetes Dev Service を使用するには、quarkus-kubernetes-client エクステンションをプロジェクトに追加するだけです。
quarkus extension add kubernetes-client
./mvnw quarkus:add-extension -Dextensions='kubernetes-client'
./gradlew addExtension --extensions='kubernetes-client'
プロジェクトに quarkus-kubernetes-client エクステンションが設定されている場合、開発モードまたはテストモードで Kubernetes API サーバーが自動的に起動されます。しかし、潜在的な混乱を避けるため、dev service がいくつかのケースで無効になることがあります。
-
dev service が
quarkus.kubernetes-client.devservices.enabledをfalseに設定することで明示的に無効になっている場合 -
クライアントが
quarkus.kubernetes-client.api-server-urlを介して特定の API サーバーにアクセスするように明示的に設定されている場合 -
有効な Kube config ファイルが見つかり、その設定がクライアントによって使用される場合。ただし、既存の設定を無視するために
quarkus.kubernetes-client.devservices.override-kubeconfigをtrueに設定することで、dev service を強制的に起動させることも可能です。 -
quarkus-test-kubernetes-client依存関係を含める場合。おそらくそのケースでは、Fabric8 モックサーバーに依存するテストがあり、クラスターを起動する必要がないためです。
| Dev Services for Kubernetes は、サーバーを起動するためにコンテナエンジン(Docker または Podman)に依存しています。お使いの環境がそのようなコンテナエンジンをサポートしていない場合は、VM、クラウドなどで実行されている Kubernetes クラスターを起動する必要があります。この場合、Kube config ファイルを使用するか、Kubernetes client configuration guide で指定されている利用可能な様々なプロパティーを使用して Kubernetes クラスターアクセスを設定できます。 |
共有クラスター
アプリケーションは、同じクラスターへのアクセスを共有する必要があることがよくあります。その目的のために、Dev Services for Kubernetes は、開発モードで実行されている複数の Quarkus アプリケーションが単一のクラスターを共有するための サービス検出 メカニズムを実装しています。
Dev Services for Kubernetes は、API サーバーコンテナーを quarkus-dev-service-kubernetes というラベルで起動し、これにより識別されます。
|
複数の(共有)クラスターが必要な場合は、quarkus.kubernetes-client.devservices.service-name 設定プロパティーに値を指定して、選択したアプリケーション間で共有されるクラスターの名前を指定できます。dev service サポートは、指定された名前の既存のコンテナーを探し、見つからない場合は新しいコンテナーを起動します。デフォルトのサービス名は kubernetes です。
共有は、開発モードではデフォルトで有効ですが、テストモードでは無効です。quarkus.kubernetes-client.devservices.shared=false で共有を無効にできます。
クラスターの設定
Dev Services for Kubernetes は、3 つの異なるフレーバーの Kubernetes クラスターを提供します。各フレーバーは異なる Kubernetes API バージョンをサポートしています。quarkus.kubernetes-client.devservices.flavor および quarkus.kubernetes-client.devservices.api-version プロパティーを使用して、フレーバーとバージョンを設定できます。
quarkus.kubernetes-client.devservices.flavor=api-only # k3s or kind
quarkus.kubernetes-client.devservices.api-version=1.22
quarkus.kubernetes-client.devservices.image-name プロパティーを使用すると、標準イメージ(kind、k3s、api-server)と互換性のあるカスタムイメージを設定することもできます。ただし、これはフレーバーおよび api-version プロパティーと一致している必要があります。
quarkus.kubernetes-client.devservices.flavor=api-only # k3s or kind
quarkus.kubernetes-client.devservices.api-version=1.24.1
quarkus.kubernetes-client.devservices.image-name=quay.io/giantswarm/kube-apiserver:v1.24.1
api-only は Kubernetes API サーバー(と必要な etcd)のみを起動します。Pod を起動できるフル機能の Kubernetes クラスターが必要な場合は、k3s または kind を使用できます。k3s は、コンテナーを privileged mode で起動する必要があります。kind テストコンテナーは、Podman のルートレスモードの使用もサポートするようになりました。
api-version が設定されていない場合は、与えられた flavor の最新バージョンが使用されます。それ以外の場合は、バージョンは 与えられた flavor がサポートするバージョン と一致する必要があります。
クラスターが設定されたら、通常通り簡単にアクセスできます。たとえば、テストでクライアントインスタンスを注入するなどです。
クラスターへのマニフェストの適用
Quarkus では、起動時に Kubernetes マニフェストをクラスター dev service に適用することが可能です。これは、アプリケーションがクラスター内に特定の名前空間や、アプリケーションが対話する特定のカスタムリソース定義などの特定のリソースが存在することを期待する場合に特に役立ちます。
quarkus.kubernetes-client.devservices.manifests プロパティーを使用して、適用するマニフェストを設定できます。このプロパティーは、アプリケーションの resources ディレクトリー内のファイルリストを受け入れます。
例として、example-namespace 名前空間が dev service に存在することを確認するには、/src/main/resources/kubernetes/namespace.yml ファイルを作成します。
apiVersion: v1
kind: Namespace
metadata:
name: example-namespace
次に、application.properties に以下のプロパティーを追加します。
quarkus.kubernetes-client.devservices.manifests=kubernetes/namespace.yaml
複数のプロパティーを適用する場合、次のように適用できます。
quarkus.kubernetes-client.devservices.manifests=kubernetes/first_manifest.yaml,kubernetes/second_manifest.yaml
URL からマニフェストを適用することも可能です。したがって、以下の構文も利用できます。
quarkus.kubernetes-client.devservices.manifests=https://example.com/kubernetes/namespace.yaml
| Quarkus は、リストで指定された順序でマニフェストを適用します。 |
| Quarkus は、次のマニフェストに進む前に、デプロイメントなどのリソースが準備完了になるのを待ちます。すべての適用されたリソースは、アプリケーションが起動を完了するまでに準備が整っていることが保証されます。 |
Helm チャートのデプロイ
quarkus.kubernetes-client.devservices.manifests はマニフェストのみをサポートします。Helm チャートをデプロイしたい場合は、k3s flavor を使用して HelmChart マニフェストをデプロイできます。k3s で Helm チャートを使用する方法の詳細については、 こちら を参照してください。
設定リファレンス
ビルド時に固定される設定プロパティ - その他の設定プロパティは実行時にオーバーライド可能です。
Configuration property |
タイプ |
デフォルト |
|---|---|---|
If Dev Services for Kubernetes should be used. (default to true) If this is true and kubernetes client is not configured then a kubernetes cluster will be started and will be used. Environment variable: Show more |
ブーリアン |
|
The kubernetes api server version to use. If not set, Dev Services for Kubernetes will use the latest supported version of the given flavor. Environment variable: Show more |
string |
|
The kubernetes image to use. If not set, Dev Services for Kubernetes will use default image for the specified Environment variable: Show more |
string |
|
The flavor to use (kind, k3s or api-only). If not set, Dev Services for Kubernetes will set it to: api-only. Environment variable: Show more |
|
|
By default, if a kubeconfig is found, Dev Services for Kubernetes will not start. Set this to true to override the kubeconfig config. Environment variable: Show more |
ブーリアン |
|
A list of manifest file paths that should be applied to the Kubernetes cluster Dev Service on startup. If not set, no manifests are applied. Environment variable: Show more |
list of string |
|
Indicates if the Kubernetes cluster managed by Quarkus Dev Services is shared. When shared, Quarkus looks for running containers using label-based service discovery. If a matching container is found, it is used, and so a second one is not started. Otherwise, Dev Services for Kubernetes starts a new container. The discovery uses the Container sharing is only used in dev mode. Environment variable: Show more |
ブーリアン |
|
The value of the This property is used when you need multiple shared Kubernetes clusters. Environment variable: Show more |
string |
|
Environment variables that are passed to the container. Environment variable: Show more |
Map<String,String> |