このクライアントは、流暢な DSL 経由で完全な Kubernetes および OpenShift REST API へのアクセスを提供します。
モジュール | メイブン・セントラル | Javadoc |
---|---|---|
Kubernetesクライアント | ||
openshiftクライアント |
拡張機能 | メイブン・セントラル | Javadoc |
---|---|---|
knativeクライアント | ||
テクトンクライアント | ||
カオスメッシュクライアント | ||
ボリュームスナップショットクライアント | ||
火山クライアント | ||
istioクライアント | ||
オープンクラスター管理クライアント |
クライアントを作成する最も簡単な方法は次のとおりです。
KubernetesClient client = new KubernetesClientBuilder (). build ();
DefaultOpenShiftClient
KubernetesClient
とOpenShiftClient
インターフェースの両方を実装しているため、 Build
などの OpenShift 拡張機能が必要な場合は、次のようにするだけです。
OpenShiftClient osClient = new KubernetesClientBuilder (). build (). adapt ( OpenShiftClient . class );
これにより、さまざまなソースからの設定が次の優先順位で使用されます。
システム プロパティは環境変数よりも優先されます。次のシステム プロパティと環境変数を構成に使用できます。
プロパティ/環境変数 | 説明 | デフォルト値 |
---|---|---|
kubernetes.disable.autoConfig / KUBERNETES_DISABLE_AUTOCONFIG | 自動構成を無効にする (KubernetesClient は~/.kube/config 、マウントされた ServiceAccount、環境変数、または Kubernetes クラスター情報のシステム プロパティを調べません) | false |
kubernetes.master / KUBERNETES_MASTER | Kubernetes マスター URL | https://kubernetes.default.svc |
kubernetes.api.version / KUBERNETES_API_VERSION | APIバージョン | v1 |
openshift.url / OPENSHIFT_URL | OpenShift マスター URL | Kubernetes マスター URL 値 |
kubernetes.oapi.version / KUBERNETES_OAPI_VERSION | OpenShift API バージョン | v1 |
kubernetes.trust.certificates / KUBERNETES_TRUST_CERTIFICATES | すべての証明書を信頼する | false |
kubernetes.disable.hostname.verification / KUBERNETES_DISABLE_HOSTNAME_VERIFICATION | false | |
kubernetes.certs.ca.file / KUBERNETES_CERTS_CA_FILE | ||
kubernetes.certs.ca.data / KUBERNETES_CERTS_CA_DATA | ||
kubernetes.certs.client.file / KUBERNETES_CERTS_CLIENT_FILE | ||
kubernetes.certs.client.data / KUBERNETES_CERTS_CLIENT_DATA | ||
kubernetes.certs.client.key.file / KUBERNETES_CERTS_CLIENT_KEY_FILE | ||
kubernetes.certs.client.key.data / KUBERNETES_CERTS_CLIENT_KEY_DATA | ||
kubernetes.certs.client.key.algo / KUBERNETES_CERTS_CLIENT_KEY_ALGO | クライアントキー暗号化アルゴリズム | RSA |
kubernetes.certs.client.key.passphrase / KUBERNETES_CERTS_CLIENT_KEY_PASSPHRASE | ||
kubernetes.auth.basic.username / KUBERNETES_AUTH_BASIC_USERNAME | ||
kubernetes.auth.basic.password / KUBERNETES_AUTH_BASIC_PASSWORD | ||
kubernetes.auth.serviceAccount.token / KUBERNETES_AUTH_SERVICEACCOUNT_TOKEN | サービスアカウントトークンファイルの名前 | /var/run/secrets/kubernetes.io/serviceaccount/token |
kubernetes.auth.tryKubeConfig / KUBERNETES_AUTH_TRYKUBECONFIG | Kubernetes 構成を使用してクライアントを構成する | true |
kubeconfig / KUBECONFIG | 読み取るkubernetes構成ファイルの名前 | ~/.kube/config |
kubernetes.auth.tryServiceAccount / KUBERNETES_AUTH_TRYSERVICEACCOUNT | サービスアカウントからクライアントを設定する | true |
kubernetes.tryNamespacePath / KUBERNETES_TRYNAMESPACEPATH | Kubernetes サービス アカウントの名前空間パスからクライアントの名前空間を構成する | true |
kubernetes.auth.token / KUBERNETES_AUTH_TOKEN | ||
kubernetes.watch.reconnectInterval / KUBERNETES_WATCH_RECONNECTINTERVAL | 再接続間隔をミリ秒単位で監視する | 1000 |
kubernetes.watch.reconnectLimit / KUBERNETES_WATCH_RECONNECTLIMIT | 再接続試行回数 (無限の場合は -1) | -1 |
kubernetes.connection.timeout / KUBERNETES_CONNECTION_TIMEOUT | 接続タイムアウト (ミリ秒単位) (タイムアウトなしの場合は 0) | 10000 |
kubernetes.request.timeout / KUBERNETES_REQUEST_TIMEOUT | 読み取りタイムアウト (ミリ秒) | 10000 |
kubernetes.upload.connection.timeout / KUBERNETES_UPLOAD_CONNECTION_TIMEOUT | ポッドのアップロード接続タイムアウト (ミリ秒) | 10000 |
kubernetes.upload.request.timeout / KUBERNETES_UPLOAD_REQUEST_TIMEOUT | ポッドアップロードリクエストのタイムアウト(ミリ秒) | 120000 |
kubernetes.request.retry.backoffLimit / KUBERNETES_REQUEST_RETRY_BACKOFFLIMIT | 再試行回数 (無限の場合は -1) | 10 |
kubernetes.request.retry.backoffInterval / KUBERNETES_REQUEST_RETRY_BACKOFFINTERVAL | 初期バックオフ間隔をミリ秒単位で再試行します | 100 |
kubernetes.rolling.timeout / KUBERNETES_ROLLING_TIMEOUT | ローリングタイムアウト(ミリ秒) | 900000 |
kubernetes.logging.interval / KUBERNETES_LOGGING_INTERVAL | ロギング間隔(ミリ秒) | 20000 |
kubernetes.scale.timeout / KUBERNETES_SCALE_TIMEOUT | スケールタイムアウト (ミリ秒) | 600000 |
kubernetes.websocket.timeout / KUBERNETES_WEBSOCKET_TIMEOUT | WebSocket タイムアウト (ミリ秒) | 5000 |
kubernetes.websocket.ping.interval / KUBERNETES_WEBSOCKET_PING_INTERVAL | Websocket ping 間隔 (ミリ秒) | 30000 |
kubernetes.max.concurrent.requests / KUBERNETES_MAX_CONCURRENT_REQUESTS | 64 | |
kubernetes.max.concurrent.requests.per.host / KUBERNETES_MAX_CONCURRENT_REQUESTS_PER_HOST | 5 | |
kubernetes.impersonate.username / KUBERNETES_IMPERSONATE_USERNAME | Impersonate-User HTTP ヘッダー値 | |
kubernetes.impersonate.group / KUBERNETES_IMPERSONATE_GROUP | Impersonate-Group HTTP ヘッダー値 | |
kubernetes.tls.versions / KUBERNETES_TLS_VERSIONS | TLS バージョンを, で区切る | TLSv1.2,TLSv1.3 |
kubernetes.truststore.file / KUBERNETES_TRUSTSTORE_FILE | ||
kubernetes.truststore.passphrase / KUBERNETES_TRUSTSTORE_PASSPHRASE | ||
kubernetes.keystore.file / KUBERNETES_KEYSTORE_FILE | ||
kubernetes.keystore.passphrase / KUBERNETES_KEYSTORE_PASSPHRASE | ||
kubernetes.backwardsCompatibilityInterceptor.disable / KUBERNETES_BACKWARDSCOMPATIBILITYINTERCEPTOR_DISABLE | BackwardsCompatibilityInterceptor 無効にする | true |
no.proxy / NO_PROXY | ドメイン拡張子プロキシのカンマ区切りリストは、次の用途には使用しないでください。 | |
http.proxy / HTTP_PROXY | HTTP リクエストのプロキシへの URL (「プロキシの優先順位」を参照) | |
https.proxy / HTTPS_PROXY | HTTPS リクエストのプロキシへの URL (「プロキシの優先順位」を参照) |
あるいは、 ConfigBuilder
使用して Kubernetes クライアントの構成オブジェクトを作成することもできます。
Config config = new ConfigBuilder (). withMasterUrl ( "https://mymaster.com" ). build ();
KubernetesClient client = new KubernetesClientBuilder (). withConfig ( config ). build ();
DSL の使用はすべてのリソースで同じです。
リソースをリストします。
NamespaceList myNs = client . namespaces (). list ();
ServiceList myServices = client . services (). list ();
ServiceList myNsServices = client . services (). inNamespace ( "default" ). list ();
リソースを取得します。
Namespace myns = client . namespaces (). withName ( "myns" ). get ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). get ();
消去:
Namespace myns = client . namespaces (). withName ( "myns" ). delete ();
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). delete ();
リソースの編集には、Kubernetes モデルのインライン ビルダーを使用します。
Namespace myns = client . namespaces (). withName ( "myns" ). edit ( n -> new NamespaceBuilder ( n )
. editMetadata ()
. addToLabels ( "a" , "label" )
. endMetadata ()
. build ());
Service myservice = client . services (). inNamespace ( "default" ). withName ( "myservice" ). edit ( s -> new ServiceBuilder ( s )
. editMetadata ()
. addToLabels ( "another" , "label" )
. endMetadata ()
. build ());
同じ精神で、ビルダーをインライン化して以下を作成できます。
Namespace myns = client . namespaces (). create ( new NamespaceBuilder ()
. withNewMetadata ()
. withName ( "myns" )
. addToLabels ( "a" , "label" )
. endMetadata ()
. build ());
Service myservice = client . services (). inNamespace ( "default" ). create ( new ServiceBuilder ()
. withNewMetadata ()
. withName ( "myservice" )
. addToLabels ( "another" , "label" )
. endMetadata ()
. build ());
SecurityContextConstraints の場合と同様に、リソースの apiVersion を設定することもできます。
SecurityContextConstraints scc = new SecurityContextConstraintsBuilder ()
. withApiVersion ( "v1" )
. withNewMetadata (). withName ( "scc" ). endMetadata ()
. withAllowPrivilegedContainer ( true )
. withNewRunAsUser ()
. withType ( "RunAsAny" )
. endRunAsUser ()
. build ();
Watcher の T としてio.fabric8.kubernetes.api.model.Event
を使用します。
client . events (). inAnyNamespace (). watch ( new Watcher <>() {
@ Override
public void eventReceived ( Action action , Event resource ) {
System . out . println ( "event " + action . name () + " " + resource . toString ());
}
@ Override
public void onClose ( WatcherException cause ) {
System . out . println ( "Watcher close due to " + cause );
}
});
kubernetes API は、 daemonSets
、 jobs
、 ingresses
などの一連の拡張機能を定義しており、これらはすべてextensions()
DSL で使用できます。
たとえば、ジョブをリストするには...
jobs = client.batch().jobs().list();
クライアント DSL を使用してリソースを定義するのではなく、外部ソースからリソースを読み取りたい場合があります。このような場合、クライアントは次の場所からリソースをロードできるようにします。
リソースが読み込まれると、自分で作成した場合と同じように扱うことができます。
たとえば、yml ファイルからポッドを読み取り、それを操作してみましょう。
Pod refreshed = client.load('/path/to/a/pod.yml').fromServer().get();
client.load('/workspace/pod.yml').delete();
LogWatch handle = client.load('/workspace/pod.yml').watchLog(System.out);
同じ精神で、外部で作成されたオブジェクト (参照またはその文字列表現のいずれか) を使用できます。
例えば:
Pod pod = someThirdPartyCodeThatCreatesAPod();
client.resource(pod).delete();
クライアントはプラグ可能なアダプターをサポートします。アダプターの例は、既存の KubernetesClient インスタンスを OpenShiftClient インスタンスに適応させる OpenShift アダプターです。
例えば:
KubernetesClient client = new KubernetesClientBuilder (). build ();
OpenShiftClient oClient = client . adapt ( OpenShiftClient . class );
クライアントは、適応が可能かどうかをチェックし、可能であれば true を返す isAdaptable() メソッドもサポートします。
KubernetesClient client = new KubernetesClientBuilder (). build ();
if ( client . isAdaptable ( OpenShiftClient . class )) {
OpenShiftClient oClient = client . adapt ( OpenShiftClient . class );
} else {
throw new Exception ( "Adapting to OpenShiftClient not support. Check if adapter is present, and that env provides /oapi root path." );
}
adapt() を使用する場合、アダプティとターゲットの両方が同じリソース (基礎となる http クライアント、スレッド プールなど) を共有することに注意してください。これは、adapt によって作成されたすべての単一インスタンスで close() を使用する必要がないことを意味します。 adapt() マネージド インスタンスまたは元のインスタンスのいずれかで close() を呼び出すと、すべてのリソースが適切にクリーンアップされるため、どのインスタンスも使用できなくなります。
このプロジェクトでは、クライアントとともに、テスト目的で使用できる kubernetes モック サーバーも提供します。モック サーバーはhttps://github.com/square/okhttp/tree/master/mockwebserver
に基づいていますが、DSL とhttps://github.com/fabric8io/mockwebserver
によって提供される機能によって強化されています。
モック Web サーバーには 2 つの動作モードがあります。
これは、期待される http リクエストと、各リクエストに対する応答となるべきものを最初に設定する典型的なモードです。使用方法の詳細については、https://github.com/fabric8io/mockwebserver を参照してください。
このモードは、クライアント自体のテストに広く使用されています。 kubernetes-test を必ず確認してください。
Kubernetes サーバーをテストに追加するには:
@ Rule
public KubernetesServer server = new KubernetesServer ();
すべてのリクエストとレスポンスを定義するのは面倒になる場合があります。ほとんどの場合、モック Web サーバーは単純な crud ベースの操作を実行するために使用されることを考慮して、crud モードが追加されました。 crud モードを使用する場合、モック Web サーバーはメモリ内マップを使用して Kubernetes リソースを保存、読み取り、更新、削除し、実際の API サーバーのように表示されます。
Kubernetes サーバーを crud モードでテストに追加するには:
@ Rule
public KubernetesServer server = new KubernetesServer ( true , true );
その後、次のようにサーバーを使用できます。
@ Test
public void testInCrudMode () {
KubernetesClient client = server . getClient ();
final CountDownLatch deleteLatch = new CountDownLatch ( 1 );
final CountDownLatch closeLatch = new CountDownLatch ( 1 );
//CREATE
client . pods (). inNamespace ( "ns1" ). create ( new PodBuilder (). withNewMetadata (). withName ( "pod1" ). endMetadata (). build ());
//READ
podList = client . pods (). inNamespace ( "ns1" ). list ();
assertNotNull ( podList );
assertEquals ( 1 , podList . getItems (). size ());
//WATCH
Watch watch = client . pods (). inNamespace ( "ns1" ). withName ( "pod1" ). watch ( new Watcher <>() {
@ Override
public void eventReceived ( Action action , Pod resource ) {
switch ( action ) {
case DELETED :
deleteLatch . countDown ();
break ;
default :
throw new AssertionFailedError ( action . toString (). concat ( " isn't recognised." ));
}
}
@ Override
public void onClose ( WatcherException cause ) {
closeLatch . countDown ();
}
});
//DELETE
client . pods (). inNamespace ( "ns1" ). withName ( "pod1" ). delete ();
//READ AGAIN
podList = client . pods (). inNamespace ( "ns1" ). list ();
assertNotNull ( podList );
assertEquals ( 0 , podList . getItems (). size ());
assertTrue ( deleteLatch . await ( 1 , TimeUnit . MINUTES ));
watch . close ();
assertTrue ( closeLatch . await ( 1 , TimeUnit . MINUTES ));
}
JUnit5 では KubernetesClient モック メカニズムを使用できます。 @Rule
と@ClassRule
をサポートしていないため、専用のアノテーション@EnableKubernetesMockClient
があります。テストごとにモック化されたKubernetesClient
のインスタンス (JUnit4 @Rule
) を作成したい場合は、以下に示すようにKubernetesClient
のインスタンスを宣言する必要があります。
@ EnableKubernetesMockClient
class ExampleTest {
KubernetesClient client ;
@ Test
public void testInStandardMode () {
...
}
}
すべてのテスト (JUnit4 @ClassRule
) ごとにモックされたサーバーの静的インスタンスを定義したい場合は、以下に示すようにKubernetesClient
のインスタンスを宣言する必要があります。注釈フィールドcrud
使用して crudMode を有効にすることもできます。
@ EnableKubernetesMockClient ( crud = true )
class ExampleTest {
static KubernetesClient client ;
@ Test
public void testInCrudMode () {
// ...
}
}
実際の Kubernetes API に対してテストするために、プロジェクトは軽量のアプローチを提供し、Kubernetes API サーバーと etcd バイナリを起動します。
@ EnableKubeAPIServer
class KubeAPITestSample {
static KubernetesClient client ;
@ Test
void testWithClient () {
// test using the client against real K8S API Server
}
}
詳細については、Kube API テストのドキュメントを参照してください。
v5.5 以降、Kubernetes クライアントは、サポートされているすべてのKubernetes クラスター バージョンと互換性がある必要があります。最も一般的に使用される Kubernetes リソース用の DSL メソッド ( client.pods()
、 client.namespaces()
など) を提供します。探しているリソースが DSL 経由で利用できない場合は、いつでも汎用のclient.resource()
メソッドを使用してリソースと対話できます。新しい問題を開いて、DSL への新しいリソースの追加をリクエストすることもできます。
すべてのバニラ Kubernetes リソース (および一部の拡張機能) に対して、Kubernetes Java モデル タイプ (例: Pod
) とそれに対応するビルダー (例: PodBuilder
) を提供します。特定のリソースが見つからず、それが Kubernetes クライアントの一部であるべきだと思われる場合は、新しい問題を開いてください。
v5.5 以降、OpenShift クライアントは、Red Hat が現在サポートしている OpenShift クラスターのバージョンと互換性がある必要があります。 Fabric8 Kubernetes クライアントは、サポートされている OpenShift クラスターのバージョンを完全にサポートする数少ない Kubernetes Java クライアントの 1 つです。互換性のないものや不足しているものを見つけた場合は、新しい問題を開いてください。
ここで使用されるすべてのリソース オブジェクトは OpenShift 3.9.0 および Kubernetes 1.9.0 に準拠します。すべてのリソース オブジェクトは、OpenShift 3.9.0 および Kubernetes 1.9.0 に従ってすべてのフィールドを提供します。
batch
とextensions
の両方にあります (拡張機能は非推奨です)apps
とextensions
の両方にあります (拡張機能は非推奨です)apps
とextensions
の両方にあります (拡張機能は非推奨です)apps
とextensions
の両方にあります (拡張機能は非推奨です)network
とextensions
の両方にあります (拡張機能は非推奨です)client base DSL
からstorage
DSL に移動されましたclient base DSL
およびextensions
からextensions
のみに移動されました拡張機能:
フレームワーク/ライブラリ/ツール:
CI プラグイン:
ビルドツール:
プラットフォーム:
独自のプラットフォーム:
私たちのコミュニティが成長するにつれて、私たちはユーザーを追跡し続けたいと考えています。あなたの組織/コミュニティ名を記載した PR を送信してください。
新しいプル リクエストごとに実行されるテスト用の Github Actions と Jenkins のリンクがあります。最近のビルドをすべて表示することもできます。
リリースに関する最新情報を入手するには、https://groups.google.com/forum/embed/?place=forum/fabric8-devclients に参加してください。
この表はkubectl
Kubernetes Java クライアントへのマッピングを示しています。ほとんどのマッピングは非常に簡単で、ワンライナーの操作です。ただし、同じ結果を得るために若干のコードが必要になる場合もあります。
クベクトル | Fabric8 Kubernetes クライアント |
---|---|
kubectl config view | ConfigViewEquivalent.java |
kubectl config get-contexts | ConfigGetContextsEquivalent.java |
kubectl config current-context | ConfigGetCurrentContextEquivalent.java |
kubectl config use-context minikube | ConfigUseContext.java |
kubectl config view -o jsonpath='{.users[*].name}' | ConfigGetCurrentContextEquivalent.java |
kubectl get pods --all-namespaces | PodListGlobalEquivalent.java |
kubectl get pods | PodListEquivalent.java |
kubectl get pods -w | PodWatchEquivalent.java |
kubectl get pods --sort-by='.metadata.creationTimestamp' | PodListGlobalEquivalent.java |
kubectl run | PodRunEquivalent.java |
kubectl create -f test-pod.yaml | PodCreateYamlEquivalent.java |
kubectl exec my-pod -- ls / | PodExecEquivalent.java |
kubectl attach my-pod | PodAttachEquivalent.java |
kubectl delete pod my-pod | ポッド削除.java |
kubectl delete -f test-pod.yaml | PodDeleteViaYaml.java |
kubectl cp /foo_dir my-pod:/bar_dir | UploadDirectoryToPod.java |
kubectl cp my-pod:/tmp/foo /tmp/bar | FileFromPod.java をダウンロード |
kubectl cp my-pod:/tmp/foo -c c1 /tmp/bar | FileFromMultiContainerPod.java をダウンロード |
kubectl cp /foo_dir my-pod:/tmp/bar_dir | UploadFileToPod.java |
kubectl logs pod/my-pod | PodLogsEquivalent.java |
kubectl logs pod/my-pod -f | PodLogsFollowEquivalent.java |
kubectl logs pod/my-pod -c c1 | PodLogsMultiContainerEquivalent.java |
kubectl port-forward my-pod 8080:80 | PortForwardEquivalent.java |
kubectl get pods --selector=version=v1 -o jsonpath='{.items[*].metadata.name}' | PodListFilterByLabel.java |
kubectl get pods --field-selector=status.phase=Running | PodListFilterFieldSelector.java |
kubectl get pods --show-labels | PodShowLabels.java |
kubectl label pods my-pod new-label=awesome | PodAddLabel.java |
kubectl annotate pods my-pod icon-url=http://goo.gl/XXBTWq | PodAddAnnotation.java |
kubectl get configmap cm1 -o jsonpath='{.data.database}' | ConfigMapJsonPathEquivalent.java |
kubectl create -f test-svc.yaml | LoadAndCreateService.java |
kubectl create -f test-deploy.yaml | LoadAndCreateDeployment.java |
kubectl set image deploy/d1 nginx=nginx:v2 | RolloutSetImageEquivalent.java |
kubectl scale --replicas=4 deploy/nginx-deployment | ScaleEquivalent.java |
kubectl scale statefulset --selector=app=my-database --replicas=4 | ScaleWithLabelsEquivalent.java |
kubectl rollout restart deploy/d1 | RolloutRestartEquivalent.java |
kubectl rollout pause deploy/d1 | RolloutPauseEquivalent.java |
kubectl rollout resume deploy/d1 | RolloutResumeEquivalent.java |
kubectl rollout undo deploy/d1 | RolloutUndoEquivalent.java |
kubectl create -f test-crd.yaml | LoadAndCreateCustomResourceDefinition.java |
kubectl create -f customresource.yaml | CustomResourceCreateDemo.java |
kubectl create -f customresource.yaml | CustomResourceCreateDemoTypeless.java |
kubectl get ns | NamespaceListEquivalent.java |
kubectl create namespace test | NamespaceCreateEquivalent.java |
kubectl apply -f test-resource-list.yml | CreateOrReplaceResourceList.java |
kubectl get events | EventsGetEquivalent.java |
kubectl top nodes | TopEquivalent.java |
kubectl auth can-i create deployment.apps | CanIEquivalent.java |
kubectl create -f test-csr-v1.yml | CertificateSigningRequestCreateYamlEquivalent.java |
kubectl certificate approve my-cert | CertificateSigningRequestApproveYamlEquivalent.java |
kubectl certificate deny my-cert | CertificateSigningRequestDenyYamlEquivalent.java |
kubectl create -f quota.yaml --namespace=default | CreateResourceQuotaInNamespaceYamlEquivalent.java |