Files
ubicloud/model/kubernetes/kubernetes_cluster.rb
Eren Başak bbc2a0c489 Kubernetes Cluster and Nodepool Upgrades
This patch implements the upgrade logic for kubernetes clusters.

Upgrade is done sequentially, node-by-node, in the order of create time.
Upgrade operation starts with the CP nodes. After all CP nodes are upgraded, then
moves to worker nodes.

For upgrading a node, it creates a new node with upgraded version of k8s, adds it to
the cluster and draing & removes the corresponding old node. There's no actual relation
between the old node and new node in reality.

Co-authored-by: Eren Başak <eren@ubicloud.com>
Co-authored-by: mohi-kalantari <mohi.kalantari1@gmail.com>
2025-01-20 10:19:21 +03:00

75 lines
2.6 KiB
Ruby

# frozen_string_literal: true
require_relative "../../model"
class KubernetesCluster < Sequel::Model
one_to_one :strand, key: :id
one_to_one :api_server_lb, class: :LoadBalancer, key: :id, primary_key: :api_server_lb_id
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 :kubernetes_nodepools
dataset_module Pagination
include ResourceMethods
include SemaphoreMethods
include Authorization::HyperTagMethods
semaphore :destroy, :upgrade
def display_location
LocationNameConverter.to_display_name(location)
end
def hyper_tag_name(project)
"project/#{project.ubid}/location/#{display_location}/kubernetes-cluster/#{name}"
end
def path
"/location/#{display_location}/kubernetes-cluster/#{name}"
end
def endpoint
api_server_lb.hostname
end
def disassociate_cp_vm(vm)
DB[:kubernetes_clusters_cp_vms].where(
kubernetes_cluster_id: id,
cp_vm_id: vm.id
).delete
end
def kubectl(cmd)
cp_vms.first.sshable.cmd("sudo kubectl --kubeconfig=/etc/kubernetes/admin.conf #{cmd}")
end
def all_vms
cp_vms + kubernetes_nodepools.flat_map(&:vms)
end
end
# Table: kubernetes_cluster
# Columns:
# id | uuid | PRIMARY KEY
# name | text | NOT NULL
# cp_node_count | integer | NOT NULL
# kubernetes_version | text | NOT NULL
# location | text | NOT NULL
# created_at | timestamp without time zone | NOT NULL DEFAULT CURRENT_TIMESTAMP
# project_id | uuid | NOT NULL
# private_subnet_id | uuid | NOT NULL
# api_server_lb_id | uuid |
# Indexes:
# kubernetes_cluster_pkey | PRIMARY KEY btree (id)
# Check constraints:
# kubernetes_cluster_cp_node_count_check | (cp_node_count = ANY (ARRAY[1, 3]))
# 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)