DHorse改用fabric8的SDK與k8s叢集互動

tiandizhiguai發表於2023-10-30

現狀

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。

相關文章