You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@kyuubi.apache.org by ch...@apache.org on 2023/03/07 06:02:36 UTC

[kyuubi] branch master updated: [KYUUBI #4453][Improvement][K8S] Bump Kubernetes Client Version to 6.4.1

This is an automated email from the ASF dual-hosted git repository.

chengpan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kyuubi.git


The following commit(s) were added to refs/heads/master by this push:
     new 1bc05e5e4 [KYUUBI #4453][Improvement][K8S] Bump Kubernetes Client Version to 6.4.1
1bc05e5e4 is described below

commit 1bc05e5e45838cbff206db7438ba7f357bf127a7
Author: zwangsheng <22...@qq.com>
AuthorDate: Tue Mar 7 14:02:26 2023 +0800

    [KYUUBI #4453][Improvement][K8S] Bump Kubernetes Client Version to 6.4.1
    
    ### _Why are the changes needed?_
    
    Close #4453
    
    kubernetes client [compare](https://github.com/fabric8io/kubernetes-client/compare/v5.12.1...v6.4.1)
    
    version | K8s 1.26.0 | K8s 1.25.3 | K8s 1.24.7 | K8s 1.23.13 | K8s 1.22.1 | K8s 1.21.1 | K8s 1.20.2 | K8s 1.19.1 | K8s 1.18.0 | K8s 1.17.0 | K8s 1.16.0 | K8s 1.15.3 | K8s 1.14.2 | K8s 1.12.0 | K8s 1.11.0 | K8s 1.10.0 | K8s 1.9.0
    --|-- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | --
    kubernetes-client 6.4.1 |   | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | -
    kubernetes-client 5.12.1 |   |   |   | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | -
    
    ### _How was this patch tested?_
    - [ ] Add some test cases that check the changes thoroughly including negative and positive cases if possible
    
    - [ ] Add screenshots for manual tests if appropriate
    
    - [ ] [Run test](https://kyuubi.readthedocs.io/en/master/develop_tools/testing.html#running-tests) locally before make a pull request
    
    - [x] [Run ci test]
    
    Closes #4456 from zwangsheng/bump/kubernetes-client-6.4.1.
    
    Closes #4453
    
    39039f0f9 [zwangsheng] [KYUUBI #4453] Remove dup dependence
    4a5b27ce8 [zwangsheng] [KYUUBI #4453] IT test with same logic
    95a292f99 [zwangsheng] [KYUUBI #4453] Fix Dependency
    e4bf0107e [zwangsheng] [KYUUBI #4453] Init Bump
    
    Authored-by: zwangsheng <22...@qq.com>
    Signed-off-by: Cheng Pan <ch...@apache.org>
---
 dev/dependencyList                                 | 47 +++++++++++-----------
 integration-tests/kyuubi-kubernetes-it/pom.xml     |  6 ---
 .../apache/kyuubi/kubernetes/test/MiniKube.scala   | 21 ++++++++--
 .../test/WithKyuubiServerOnKubernetes.scala        |  4 +-
 kyuubi-server/pom.xml                              |  5 +++
 .../engine/KubernetesApplicationOperation.scala    | 28 ++++++-------
 .../org/apache/kyuubi/util/KubernetesUtils.scala   |  7 +++-
 pom.xml                                            | 12 +++++-
 8 files changed, 79 insertions(+), 51 deletions(-)

diff --git a/dev/dependencyList b/dev/dependencyList
index ff2550804..509e28405 100644
--- a/dev/dependencyList
+++ b/dev/dependencyList
@@ -22,7 +22,6 @@ annotations/4.1.1.4//annotations-4.1.1.4.jar
 antlr-runtime/3.5.3//antlr-runtime-3.5.3.jar
 antlr4-runtime/4.9.3//antlr4-runtime-4.9.3.jar
 aopalliance-repackaged/2.6.1//aopalliance-repackaged-2.6.1.jar
-automaton/1.11-8//automaton-1.11-8.jar
 classgraph/4.8.138//classgraph-4.8.138.jar
 commons-codec/1.15//commons-codec-1.15.jar
 commons-collections/3.2.2//commons-collections-3.2.2.jar
@@ -37,7 +36,6 @@ error_prone_annotations/2.14.0//error_prone_annotations-2.14.0.jar
 failsafe/2.4.4//failsafe-2.4.4.jar
 failureaccess/1.0.1//failureaccess-1.0.1.jar
 fliptables/1.0.2//fliptables-1.0.2.jar
-generex/1.0.2//generex-1.0.2.jar
 grpc-api/1.48.0//grpc-api-1.48.0.jar
 grpc-context/1.48.0//grpc-context-1.48.0.jar
 grpc-core/1.48.0//grpc-core-1.48.0.jar
@@ -104,27 +102,30 @@ jetty-util-ajax/9.4.50.v20221201//jetty-util-ajax-9.4.50.v20221201.jar
 jetty-util/9.4.50.v20221201//jetty-util-9.4.50.v20221201.jar
 jline/0.9.94//jline-0.9.94.jar
 jul-to-slf4j/1.7.36//jul-to-slf4j-1.7.36.jar
-kubernetes-client/5.12.1//kubernetes-client-5.12.1.jar
-kubernetes-model-admissionregistration/5.12.1//kubernetes-model-admissionregistration-5.12.1.jar
-kubernetes-model-apiextensions/5.12.1//kubernetes-model-apiextensions-5.12.1.jar
-kubernetes-model-apps/5.12.1//kubernetes-model-apps-5.12.1.jar
-kubernetes-model-autoscaling/5.12.1//kubernetes-model-autoscaling-5.12.1.jar
-kubernetes-model-batch/5.12.1//kubernetes-model-batch-5.12.1.jar
-kubernetes-model-certificates/5.12.1//kubernetes-model-certificates-5.12.1.jar
-kubernetes-model-common/5.12.1//kubernetes-model-common-5.12.1.jar
-kubernetes-model-coordination/5.12.1//kubernetes-model-coordination-5.12.1.jar
-kubernetes-model-core/5.12.1//kubernetes-model-core-5.12.1.jar
-kubernetes-model-discovery/5.12.1//kubernetes-model-discovery-5.12.1.jar
-kubernetes-model-events/5.12.1//kubernetes-model-events-5.12.1.jar
-kubernetes-model-extensions/5.12.1//kubernetes-model-extensions-5.12.1.jar
-kubernetes-model-flowcontrol/5.12.1//kubernetes-model-flowcontrol-5.12.1.jar
-kubernetes-model-metrics/5.12.1//kubernetes-model-metrics-5.12.1.jar
-kubernetes-model-networking/5.12.1//kubernetes-model-networking-5.12.1.jar
-kubernetes-model-node/5.12.1//kubernetes-model-node-5.12.1.jar
-kubernetes-model-policy/5.12.1//kubernetes-model-policy-5.12.1.jar
-kubernetes-model-rbac/5.12.1//kubernetes-model-rbac-5.12.1.jar
-kubernetes-model-scheduling/5.12.1//kubernetes-model-scheduling-5.12.1.jar
-kubernetes-model-storageclass/5.12.1//kubernetes-model-storageclass-5.12.1.jar
+kubernetes-client-api/6.4.1//kubernetes-client-api-6.4.1.jar
+kubernetes-client/6.4.1//kubernetes-client-6.4.1.jar
+kubernetes-httpclient-okhttp/6.4.1//kubernetes-httpclient-okhttp-6.4.1.jar
+kubernetes-model-admissionregistration/6.4.1//kubernetes-model-admissionregistration-6.4.1.jar
+kubernetes-model-apiextensions/6.4.1//kubernetes-model-apiextensions-6.4.1.jar
+kubernetes-model-apps/6.4.1//kubernetes-model-apps-6.4.1.jar
+kubernetes-model-autoscaling/6.4.1//kubernetes-model-autoscaling-6.4.1.jar
+kubernetes-model-batch/6.4.1//kubernetes-model-batch-6.4.1.jar
+kubernetes-model-certificates/6.4.1//kubernetes-model-certificates-6.4.1.jar
+kubernetes-model-common/6.4.1//kubernetes-model-common-6.4.1.jar
+kubernetes-model-coordination/6.4.1//kubernetes-model-coordination-6.4.1.jar
+kubernetes-model-core/6.4.1//kubernetes-model-core-6.4.1.jar
+kubernetes-model-discovery/6.4.1//kubernetes-model-discovery-6.4.1.jar
+kubernetes-model-events/6.4.1//kubernetes-model-events-6.4.1.jar
+kubernetes-model-extensions/6.4.1//kubernetes-model-extensions-6.4.1.jar
+kubernetes-model-flowcontrol/6.4.1//kubernetes-model-flowcontrol-6.4.1.jar
+kubernetes-model-gatewayapi/6.4.1//kubernetes-model-gatewayapi-6.4.1.jar
+kubernetes-model-metrics/6.4.1//kubernetes-model-metrics-6.4.1.jar
+kubernetes-model-networking/6.4.1//kubernetes-model-networking-6.4.1.jar
+kubernetes-model-node/6.4.1//kubernetes-model-node-6.4.1.jar
+kubernetes-model-policy/6.4.1//kubernetes-model-policy-6.4.1.jar
+kubernetes-model-rbac/6.4.1//kubernetes-model-rbac-6.4.1.jar
+kubernetes-model-scheduling/6.4.1//kubernetes-model-scheduling-6.4.1.jar
+kubernetes-model-storageclass/6.4.1//kubernetes-model-storageclass-6.4.1.jar
 libfb303/0.9.3//libfb303-0.9.3.jar
 libthrift/0.9.3//libthrift-0.9.3.jar
 log4j-1.2-api/2.20.0//log4j-1.2-api-2.20.0.jar
diff --git a/integration-tests/kyuubi-kubernetes-it/pom.xml b/integration-tests/kyuubi-kubernetes-it/pom.xml
index 9d92a1f4b..a796ccab5 100644
--- a/integration-tests/kyuubi-kubernetes-it/pom.xml
+++ b/integration-tests/kyuubi-kubernetes-it/pom.xml
@@ -60,12 +60,6 @@
             <scope>test</scope>
         </dependency>
 
-        <dependency>
-            <groupId>io.fabric8</groupId>
-            <artifactId>kubernetes-client</artifactId>
-            <scope>test</scope>
-        </dependency>
-
         <dependency>
             <groupId>org.apache.hadoop</groupId>
             <artifactId>hadoop-client-minicluster</artifactId>
diff --git a/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/MiniKube.scala b/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/MiniKube.scala
index cd373873a..f4cd557bb 100644
--- a/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/MiniKube.scala
+++ b/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/MiniKube.scala
@@ -17,7 +17,11 @@
 
 package org.apache.kyuubi.kubernetes.test
 
-import io.fabric8.kubernetes.client.{Config, DefaultKubernetesClient}
+import io.fabric8.kubernetes.client.{Config, KubernetesClient, KubernetesClientBuilder}
+import io.fabric8.kubernetes.client.okhttp.OkHttpClientFactory
+import okhttp3.{Dispatcher, OkHttpClient}
+
+import org.apache.kyuubi.util.ThreadUtils
 
 /**
  * This code copied from Aapache Spark
@@ -44,7 +48,7 @@ object MiniKube {
     executeMinikube(true, "ip").head
   }
 
-  def getKubernetesClient: DefaultKubernetesClient = {
+  def getKubernetesClient: KubernetesClient = {
     // only the three-part version number is matched (the optional suffix like "-beta.0" is dropped)
     val versionArrayOpt = "\\d+\\.\\d+\\.\\d+".r
       .findFirstIn(minikubeVersionString.split(VERSION_PREFIX)(1))
@@ -65,7 +69,18 @@ object MiniKube {
             "For minikube version a three-part version number is expected (the optional " +
             "non-numeric suffix is intentionally dropped)")
     }
+    // https://github.com/fabric8io/kubernetes-client/issues/3547
+    val dispatcher = new Dispatcher(
+      ThreadUtils.newDaemonCachedThreadPool("kubernetes-dispatcher"))
+    val factoryWithCustomDispatcher = new OkHttpClientFactory() {
+      override protected def additionalConfig(builder: OkHttpClient.Builder): Unit = {
+        builder.dispatcher(dispatcher)
+      }
+    }
 
-    new DefaultKubernetesClient(Config.autoConfigure("minikube"))
+    new KubernetesClientBuilder()
+      .withConfig(Config.autoConfigure("minikube"))
+      .withHttpClientFactory(factoryWithCustomDispatcher)
+      .build()
   }
 }
diff --git a/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/WithKyuubiServerOnKubernetes.scala b/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/WithKyuubiServerOnKubernetes.scala
index ed9cbce09..595fdd431 100644
--- a/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/WithKyuubiServerOnKubernetes.scala
+++ b/integration-tests/kyuubi-kubernetes-it/src/test/scala/org/apache/kyuubi/kubernetes/test/WithKyuubiServerOnKubernetes.scala
@@ -18,14 +18,14 @@
 package org.apache.kyuubi.kubernetes.test
 
 import io.fabric8.kubernetes.api.model.Pod
-import io.fabric8.kubernetes.client.DefaultKubernetesClient
+import io.fabric8.kubernetes.client.KubernetesClient
 
 import org.apache.kyuubi.KyuubiFunSuite
 
 trait WithKyuubiServerOnKubernetes extends KyuubiFunSuite {
   protected def connectionConf: Map[String, String] = Map.empty
 
-  lazy val miniKubernetesClient: DefaultKubernetesClient = MiniKube.getKubernetesClient
+  lazy val miniKubernetesClient: KubernetesClient = MiniKube.getKubernetesClient
   lazy val kyuubiPod: Pod = miniKubernetesClient.pods().withName("kyuubi-test").get()
   lazy val kyuubiServerIp: String = kyuubiPod.getStatus.getPodIP
   lazy val miniKubeIp: String = MiniKube.getIp
diff --git a/kyuubi-server/pom.xml b/kyuubi-server/pom.xml
index aebce5dda..83698fa5a 100644
--- a/kyuubi-server/pom.xml
+++ b/kyuubi-server/pom.xml
@@ -92,6 +92,11 @@
             <artifactId>kubernetes-client</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>io.fabric8</groupId>
+            <artifactId>kubernetes-httpclient-okhttp</artifactId>
+        </dependency>
+
         <dependency>
             <groupId>org.apache.hive</groupId>
             <artifactId>hive-metastore</artifactId>
diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/KubernetesApplicationOperation.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/KubernetesApplicationOperation.scala
index bee69b117..1dd5ff83f 100644
--- a/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/KubernetesApplicationOperation.scala
+++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/engine/KubernetesApplicationOperation.scala
@@ -17,9 +17,10 @@
 
 package org.apache.kyuubi.engine
 
-import io.fabric8.kubernetes.api.model.{Pod, PodList}
+import java.util
+
+import io.fabric8.kubernetes.api.model.Pod
 import io.fabric8.kubernetes.client.KubernetesClient
-import io.fabric8.kubernetes.client.dsl.FilterWatchListDeletable
 
 import org.apache.kyuubi.Logging
 import org.apache.kyuubi.config.KyuubiConf
@@ -58,17 +59,17 @@ class KubernetesApplicationOperation extends ApplicationOperation with Logging {
       debug(s"Deleting application info from Kubernetes cluster by $tag tag")
       try {
         // Need driver only
-        val operation = findDriverPodByTag(tag)
-        val podList = operation.list().getItems
+        val podList = findDriverPodByTag(tag)
         if (podList.size() != 0) {
-          toApplicationState(podList.get(0).getStatus.getPhase) match {
+          val targetPod = podList.get(0)
+          toApplicationState(targetPod.getStatus.getPhase) match {
             case FAILED | UNKNOWN =>
               (
                 false,
-                s"Target Pod ${podList.get(0).getMetadata.getName} is in FAILED or UNKNOWN status")
+                s"Target Pod ${targetPod.getMetadata.getName} is in FAILED or UNKNOWN status")
             case _ =>
               (
-                operation.delete(),
+                !kubernetesClient.pods.withName(targetPod.getMetadata.getName).delete().isEmpty,
                 s"Operation of deleted appId: ${podList.get(0).getMetadata.getName} is completed")
           }
         } else {
@@ -88,8 +89,7 @@ class KubernetesApplicationOperation extends ApplicationOperation with Logging {
     if (kubernetesClient != null) {
       debug(s"Getting application info from Kubernetes cluster by $tag tag")
       try {
-        val operation = findDriverPodByTag(tag)
-        val podList = operation.list().getItems
+        val podList = findDriverPodByTag(tag)
         if (podList.size() != 0) {
           val pod = podList.get(0)
           val info = ApplicationInfo(
@@ -114,14 +114,14 @@ class KubernetesApplicationOperation extends ApplicationOperation with Logging {
     }
   }
 
-  private def findDriverPodByTag(tag: String): FilterWatchListDeletable[Pod, PodList] = {
-    val operation = kubernetesClient.pods()
-      .withLabel(KubernetesApplicationOperation.LABEL_KYUUBI_UNIQUE_KEY, tag)
-    val size = operation.list().getItems.size()
+  private def findDriverPodByTag(tag: String): util.List[Pod] = {
+    val podList = kubernetesClient.pods()
+      .withLabel(KubernetesApplicationOperation.LABEL_KYUUBI_UNIQUE_KEY, tag).list().getItems
+    val size = podList.size()
     if (size != 1) {
       warn(s"Get Tag: ${tag} Driver Pod In Kubernetes size: ${size}, we expect 1")
     }
-    operation
+    podList
   }
 
   override def stop(): Unit = {
diff --git a/kyuubi-server/src/main/scala/org/apache/kyuubi/util/KubernetesUtils.scala b/kyuubi-server/src/main/scala/org/apache/kyuubi/util/KubernetesUtils.scala
index 921aa04ae..0c934b51d 100644
--- a/kyuubi-server/src/main/scala/org/apache/kyuubi/util/KubernetesUtils.scala
+++ b/kyuubi-server/src/main/scala/org/apache/kyuubi/util/KubernetesUtils.scala
@@ -22,7 +22,7 @@ import java.io.File
 import com.fasterxml.jackson.databind.ObjectMapper
 import com.google.common.base.Charsets
 import com.google.common.io.Files
-import io.fabric8.kubernetes.client.{Config, ConfigBuilder, DefaultKubernetesClient, KubernetesClient}
+import io.fabric8.kubernetes.client.{Config, ConfigBuilder, KubernetesClient, KubernetesClientBuilder}
 import io.fabric8.kubernetes.client.Config.autoConfigure
 import io.fabric8.kubernetes.client.okhttp.OkHttpClientFactory
 import okhttp3.{Dispatcher, OkHttpClient}
@@ -93,7 +93,10 @@ object KubernetesUtils extends Logging {
 
     debug("Kubernetes client config: " +
       new ObjectMapper().writerWithDefaultPrettyPrinter().writeValueAsString(config))
-    Some(new DefaultKubernetesClient(factoryWithCustomDispatcher.createHttpClient(config), config))
+    Some(new KubernetesClientBuilder()
+      .withHttpClientFactory(factoryWithCustomDispatcher)
+      .withConfig(config)
+      .build())
   }
 
   implicit private class OptionConfigurableConfigBuilder(val configBuilder: ConfigBuilder)
diff --git a/pom.xml b/pom.xml
index ed5eb48d6..2082499dc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -167,7 +167,7 @@
         <jetty.version>9.4.50.v20221201</jetty.version>
         <jline.version>0.9.94</jline.version>
         <junit.version>4.13.2</junit.version>
-        <kubernetes-client.version>5.12.1</kubernetes-client.version>
+        <kubernetes-client.version>6.4.1</kubernetes-client.version>
         <kudu.version>1.15.0</kudu.version>
         <ldapsdk.version>6.0.5</ldapsdk.version>
         <log4j.version>2.20.0</log4j.version>
@@ -595,6 +595,16 @@
                 <artifactId>kubernetes-client</artifactId>
                 <version>${kubernetes-client.version}</version>
             </dependency>
+            <!--
+                according to kubernetes-client MIGRATION-v6.md, we should include this dependency
+                for doing any customization to OkHttp clients.
+                https://github.com/fabric8io/kubernetes-client/blob/master/doc/MIGRATION-v6.md#okhttp-httpclient
+            -->
+            <dependency>
+                <groupId>io.fabric8</groupId>
+                <artifactId>kubernetes-httpclient-okhttp</artifactId>
+                <version>${kubernetes-client.version}</version>
+            </dependency>
 
             <!--
               because of THRIFT-4805, we don't upgrade to libthrift:0.12.0,