def reset_current_dqlite_worker_installation(): """ Take a node out of a cluster """ print("Configuring services.", flush=True) disable_traefik() os.remove(ca_cert_file) service("stop", "apiserver") service("stop", "k8s-dqlite") time.sleep(10) rebuild_client_config() print("Generating new cluster certificates.", flush=True) reinit_cluster() for config_file in ["kubelet", "kube-proxy"]: shutil.copyfile( "{}/default-args/{}".format(snap_path, config_file), "{}/args/{}".format(snapdata_path, config_file), ) for user in ["proxy", "kubelet"]: config = "{}/credentials/{}.config".format(snapdata_path, user) shutil.copyfile("{}.backup".format(config), config) unmark_no_cert_reissue() unmark_worker_node() restart_all_services() apply_cni()
def update_dqlite(cluster_cert, cluster_key, voters, host): """ Configure the dqlite cluster :param cluster_cert: the dqlite cluster cert :param cluster_key: the dqlite cluster key :param voters: the dqlite voters :param host: the hostname others see of this node """ service("stop", "apiserver") service("stop", "k8s-dqlite") time.sleep(10) shutil.rmtree(cluster_backup_dir, ignore_errors=True) shutil.move(cluster_dir, cluster_backup_dir) os.mkdir(cluster_dir) store_cluster_certs(cluster_cert, cluster_key) # We get the dqlite port from the already existing deployment port = 19001 with open("{}/info.yaml".format(cluster_backup_dir)) as f: data = yaml.safe_load(f) if "Address" in data: port = data["Address"].split(":")[1] init_data = {"Cluster": voters, "Address": "{}:{}".format(host, port)} with open("{}/init.yaml".format(cluster_dir), "w") as f: yaml.dump(init_data, f) service("start", "k8s-dqlite") service("start", "apiserver") waits = 10 print("Waiting for this node to finish joining the cluster.", end=" ", flush=True) while waits > 0: try: out = subprocess.check_output( "{snappath}/bin/dqlite -s file://{dbdir}/cluster.yaml -c {dbdir}/cluster.crt " "-k {dbdir}/cluster.key -f json k8s .cluster".format( snappath=snap_path, dbdir=cluster_dir ).split(), timeout=4, stderr=subprocess.STDOUT, ) if host in out.decode(): break else: print(".", end=" ", flush=True) time.sleep(5) waits -= 1 except (subprocess.CalledProcessError, subprocess.TimeoutExpired): print("..", end=" ", flush=True) time.sleep(2) waits -= 1 print(" ") with open("{}//certs/csr.conf".format(snapdata_path), "w") as f: f.write("changeme") restart_all_services()
def reset_current_dqlite_installation(): """ Take a node out of a dqlite cluster """ if is_leader_without_successor(): print("This node currently holds the only copy of the Kubernetes " "database so it cannot leave the cluster.") print("To remove this node you can either first remove all other " "nodes with 'microk8s remove-node' or") print( "form a highly available cluster by adding at least three nodes.") exit(3) # We need to: # 1. Stop the apiserver # 2. Send a DELETE request to any member of the dqlite cluster # 3. wipe out the existing installation my_ep, other_ep = get_dqlite_endpoints() service("stop", "apiserver") service("stop", "k8s-dqlite") time.sleep(10) delete_dqlite_node(my_ep, other_ep) print("Generating new cluster certificates.", flush=True) reinit_cluster() service("start", "k8s-dqlite") service("start", "apiserver") apply_cni() unmark_no_cert_reissue() restart_all_services()