此客戶端透過流暢的 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 |