137 lines
6.0 KiB
Bash
137 lines
6.0 KiB
Bash
|
#!/bin/sh
|
||
|
|
||
|
# 1st Step - Ask user for no. of cluster nodes
|
||
|
echo "How many nodes would you like your cluster to have?"
|
||
|
read NODECOUNT
|
||
|
|
||
|
# 2nd Step - Ask user for node details & store in tmp files
|
||
|
for ((i=0; i < $NODECOUNT; i++))
|
||
|
do
|
||
|
echo "Please enter the IP address of the ${i}th node: "
|
||
|
read IPADDR_$i
|
||
|
echo "${IPADDR_$i}" > /tmp/node${i}_ip.txt
|
||
|
|
||
|
echo "Please enter the username for SSH access to the ${i}th node (defaults to 'root'):"
|
||
|
read USERNAME_$i
|
||
|
if [ -z $USERNAME ]
|
||
|
then USERNAME="root";
|
||
|
fi
|
||
|
echo "${USERNAME}" > /tmp/node${i}_user.txt
|
||
|
|
||
|
echo "Please enter the password for SSH access to the ${i}th node (defaults to 'root'):"
|
||
|
read PASSWORD_$i
|
||
|
if [ -z $PASSWORD ]
|
||
|
then PASSWORD="root";
|
||
|
fi
|
||
|
echo "${PASSWORD}" > /tmp/node${i}_pass.txt
|
||
|
done
|
||
|
|
||
|
# 3rd Step - Confirm node details with user & allow them to edit if necessary
|
||
|
echo "The following IP addresses were entered by the user:"
|
||
|
for ((i=0; i < $NODECOUNT; i++))
|
||
|
do
|
||
|
echo "${IPADDR_$i}"
|
||
|
done
|
||
|
read -p "Please confirm these are correct, or type 'edit' to make changes: " USERCONFIRMATION
|
||
|
if [ "$USERCONFIRMATION" == "edit" ]
|
||
|
then
|
||
|
for ((i=0; i < $NODECOUNT; i++))
|
||
|
do
|
||
|
echo "Please enter the IP address of the ${i}th node: "
|
||
|
read IPADDR_$i
|
||
|
echo "${IPADDR_$i}" > /tmp/node${i}_ip.txt
|
||
|
|
||
|
echo "Please enter the username for SSH access to the ${i}th node (defaults to 'root'):"
|
||
|
read USERNAME_$i
|
||
|
if [ -z $USERNAME ]
|
||
|
then USERNAME="root";
|
||
|
fi
|
||
|
echo "${USERNAME}" > /tmp/node${i}_user.txt
|
||
|
|
||
|
echo "Please enter the password for SSH access to the ${i}th node (defaults to 'root'):"
|
||
|
read PASSWORD_$<s> i
|
||
|
if [ -z $PASSWORD ]
|
||
|
then PASSWORD="root";
|
||
|
fi
|
||
|
echo "${PASSWORD}" > /tmp/node${i}_pass.txt
|
||
|
done
|
||
|
fi
|
||
|
|
||
|
# 4th Step - Ask user to define master node & store selection in tmp files
|
||
|
echo "Please enter the number of the node you would like to define as your control plane (master):"
|
||
|
read MASTERNODE_SELECTION
|
||
|
echo "${MASTERNODE_SELECTION}" > /tmp/master.txt
|
||
|
|
||
|
# 5th Step - Add K8S repo & relevant keys to each node, install K8S & restart services
|
||
|
for ((i=0; i < $NODECOUNT; i++))
|
||
|
do
|
||
|
echo "Adding Kubernetes repo to the system sources list on ${IPADDR_$i}..."
|
||
|
ssh -n $USERNAME_$i@${IPADDR_$i} 'sudo sh -c "echo deb http://apt.kubernetes.io/ kubernetes-xenial main > /etc/apt/sources.list.d/kubernetes.list"'
|
||
|
|
||
|
echo "Adding GPG key to the system on ${IPADDR_$i}..."
|
||
|
ssh -n $USERNAME_$i@${IPADDR_$i} 'sudo curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -'
|
||
|
|
||
|
echo "Updating package list on ${IPADDR_$i}..."
|
||
|
ssh -n $USERNAME_$i@${IPADDR_$i} 'sudo sh -c "apt update"'
|
||
|
|
||
|
echo "Upgrading packages on ${IPADDR_$i}..."
|
||
|
ssh -n $USERNAME_$i@${IPADDR_$i} 'sudo sh -c "apt upgrade"'
|
||
|
done
|
||
|
|
||
|
# 6th Step - Install K8S on master node and ask for configuration options from user
|
||
|
echo "Installing Kubernetes on the master node..."
|
||
|
ssh -n $USERNAME_$MASTERNODE_SELECTION@${IPADDR_$MASTERNODE_SELECTION} 'sudo sh -c "apt install kubeadm; apt-get install kubelet; apt-get install kubernetes-cni"'
|
||
|
|
||
|
echo "Please enter your preferred port number for the control plane (master node) (defaults to 6443): "
|
||
|
read PORT_SELECTION
|
||
|
if [ -z $PORT_SELECTION ]
|
||
|
then PORT_SELECTION="6443";
|
||
|
fi
|
||
|
|
||
|
echo "Please enter your preferred IP address or FQDN for the control plane (master node) (defaults to '0.0.0.0'): "
|
||
|
read IPADDRESS_SELECTION
|
||
|
if [ -z $IPADDRESS_SELECTION ]
|
||
|
then IPADDRESS_SELECTION="0.0.0.0";
|
||
|
fi
|
||
|
|
||
|
echo "Configuring Kubernetes on the master node, using port ${PORT_SELECTION} and listening IP/domain ${IPADDRESS_SELECTION}..."
|
||
|
ssh -n $USERNAME_$MASTERNODE_SELECTION@${IPADDR_$MASTERNODE_SELECTION} 'sudo sh -c "kubeadm init --apiserver-advertise-address=$IPADDRESS_SELECTION --apiserver-bind-port=$PORT_SELECTION"'
|
||
|
|
||
|
echo "Please enter the following options to configure the Kubernetes control plane (master node)..."
|
||
|
echo "1. Pod Network CIDR: "
|
||
|
read NETWORKCIDR_SELECTION
|
||
|
echo "${NETWORKCIDR_SELECTION}" > /tmp/network.txt
|
||
|
|
||
|
echo "2. Service Subnet: "
|
||
|
read SERVICESUBNET_SELECTION
|
||
|
echo "${SERVICESUBNET_SELECTION}" > /tmp/servicesubnet.txt
|
||
|
|
||
|
echo "3. Kubernetes DNS Domain: "
|
||
|
read K8SDNS_SELECTION
|
||
|
echo "${K8SDNS_SELECTION}" > /tmp/kube-dns.txt
|
||
|
|
||
|
echo "Please enter your preferred Kubernetes version (defaults to '1.20.1'): "
|
||
|
read K8SVERSION_SELECTION
|
||
|
if [ -z $K8SVERSION_SELECTION ]
|
||
|
then K8SVERSION_SELECTION="1.20.1";
|
||
|
fi
|
||
|
|
||
|
echo "Please enter your preferred pod Network provider (defaults to 'calico'): "
|
||
|
read NETWORKPROVIDER_SELECTION
|
||
|
if [ -z $NETWORKPROVIDER_SELECT<s> ION_SELECTION ]
|
||
|
then NETWORKPROVIDER_SELECTION="calico";
|
||
|
fi
|
||
|
|
||
|
echo "Configuring Kubernetes on the master node with pod Network CIDR: ${NETWORKCIDR_SELECTION}, service subnet: ${SERVICESUBNET_SELECTION}, K8S DNS domain: ${K8SDNS_SELECTION}, K8S version: ${K8SVERSION_SELECTION}, and pod network provider: ${NETWORKPROVIDER_SELECTION}..."
|
||
|
ssh -n $USERNAME_$MASTERNODE_SELECTION@${IPADDR_$MASTERNODE_SELECTION} 'sudo sh -c "kubectl apply --kubelet-extra-args '--node-ip=$IPADDRESS_SELECTION' -f https://docs.projectcalico.org/manifests/kube-flannel.yaml; kubeadm init phase addon all; kubectl apply --kubelet-extra-args '--node-ip=$IPADDRESS_SELECTION' -f https://docs.projectcalico.org/manifests/kube-flannel.yaml; kubectl create deployment nginx-deployment --image=nginx; kubectl expose deployments nginx-deployment --port 80 --type LoadBalancer"'
|
||
|
|
||
|
echo "Restarting Kubernetes services on the master node..."
|
||
|
ssh -n $USERNAME_$MASTERNODE_SELECTION@${IPADDR_$MASTERNODE_SELECTION} 'sudo sh -c "systemctl restart kubelet.service"'
|
||
|
|
||
|
echo "Restarting Kubernetes services on all nodes..."
|
||
|
for ((i=0; i < $NODECOUNT; i++))
|
||
|
do
|
||
|
echo "Restarting Kubernetes services on the ${IPADDR_$i} node..."
|
||
|
ssh -n $USERNAME_$i@${IPADDR_$i} 'sudo sh -c "systemctl restart kubelet.service"'
|
||
|
done
|