Reuse k8s cluster public IP for etcd nodes and rename etcd nodes

This commit is contained in:
Pearl Dsilva 2024-05-07 11:46:48 -04:00 committed by nvazquez
parent 8cfa6e6273
commit fe81ae0af3
No known key found for this signature in database
GPG Key ID: 656E1BCC8CB54F84
4 changed files with 8 additions and 52 deletions

View File

@ -786,7 +786,7 @@ public class KubernetesClusterResourceModifierActionWorker extends KubernetesClu
prefix = kubernetesCluster.getUuid();
}
}
prefix = "etcd-" + prefix;
prefix = prefix + "-etcd" ;
if (prefix.length() > 40) {
prefix = prefix.substring(0, 40);
}

View File

@ -32,7 +32,6 @@ import java.util.Objects;
import java.util.stream.Collectors;
import com.cloud.exception.NetworkRuleConflictException;
import com.cloud.utils.Ternary;
import org.apache.cloudstack.api.BaseCmd;
import org.apache.cloudstack.api.InternalIdentity;
import org.apache.cloudstack.framework.ca.Certificate;
@ -518,20 +517,12 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif
return additionalControlVms;
}
private Ternary<List<UserVm>, List<Network.IpAddresses>, List<IpAddress>> provisionEtcdCluster(final Network network, final Long domainId, final Long accountId)
private Pair<List<UserVm>, List<Network.IpAddresses>> provisionEtcdCluster(final Network network, final Long domainId, final Long accountId)
throws InsufficientCapacityException, ResourceUnavailableException, ManagementServerException {
List<UserVm> etcdNodeVms = new ArrayList<>();
List<IpAddress> etcdNodeIps = getEtcdNodePublicIpAddresses(network, kubernetesCluster.getEtcdNodeCount());
List<Network.IpAddresses> etcdNodeGuestIps = getEtcdNodeGuestIps(network, kubernetesCluster.getEtcdNodeCount());
List<String> etcdHostnames = getEtcdNodeHostnames();
for (int i = 0; i < kubernetesCluster.getEtcdNodeCount(); i++) {
IpAddress ip = etcdNodeIps.get(i);
if (Objects.isNull(ip)) {
String errMsg = String.format("No public IP found for the network: %s, to create Etcd node for " +
"Kubernetes cluster: %s", network, kubernetesCluster.getName());
LOGGER.error(errMsg);
logAndThrow(Level.ERROR, errMsg);
}
UserVm vm = createEtcdNode(etcdNodeGuestIps, etcdHostnames, i, domainId, accountId);
addKubernetesClusterVm(kubernetesCluster.getId(), vm.getId(), false, false, true, true);
startKubernetesVM(vm, domainId, accountId);
@ -544,19 +535,7 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif
LOGGER.info(String.format("Provisioned additional control VM : %s in to the Kubernetes cluster : %s", vm.getDisplayName(), kubernetesCluster.getName()));
}
}
return new Ternary<>(etcdNodeVms, etcdNodeGuestIps, etcdNodeIps);
}
private List<IpAddress> getEtcdNodePublicIpAddresses(final Network network, final long etcdNodeCount) throws InsufficientAddressCapacityException, ResourceUnavailableException, ResourceAllocationException {
List<IpAddress> ipAddresses = new ArrayList<>();
for (int i = 1; i <= etcdNodeCount; i++) {
if (network.getVpcId() == null) {
ipAddresses.add(acquirePublicIpForIsolatedNetwork(network));
} else {
ipAddresses.add(acquireVpcTierKubernetesPublicIp(network, true));
}
}
return ipAddresses;
return new Pair<>(etcdNodeVms, etcdNodeGuestIps);
}
private List<Network.IpAddresses> getEtcdNodeGuestIps(final Network network, final long etcdNodeCount) {
@ -614,7 +593,7 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif
setupKubernetesClusterIsolatedNetworkRules(publicIp, network, clusterVMIds, true);
}
protected void setupKubernetesEtcdNetworkRules(List<IpAddress> etcdNodeIps, List<UserVm> etcdVms, Network network) throws ManagementServerException, ResourceUnavailableException {
protected void setupKubernetesEtcdNetworkRules(List<UserVm> etcdVms, Network network) throws ManagementServerException, ResourceUnavailableException {
if (!Network.GuestType.Isolated.equals(network.getGuestType())) {
if (LOGGER.isDebugEnabled()) {
LOGGER.debug(String.format("Network : %s for Kubernetes cluster : %s is not an isolated network, therefore, no need for network rules", network.getName(), kubernetesCluster.getName()));
@ -622,18 +601,16 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif
}
List<Long> etcdVmIds = etcdVms.stream().map(UserVm::getId).collect(Collectors.toList());
Integer startPort = KubernetesClusterService.KubernetesEtcdNodeStartPort.value();
IpAddress publicIp = ipAddressDao.findByIpAndDcId(kubernetesCluster.getZoneId(), publicIpAddress);
for (int i = 0; i < etcdVmIds.size(); i++) {
IpAddress publicIp = etcdNodeIps.get(i);
startPort += i;
try {
provisionFirewallRules(publicIp, owner, startPort, startPort);
provisionFirewallRules(publicIp, owner, ETCD_NODE_CLIENT_REQUEST_PORT, ETCD_NODE_PEER_COMM_PORT);
} catch (NoSuchFieldException | IllegalAccessException | ResourceUnavailableException |
NetworkRuleConflictException e) {
throw new ManagementServerException(String.format("Failed to provision firewall rules for etcd nodes for the Kubernetes cluster : %s", kubernetesCluster.getName()), e);
}
provisionPublicIpPortForwardingRule(publicIp, network, owner, etcdVmIds.get(i), startPort, DEFAULT_SSH_PORT);
provisionPublicIpPortForwardingRule(publicIp, network, owner, etcdVmIds.get(i), ETCD_NODE_CLIENT_REQUEST_PORT, ETCD_NODE_CLIENT_REQUEST_PORT);
provisionPublicIpPortForwardingRule(publicIp, network, owner, etcdVmIds.get(i), ETCD_NODE_PEER_COMM_PORT, ETCD_NODE_PEER_COMM_PORT);
}
}
@ -737,12 +714,10 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif
List<UserVm> etcdVms = new ArrayList<>();
List<Network.IpAddresses> etcdGuestNodeIps = new ArrayList<>();
List<IpAddress> etcdPublicNodeIps = new ArrayList<>();
if (kubernetesCluster.getEtcdNodeCount() > 0) {
Ternary<List<UserVm>, List<Network.IpAddresses>, List<IpAddress>> etcdNodesAndIps = provisionEtcdCluster(network, domainId, accountId);
Pair<List<UserVm>, List<Network.IpAddresses>> etcdNodesAndIps = provisionEtcdCluster(network, domainId, accountId);
etcdVms = etcdNodesAndIps.first();
etcdGuestNodeIps = etcdNodesAndIps.second();
etcdPublicNodeIps = etcdNodesAndIps.third();
}
List<UserVm> clusterVMs = new ArrayList<>();
@ -781,7 +756,7 @@ public class KubernetesClusterStartWorker extends KubernetesClusterResourceModif
logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster : %s, unable to setup network rules", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
}
try {
setupKubernetesEtcdNetworkRules(etcdPublicNodeIps, etcdVms, network);
setupKubernetesEtcdNetworkRules(etcdVms, network);
} catch (ManagementServerException e) {
logTransitStateAndThrow(Level.ERROR, String.format("Failed to setup Kubernetes cluster : %s, unable to setup network rules for etcd nodes", kubernetesCluster.getName()), kubernetesCluster.getId(), KubernetesCluster.Event.CreateFailed, e);
}

View File

@ -2443,7 +2443,6 @@
"label.quotagb": "Quota in GB",
"label.encryption": "Encryption",
"label.etcdnodes": "Number of etcd nodes",
"label.etcd.ips": "etcd Node(s) IP address(es)",
"label.versioning": "Versioning",
"label.objectlocking": "Object Lock",
"label.bucket.policy": "Bucket Policy",

View File

@ -188,24 +188,6 @@
</span>
</div>
</div>
<div class="resource-detail-item" v-if="resource.etcdips">
<div class="resource-detail-item__label">{{ $t('label.etcd.ips') }}</div>
<div class="resource-detail-item__details resource-detail-item__details--start">
<div>
<div
v-for="(address, index) in resource.etcdips"
:key="index">
<environment-outlined
@click="$message.success(`${$t('label.copied.clipboard')} : ${ address }`)"
v-clipboard:copy="address"
/>
<router-link v-if="address" :to="{ path: '/publicip/' + index }">
<copy-label :label="address" />&nbsp;
</router-link>
</div>
</div>
</div>
</div>
<div class="resource-detail-item" v-if="('cpunumber' in resource && 'cpuspeed' in resource) || resource.cputotal">
<div class="resource-detail-item__label">{{ $t('label.cpu') }}</div>
<div class="resource-detail-item__details">