该客户端通过流畅的 DSL 提供对完整 Kubernetes 和 OpenShift REST API 的访问。
模块 | 梅文中心 | Java文档 |
---|---|---|
kubernetes 客户端 | ||
openshift-客户端 |
扩展 | 梅文中心 | Java文档 |
---|---|---|
原生客户端 | ||
tekton 客户端 | ||
Chaosmesh 客户端 | ||
卷快照客户端 | ||
火山客户端 | ||
istio-客户端 | ||
打开集群管理客户端 |
创建客户端的最简单方法是:
KubernetesClient client = new KubernetesClientBuilder (). build ();
DefaultOpenShiftClient
实现了KubernetesClient
和OpenShiftClient
接口,因此如果您需要 OpenShift 扩展(例如Build
等),则只需执行以下操作:
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 | Pod 上传连接超时(以毫秒为单位) | 10000 |
kubernetes.upload.request.timeout / KUBERNETES_UPLOAD_REQUEST_TIMEOUT | Pod 上传请求超时(以毫秒为单位) | 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 ());
您还可以设置资源的 apiVersion,就像 SecurityContextConstraints 的情况一样:
SecurityContextConstraints scc = new SecurityContextConstraintsBuilder ()
. withApiVersion ( "v1" )
. withNewMetadata (). withName ( "scc" ). endMetadata ()
. withAllowPrivilegedContainer ( true )
. withNewRunAsUser ()
. withType ( "RunAsAny" )
. endRunAsUser ()
. build ();
使用io.fabric8.kubernetes.api.model.Event
作为 Watcher 的 T:
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 并使用它:
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();
客户端支持可插拔适配器。 OpenShift Adapter 就是一个示例适配器,它允许将现有 KubernetesClient 实例调整为 OpenShiftClient 实例。
例如:
KubernetesClient client = new KubernetesClientBuilder (). build ();
OpenShiftClient oClient = client . adapt ( OpenShiftClient . class );
客户端还支持 isAdaptable() 方法,该方法检查适配是否可行,如果可行则返回 true。
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
但由https://github.com/fabric8io/mockwebserver
提供的 DSL 和功能提供支持。
模拟 Web 服务器有两种操作模式:
这是典型的模式,您首先设置哪些是预期的 http 请求,哪些应该是每个请求的响应。有关使用的更多详细信息,请访问:https://github.com/fabric8io/mockwebserver
这种模式已广泛用于测试客户端本身。确保检查 kubernetes-test。
要将 Kubernetes 服务器添加到您的测试中:
@ Rule
public KubernetesServer server = new KubernetesServer ();
定义每一个请求和响应可能会变得很烦人。鉴于在大多数情况下,模拟网络服务器用于执行简单的基于 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 ));
}
您可以将 KubernetesClient 模拟机制与 JUnit5 结合使用。由于它不支持@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 客户端之一。如果您发现任何不兼容或缺失的内容,请打开一个新问题。
这里使用的所有资源对象都将遵循 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
DSLclient base DSL
和extensions
转移到仅extensions
扩展:
框架/库/工具:
CI 插件:
构建工具:
平台:
专有平台:
随着我们社区的发展,我们希望跟踪我们的用户。请发送包含您的组织/社区名称的 PR。
有 Github Actions 和 Jenkins 的链接,用于针对每个新的 Pull 请求运行的测试。您还可以查看所有最近的版本。
要获取有关版本的更新,您可以加入 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 | PodDelete.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 | DownloadFileFromPod.java |
kubectl cp my-pod:/tmp/foo -c c1 /tmp/bar | DownloadFileFromMultiContainerPod.java |
kubectl cp /foo_dir my-pod:/tmp/bar_dir | 上传文件到Pod.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 | 命名空间ListEquivalent.java |
kubectl create namespace test | 命名空间CreateEquivalent.java |
kubectl apply -f test-resource-list.yml | 创建或替换资源列表.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 |