Files
ubicloud/model/kubernetes/kubernetes_cluster.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

89 lines
3.4 KiB
Ruby

# frozen_string_literal: true
require_relative "../../model"
class KubernetesCluster < Sequel::Model
one_to_one :strand, key: :id
many_to_one :api_server_lb, class: :LoadBalancer
many_to_one :private_subnet
many_to_one :project
many_to_many :cp_vms, join_table: :kubernetes_clusters_cp_vms, class: :Vm, order: :created_at
one_to_many :nodepools, class: :KubernetesNodepool
one_to_many :active_billing_records, class: :BillingRecord, key: :resource_id, &:active
dataset_module Pagination
include ResourceMethods
include SemaphoreMethods
semaphore :destroy
def validate
super
errors.add(:cp_node_count, "must be greater than 0") if cp_node_count <= 0
errors.add(:version, "must be a valid Kubernetes version") unless ["v1.32", "v1.31"].include?(version)
end
def display_state
return "deleting" if destroy_set? || strand.label == "destroy"
return "running" if strand.label == "wait"
"creating"
end
def display_location
LocationNameConverter.to_display_name(location)
end
def path
"/location/#{display_location}/kubernetes-cluster/#{name}"
end
def endpoint
api_server_lb.hostname
end
def sshable
cp_vms.first.sshable
end
def self.kubeconfig(vm)
rbac_token = vm.sshable.cmd("kubectl --kubeconfig <(sudo cat /etc/kubernetes/admin.conf) -n kube-system get secret k8s-access -o jsonpath='{.data.token}' | base64 -d", log: false)
admin_kubeconfig = vm.sshable.cmd("sudo cat /etc/kubernetes/admin.conf", log: false)
kubeconfig = YAML.safe_load(admin_kubeconfig)
kubeconfig["users"].each do |user|
user["user"].delete("client-certificate-data")
user["user"].delete("client-key-data")
user["user"]["token"] = rbac_token
end
kubeconfig.to_yaml
end
def kubeconfig
self.class.kubeconfig(cp_vms.first)
end
end
# Table: kubernetes_cluster
# Columns:
# id | uuid | PRIMARY KEY
# name | text | NOT NULL
# cp_node_count | integer | NOT NULL
# version | text | NOT NULL
# location | text | NOT NULL
# created_at | timestamp with time zone | NOT NULL DEFAULT CURRENT_TIMESTAMP
# project_id | uuid | NOT NULL
# private_subnet_id | uuid | NOT NULL
# api_server_lb_id | uuid |
# target_node_size | text | NOT NULL
# target_node_storage_size_gib | bigint |
# Indexes:
# kubernetes_cluster_pkey | PRIMARY KEY btree (id)
# kubernetes_cluster_project_id_location_name_uidx | UNIQUE btree (project_id, location, name)
# Foreign key constraints:
# kubernetes_cluster_api_server_lb_id_fkey | (api_server_lb_id) REFERENCES load_balancer(id)
# kubernetes_cluster_private_subnet_id_fkey | (private_subnet_id) REFERENCES private_subnet(id)
# kubernetes_cluster_project_id_fkey | (project_id) REFERENCES project(id)
# Referenced By:
# kubernetes_clusters_cp_vms | kubernetes_clusters_cp_vms_kubernetes_cluster_id_fkey | (kubernetes_cluster_id) REFERENCES kubernetes_cluster(id)
# kubernetes_nodepool | kubernetes_nodepool_kubernetes_cluster_id_fkey | (kubernetes_cluster_id) REFERENCES kubernetes_cluster(id)