ubicloud/prog/kubernetes/kubernetes_nodepool_nexus.rb
Eren Başak 504effca55 Associate Billing Records for Kubernetes Clusters
We were not dealing with billing records for kubernetes clusters, as
we were in free early-access stage. But that will eventually change
and we will want to charge for kubernetes clusters.

This commit prepares for that day by incorporating logic to create and
delete billing records into cluster lifecycle.

Billing records are created right after the cluster is ready to use and
get finalized right after a customer decides to delete it.

All billing records are handled in KubernetesClusterNexus. Alternatively,
nodepool nexus could handle the nodepool billing, but that's not a big deal.

Currently, all resources are $0 but that will change once we go public-beta.

We still need to finalize LB management via CCM and start managing resources
in an internal project. After that, we can fully start billing for k8s.

We only have create and delete steps, and no update to billing records. When
update logic for a cluster is implemented (add node, change SKU, etc.), we would
need to remember implementing billing logic for these actions. Also, we should
remember to update billing records if/when we do manual scaling for a customer with
support ticket.
2025-03-11 13:38:14 +02:00

57 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class Prog::Kubernetes::KubernetesNodepoolNexus < Prog::Base
subject_is :kubernetes_nodepool
def self.assemble(name:, node_count:, kubernetes_cluster_id:, target_node_size: "standard-2", target_node_storage_size_gib: nil)
DB.transaction do
unless KubernetesCluster[kubernetes_cluster_id]
fail "No existing cluster"
end
kn = KubernetesNodepool.create(name:, node_count:, kubernetes_cluster_id:, target_node_size:, target_node_storage_size_gib:)
Strand.create(prog: "Kubernetes::KubernetesNodepoolNexus", label: "start") { _1.id = kn.id }
end
end
def before_run
when_destroy_set? do
if strand.label != "destroy"
hop_destroy
end
end
end
label def start
nap 30 unless kubernetes_nodepool.cluster.strand.label == "wait_nodes"
register_deadline("wait", 120 * 60)
hop_bootstrap_worker_vms
end
label def bootstrap_worker_vms
hop_wait if kubernetes_nodepool.vms.count >= kubernetes_nodepool.node_count
bud Prog::Kubernetes::ProvisionKubernetesNode, {"nodepool_id" => kubernetes_nodepool.id, "subject_id" => kubernetes_nodepool.kubernetes_cluster_id}
hop_wait_worker_node
end
label def wait_worker_node
reap
hop_bootstrap_worker_vms if leaf?
donate
end
label def wait
nap 65536
end
label def destroy
reap
donate unless leaf?
decr_destroy
kubernetes_nodepool.vms.each(&:incr_destroy)
kubernetes_nodepool.remove_all_vms
kubernetes_nodepool.destroy
pop "kubernetes nodepool is deleted"
end
end