Skip to content

Commit 21b76ea

Browse files
committed
CCKS: fix scaling failures for clusters without a default service offering
1 parent a9b2f33 commit 21b76ea

2 files changed

Lines changed: 34 additions & 25 deletions

File tree

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1398,6 +1398,16 @@ protected void ensureResourceLimitsForScale(final KubernetesClusterVO cluster,
13981398
}
13991399
}
14001400

1401+
public static long getNodeCountForType(KubernetesClusterNodeType nodeType, KubernetesCluster kubernetesCluster) {
1402+
if (WORKER == nodeType) {
1403+
return kubernetesCluster.getNodeCount();
1404+
} else if (CONTROL == nodeType) {
1405+
return kubernetesCluster.getControlNodeCount();
1406+
} else if (ETCD == nodeType) {
1407+
return kubernetesCluster.getEtcdNodeCount();
1408+
}
1409+
return kubernetesCluster.getTotalNodeCount();
1410+
}
14011411

14021412
protected void validateServiceOfferingsForNodeTypesScale(Map<String, Long> map, Long defaultServiceOfferingId, KubernetesClusterVO kubernetesCluster, KubernetesSupportedVersion clusterVersion) {
14031413
for (String key : CLUSTER_NODES_TYPES_LIST) {
@@ -1410,6 +1420,9 @@ protected void validateServiceOfferingsForNodeTypesScale(Map<String, Long> map,
14101420
checkServiceOfferingForNodesScale(serviceOffering, kubernetesCluster, clusterVersion);
14111421
Long nodeTypeOfferingId = getExistingServiceOfferingIdForNodeType(key, kubernetesCluster);
14121422
if (nodeTypeOfferingId == null) {
1423+
if (getNodeCountForType(KubernetesClusterNodeType.valueOf(key), kubernetesCluster) <=0) {
1424+
continue;
1425+
}
14131426
nodeTypeOfferingId = kubernetesCluster.getServiceOfferingId();
14141427
}
14151428
final ServiceOffering existingServiceOffering = serviceOfferingDao.findById(nodeTypeOfferingId);
@@ -2196,18 +2209,20 @@ public boolean scaleKubernetesCluster(ScaleKubernetesClusterCmd cmd) throws Clou
21962209
protected Map<String, ServiceOffering> createNodeTypeToServiceOfferingMap(Map<String, Long> idsMapping,
21972210
Long serviceOfferingId, KubernetesClusterVO kubernetesCluster) {
21982211
Map<String, ServiceOffering> map = new HashMap<>();
2199-
if (MapUtils.isEmpty(idsMapping)) {
2200-
ServiceOfferingVO offering = serviceOfferingId != null ?
2201-
serviceOfferingDao.findById(serviceOfferingId) :
2202-
serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
2203-
map.put(DEFAULT.name(), offering);
2212+
if (MapUtils.isNotEmpty(idsMapping)) {
2213+
for (String key : CLUSTER_NODES_TYPES_LIST) {
2214+
if (idsMapping.containsKey(key)) {
2215+
map.put(key, serviceOfferingDao.findById(idsMapping.get(key)));
2216+
}
2217+
}
22042218
return map;
22052219
}
2206-
for (String key : CLUSTER_NODES_TYPES_LIST) {
2207-
if (!idsMapping.containsKey(key)) {
2208-
continue;
2220+
Long defaultOfferingId = serviceOfferingId != null ? serviceOfferingId : kubernetesCluster.getServiceOfferingId();
2221+
if (defaultOfferingId != null) {
2222+
ServiceOfferingVO offering = serviceOfferingDao.findById(defaultOfferingId);
2223+
if (offering != null) {
2224+
map.put(DEFAULT.name(), offering);
22092225
}
2210-
map.put(key, serviceOfferingDao.findById(idsMapping.get(key)));
22112226
}
22122227
return map;
22132228
}

plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/actionworkers/KubernetesClusterScaleWorker.java

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ protected Pair<Long, Long> calculateNewClusterCountAndCapacity(Long newWorkerSiz
225225
cores = serviceOffering.getCpu() * totalClusterSize;
226226
memory = serviceOffering.getRamSize() * totalClusterSize;
227227
} else {
228-
long nodeCount = getNodeCountForType(nodeType, kubernetesCluster);
228+
long nodeCount = KubernetesClusterManagerImpl.getNodeCountForType(nodeType, kubernetesCluster);
229229
Long existingOfferingId = getExistingOfferingIdForNodeType(nodeType, kubernetesCluster);
230230
if (existingOfferingId == null) {
231231
existingOfferingId = serviceOffering.getId();
@@ -243,17 +243,6 @@ protected Pair<Long, Long> calculateNewClusterCountAndCapacity(Long newWorkerSiz
243243
return new Pair<>(cores, memory);
244244
}
245245

246-
private long getNodeCountForType(KubernetesClusterNodeType nodeType, KubernetesCluster kubernetesCluster) {
247-
if (WORKER == nodeType) {
248-
return kubernetesCluster.getNodeCount();
249-
} else if (CONTROL == nodeType) {
250-
return kubernetesCluster.getControlNodeCount();
251-
} else if (ETCD == nodeType) {
252-
return kubernetesCluster.getEtcdNodeCount();
253-
}
254-
return kubernetesCluster.getTotalNodeCount();
255-
}
256-
257246
protected Pair<Long, Long> calculateClusterNewCapacity(KubernetesCluster kubernetesCluster,
258247
Pair<Long, Long> previousNodeTypeCapacity,
259248
Pair<Long, Long> newNodeTypeCapacity) {
@@ -337,17 +326,19 @@ private void validateKubernetesClusterScaleSizeParameters() throws CloudRuntimeE
337326
// Check capacity and transition state
338327
final long newVmRequiredCount = clusterSize - originalClusterSize;
339328
final ServiceOffering clusterServiceOffering = serviceOfferingDao.findById(kubernetesCluster.getServiceOfferingId());
340-
if (clusterServiceOffering == null) {
329+
final ServiceOffering existingWorkerOffering = serviceOfferingDao.findById(kubernetesCluster.getWorkerNodeServiceOfferingId());
330+
final ServiceOffering effectiveOffering = existingWorkerOffering != null ? existingWorkerOffering : clusterServiceOffering;
331+
if (effectiveOffering == null) {
341332
logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling failed for Kubernetes cluster : %s, cluster service offering not found", kubernetesCluster.getName()));
342333
}
343334
if (newVmRequiredCount > 0) {
344335
final DataCenter zone = dataCenterDao.findById(kubernetesCluster.getZoneId());
345336
VMTemplateVO clusterTemplate = templateDao.findById(kubernetesCluster.getTemplateId());
346337
try {
347338
if (originalState.equals(KubernetesCluster.State.Running)) {
348-
plan(newVmRequiredCount, zone, clusterServiceOffering, kubernetesCluster.getDomainId(), kubernetesCluster.getAccountId(), clusterTemplate.getHypervisorType(), clusterTemplate.getArch());
339+
plan(newVmRequiredCount, zone, effectiveOffering, kubernetesCluster.getDomainId(), kubernetesCluster.getAccountId(), clusterTemplate.getHypervisorType(), clusterTemplate.getArch());
349340
} else {
350-
plan(kubernetesCluster.getTotalNodeCount() + newVmRequiredCount, zone, clusterServiceOffering, kubernetesCluster.getDomainId(), kubernetesCluster.getAccountId(), clusterTemplate.getHypervisorType(), clusterTemplate.getArch());
341+
plan(kubernetesCluster.getTotalNodeCount() + newVmRequiredCount, zone, effectiveOffering, kubernetesCluster.getDomainId(), kubernetesCluster.getAccountId(), clusterTemplate.getHypervisorType(), clusterTemplate.getArch());
351342
}
352343
} catch (InsufficientCapacityException e) {
353344
logTransitStateToFailedIfNeededAndThrow(Level.WARN, String.format("Scaling failed for Kubernetes cluster : %s in zone : %s, insufficient capacity", kubernetesCluster.getName(), zone.getName()));
@@ -370,7 +361,7 @@ private void scaleKubernetesClusterOffering(KubernetesClusterNodeType nodeType,
370361
kubernetesCluster = updateKubernetesClusterEntryForNodeType(null, nodeType, serviceOffering, updateNodeOffering, updateClusterOffering);
371362
return;
372363
}
373-
final long size = getNodeCountForType(nodeType, kubernetesCluster);
364+
final long size = KubernetesClusterManagerImpl.getNodeCountForType(nodeType, kubernetesCluster);
374365
List<KubernetesClusterVmMapVO> vmList = kubernetesClusterVmMapDao.listByClusterIdAndVmType(kubernetesCluster.getId(), nodeType);
375366
final long tobeScaledVMCount = Math.min(vmList.size(), size);
376367
for (long i = 0; i < tobeScaledVMCount; i++) {
@@ -610,6 +601,9 @@ public boolean scaleCluster() throws CloudRuntimeException {
610601
private ServiceOffering getExistingServiceOfferingForNodeType(KubernetesClusterNodeType nodeType, KubernetesCluster kubernetesCluster) {
611602
Long existingOfferingId = getExistingOfferingIdForNodeType(nodeType, kubernetesCluster);
612603
if (existingOfferingId == null) {
604+
if (KubernetesClusterManagerImpl.getNodeCountForType(nodeType, kubernetesCluster) <= 0) {
605+
return null;
606+
}
613607
logAndThrow(Level.ERROR, String.format("The Kubernetes cluster %s does not have a service offering set for node type %s",
614608
kubernetesCluster.getName(), nodeType.name()));
615609
}

0 commit comments

Comments
 (0)