現狀
在dhorse 1.4.0版本之前,一直使用k8s官方提供的sdk與k8s叢集互動,官方sdk的Maven座標如下:
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>18.0.0</version>
</dependency>
但是自從1.4.0版本以後,dhorse開始支援fabric8的sdk,fabric8的sdk的Maven座標如下:
<dependency>
<groupId>io.fabric8</groupId>
<artifactId>kubernetes-client</artifactId>
<version>6.9.0</version>
</dependency>
那麼,為什麼要替換為fabric8的sdk與k8s互動呢?
k8s官方與fabric8的對比
1.社群方面
兩者的關注度上,都差不多,沒有太大差別;
但是,fabric8的sdk提供的文件和示例更加完善,而k8s官方提供的示例較少;
2.功能方面
fabric8不僅支援k8s,同時也支援OpenShift,而官方sdk支援k8s;
3.包大小
k8s官方sdk依賴的sdk過大,有30M左右,而fabric8只有不到10M;
使用官方的sdk也會導致dhorse的安裝包過大。
4.API使用方面
舉個例子,以查詢k8s叢集的名稱空間列表為例,說明程式碼如下。
官方:
ApiClient apiClient = this.apiClient(clusterPO.getClusterUrl(), clusterPO.getAuthToken());
CoreV1Api coreApi = new CoreV1Api(apiClient);
List<ClusterNamespace> namespaces = new ArrayList<>();
String labelSelector = null;
if(pageParam != null && !StringUtils.isBlank(pageParam.getNamespaceName())) {
labelSelector = "kubernetes.io/metadata.name=" + pageParam.getNamespaceName();
}
try {
V1NamespaceList namespaceList = coreApi.listNamespace(null, null, null, null,
labelSelector, null, null, null, null, null);
} catch (ApiException e) {
String message = e.getResponseBody() == null ? e.getMessage() : e.getResponseBody();
LogUtils.throwException(logger, message, MessageCodeEnum.CLUSTER_NAMESPACE_FAILURE);
}
fabric8:
try(KubernetesClient client = client(clusterPO.getClusterUrl(), clusterPO.getAuthToken())){
ListOptions o = new ListOptions();
if(pageParam != null && !StringUtils.isBlank(pageParam.getNamespaceName())) {
o.setLabelSelector("kubernetes.io/metadata.name=" + pageParam.getNamespaceName());
}
namespaceList = client.namespaces().list(o);
}
可以看出,官方提供的API介面不夠簡潔,而且丟擲了不必要的異常。
結論
綜上,dhorse後續版本會預設選擇fabric8的sdk與k8s器群互動,並計劃在v1.6的版本里下掉k8s官方的sdk。