diff --git a/prepare-vms/lib/commands.sh b/prepare-vms/lib/commands.sh index 335cf155..94cf762d 100644 --- a/prepare-vms/lib/commands.sh +++ b/prepare-vms/lib/commands.sh @@ -74,10 +74,10 @@ _cmd_deploy() { pssh -I sudo tee /usr/local/bin/docker-prompt /tmp/token && sudo kubeadm init $EXTRA_KUBEADM --token \$(cat /tmp/token) --apiserver-cert-extra-sans \$(cat /tmp/ipv4) fi" # Put kubeconfig in ubuntu's and docker's accounts pssh " - if grep -q node1 /tmp/node; then + if i_am_first_node; then sudo mkdir -p \$HOME/.kube /home/docker/.kube && sudo cp /etc/kubernetes/admin.conf \$HOME/.kube/config && sudo cp /etc/kubernetes/admin.conf /home/docker/.kube/config && @@ -178,21 +179,22 @@ _cmd_kube() { # Install weave as the pod network pssh " - if grep -q node1 /tmp/node; then + if i_am_first_node; then kubever=\$(kubectl version | base64 | tr -d '\n') && kubectl apply -f https://cloud.weave.works/k8s/net?k8s-version=\$kubever fi" # Join the other nodes to the cluster pssh --timeout 200 " - if ! grep -q node1 /tmp/node && [ ! -f /etc/kubernetes/kubelet.conf ]; then - TOKEN=\$(ssh -o StrictHostKeyChecking=no node1 cat /tmp/token) && - sudo kubeadm join --discovery-token-unsafe-skip-ca-verification --token \$TOKEN node1:6443 + if ! i_am_first_node && [ ! -f /etc/kubernetes/kubelet.conf ]; then + FIRSTNODE=\$(cat /etc/name_of_first_node) && + TOKEN=\$(ssh -o StrictHostKeyChecking=no \$FIRSTNODE cat /tmp/token) && + sudo kubeadm join --discovery-token-unsafe-skip-ca-verification --token \$TOKEN \$FIRSTNODE:6443 fi" # Install metrics server pssh " - if grep -q node1 /tmp/node; then + if i_am_first_node; then kubectl apply -f https://raw.githubusercontent.com/jpetazzo/container.training/master/k8s/metrics-server.yaml fi" @@ -256,10 +258,9 @@ _cmd_kubetest() { # Feel free to make that better ♥ pssh " set -e - [ -f /tmp/node ] - if grep -q node1 /tmp/node; then + if i_am_first_node; then which kubectl - for NODE in \$(awk /\ node/\ {print\ \\\$2} /etc/hosts); do + for NODE in \$(awk /[0-9]\$/\ {print\ \\\$2} /etc/hosts); do echo \$NODE ; kubectl get nodes | grep -w \$NODE | grep -w Ready done fi" @@ -383,7 +384,7 @@ _cmd_start() { *) die "Unrecognized parameter: $1." esac done - + if [ -z "$INFRA" ]; then die "Please add --infra flag to specify which infrastructure file to use." fi @@ -394,8 +395,8 @@ _cmd_start() { COUNT=$(awk '/^clustersize:/ {print $2}' $SETTINGS) warning "No --count option was specified. Using value from settings file ($COUNT)." fi - - # Check that the specified settings and infrastructure are valid. + + # Check that the specified settings and infrastructure are valid. need_settings $SETTINGS need_infra $INFRA @@ -467,7 +468,7 @@ _cmd_helmprom() { TAG=$1 need_tag pssh " - if grep -q node1 /tmp/node; then + if i_am_first_node; then kubectl -n kube-system get serviceaccount helm || kubectl -n kube-system create serviceaccount helm helm init --service-account helm @@ -557,8 +558,8 @@ test_vm() { for cmd in "hostname" \ "whoami" \ "hostname -i" \ - "cat /tmp/node" \ - "cat /tmp/ipv4" \ + "ls -l /usr/local/bin/i_am_first_node" \ + "grep . /etc/name_of_first_node /etc/ipv4_of_first_node" \ "cat /etc/hosts" \ "hostnamectl status" \ "docker version | grep Version -B1" \ diff --git a/prepare-vms/lib/postprep.py b/prepare-vms/lib/postprep.py index b800d26a..f4cd042a 100755 --- a/prepare-vms/lib/postprep.py +++ b/prepare-vms/lib/postprep.py @@ -12,6 +12,7 @@ config = yaml.load(open("/tmp/settings.yaml")) COMPOSE_VERSION = config["compose_version"] MACHINE_VERSION = config["machine_version"] CLUSTER_SIZE = config["clustersize"] +CLUSTER_PREFIX = config["clusterprefix"] ENGINE_VERSION = config["engine_version"] DOCKER_USER_PASSWORD = config["docker_user_password"] @@ -121,7 +122,7 @@ addresses = list(l.strip() for l in sys.stdin) assert ipv4 in addresses def makenames(addrs): - return [ "node%s"%(i+1) for i in range(len(addrs)) ] + return [ "%s%s"%(CLUSTER_PREFIX, i+1) for i in range(len(addrs)) ] while addresses: cluster = addresses[:CLUSTER_SIZE] @@ -135,15 +136,21 @@ while addresses: print(cluster) mynode = cluster.index(ipv4) + 1 - system("echo node{} | sudo -u docker tee /tmp/node".format(mynode)) - system("echo node{} | sudo tee /etc/hostname".format(mynode)) - system("sudo hostname node{}".format(mynode)) + system("echo {}{} | sudo tee /etc/hostname".format(CLUSTER_PREFIX, mynode)) + system("sudo hostname {}{}".format(CLUSTER_PREFIX, mynode)) system("sudo -u docker mkdir -p /home/docker/.ssh") system("sudo -u docker touch /home/docker/.ssh/authorized_keys") + # Create a convenience file to easily check if we're the first node if ipv4 == cluster[0]: - # If I'm node1 and don't have a private key, generate one (with empty passphrase) + system("sudo ln -sf /bin/true /usr/local/bin/i_am_first_node") + # On the first node, if we don't have a private key, generate one (with empty passphrase) system("sudo -u docker [ -f /home/docker/.ssh/id_rsa ] || sudo -u docker ssh-keygen -t rsa -f /home/docker/.ssh/id_rsa -P ''") + else: + system("sudo ln -sf /bin/false /usr/local/bin/i_am_first_node") + # Record the IPV4 and name of the first node + system("echo {} | sudo tee /etc/ipv4_of_first_node".format(cluster[0])) + system("echo {} | sudo tee /etc/name_of_first_node".format(names[0])) FINISH = time.time() duration = "Initial deployment took {}s".format(str(FINISH - START)[:5]) diff --git a/prepare-vms/settings/csv.yaml b/prepare-vms/settings/csv.yaml index 72e19ff9..c36bcb50 100644 --- a/prepare-vms/settings/csv.yaml +++ b/prepare-vms/settings/csv.yaml @@ -1,5 +1,8 @@ # Number of VMs per cluster clustersize: 5 +# The hostname of each node will be clusterprefix + a number +clusterprefix: node + # Jinja2 template to use to generate ready-to-cut cards cards_template: clusters.csv diff --git a/prepare-vms/settings/enix.yaml b/prepare-vms/settings/enix.yaml index adbe8efb..075efb34 100644 --- a/prepare-vms/settings/enix.yaml +++ b/prepare-vms/settings/enix.yaml @@ -1,6 +1,9 @@ # Number of VMs per cluster clustersize: 1 +# The hostname of each node will be clusterprefix + a number +clusterprefix: node + # Jinja2 template to use to generate ready-to-cut cards cards_template: enix.html diff --git a/prepare-vms/settings/example.yaml b/prepare-vms/settings/example.yaml index 9e9d1499..5f814c9d 100644 --- a/prepare-vms/settings/example.yaml +++ b/prepare-vms/settings/example.yaml @@ -3,6 +3,9 @@ # Number of VMs per cluster clustersize: 5 +# The hostname of each node will be clusterprefix + a number +clusterprefix: node + # Jinja2 template to use to generate ready-to-cut cards cards_template: cards.html diff --git a/prepare-vms/settings/fundamentals.yaml b/prepare-vms/settings/fundamentals.yaml index 63c89f95..48a1d95e 100644 --- a/prepare-vms/settings/fundamentals.yaml +++ b/prepare-vms/settings/fundamentals.yaml @@ -3,6 +3,9 @@ # Number of VMs per cluster clustersize: 1 +# The hostname of each node will be clusterprefix + a number +clusterprefix: node + # Jinja2 template to use to generate ready-to-cut cards cards_template: cards.html diff --git a/prepare-vms/settings/jerome.yaml b/prepare-vms/settings/jerome.yaml index 3110dd55..adf74639 100644 --- a/prepare-vms/settings/jerome.yaml +++ b/prepare-vms/settings/jerome.yaml @@ -1,6 +1,9 @@ # Number of VMs per cluster clustersize: 4 +# The hostname of each node will be clusterprefix + a number +clusterprefix: node + # Jinja2 template to use to generate ready-to-cut cards cards_template: jerome.html diff --git a/prepare-vms/settings/kube101.yaml b/prepare-vms/settings/kube101.yaml index 8da41533..8f742e54 100644 --- a/prepare-vms/settings/kube101.yaml +++ b/prepare-vms/settings/kube101.yaml @@ -3,6 +3,9 @@ # Number of VMs per cluster clustersize: 3 +# The hostname of each node will be clusterprefix + a number +clusterprefix: node + # Jinja2 template to use to generate ready-to-cut cards cards_template: kube101.html diff --git a/prepare-vms/settings/swarm.yaml b/prepare-vms/settings/swarm.yaml index c60d8566..67512cba 100644 --- a/prepare-vms/settings/swarm.yaml +++ b/prepare-vms/settings/swarm.yaml @@ -3,6 +3,9 @@ # Number of VMs per cluster clustersize: 3 +# The hostname of each node will be clusterprefix + a number +clusterprefix: node + # Jinja2 template to use to generate ready-to-cut cards cards_template: cards.html