Use Hostname instead of IP to install k8s
[iec.git] / src / foundation / scripts / startup.sh
index d660f4e..3b8525b 100755 (executable)
@@ -1,4 +1,5 @@
 #!/bin/bash
+# shellcheck disable=SC1073,SC1072,SC1039,SC2059,SC2046
 #Install the k8s-master & k8s-worker node from Mgnt node
 #
 set -e
@@ -7,20 +8,63 @@ set -e
 # Displays the help menu.
 #
 display_help () {
-  echo "Usage: $0 [master ip] [worker ip] [user] [password] "
+  echo "Usage:"
   echo " "
-  echo "There should be an user which will be used to install the "
-  echo "corresponding software on master & worker node. This user can "
+  echo "This script can help you to deploy a simple iec testing"
+  echo "environments."
+  echo "Firstly, the master node and worker node information must"
+  echo "be added into config file which will be used for deployment."
+  echo ""
+  echo "Secondly, there should be an user on each node which will be"
+  echo "used to install the corresponding software on master and"
+  echo "worker nodes. At the same time, this user should be enable to"
   echo "run the sudo command without input password on the hosts."
-  echo " "
+  echo ""
+  echo "In the end, some optional parameters could be directly passed"
+  echo "to startup.sh by shell for easy customizing your own IEC"
+  echo "environments:"
+  echo "-k|--kube:      ---- The version of k8s"
+  echo "-c|--cni-ver:   ---- Kubernetes-cni version"
+  echo "-C|--cni:       ---- CNI type: calico/flannel"
+  echo ""
   echo "Example usages:"
-  echo "   ./startup.sh 10.169.40.171 10.169.41.172 iec 123456"
+  echo "   ./startup.sh #Deploy with default parameters"
+  echo "    #Deploy the flannel with 1.15.2 K8s"
+  echo "   ./startup.sh -C flannel -k 1.15.2 -c 0.7.5"
+  exit
 }
 
-
+#
+# Setup system configuration before invoke setup-cni.sh
+#
+k8s_worker_preconfigure() {
+case ${CNI_TYPE} in
+  contivpp)
+    if [ -n "${DEV_NAME[$ip_addr]}" ]
+    then
+      CONTIVPP_CONFIG="cd iec/src/foundation/scripts/cni/contivpp && sudo ./contiv-update-config.sh ${DEV_NAME[$ip_addr]}"
+      sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${ip_addr} $CONTIVPP_CONFIG
+    fi
+    ;;
+  danm)
+    DANM_CONFIG="cd iec/src/foundation/scripts/cni/danm && sudo ./danm_install.sh"
+    sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${ip_addr} $DANM_CONFIG
+    ;;
+  cilium)
+    CILIUM_CONFIG="cd iec/src/foundation/scripts/cni/cilium && sudo ./cilium_install.sh"
+    sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${ip_addr} $CILIUM_CONFIG
+    ;;
+  ovn-kubernetes)
+    OVN_KUBERNETES_PRECONFIG="cd iec/src/foundation/scripts/cni/ovn-kubernetes && ./clean_old_ovs.sh"
+    sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${ip_addr} $OVN_KUBERNETES_PRECONFIG
+    ;;
+  *)
+    ;;
+esac
+}
 
 #
-# Deploy k8s with calico.
+# Deploy k8s.
 #
 deploy_k8s () {
   set -o xtrace
@@ -28,52 +72,120 @@ deploy_k8s () {
   INSTALL_SOFTWARE="sudo apt-get update && sudo apt-get install -y git &&\
            sudo rm -rf ~/.kube ~/iec &&\
            git clone ${REPO_URL} &&\
-           cd iec/scripts/ && source k8s_common.sh"
+           cd iec/src/foundation/scripts/ && source k8s_common.sh $KUBE_VERSION $CNI_VERSION"
 
   #Automatic deploy the K8s environments on Master node
-  SETUP_MASTER="cd iec/scripts/ && source k8s_master.sh ${K8S_MASTER_IP}"
-  sshpass -p ${K8S_MASTERPW} ssh ${HOST_USER}@${K8S_MASTER_IP} ${INSTALL_SOFTWARE}
-  sshpass -p ${K8S_MASTERPW} ssh ${HOST_USER}@${K8S_MASTER_IP} ${SETUP_MASTER} | tee kubeadm.log
+  SETUP_MASTER="cd iec/src/foundation/scripts/ && source k8s_master.sh ${K8S_MASTER_IP} ${POD_NETWORK_CIDR} ${SVC_CIDR}"
+  sshpass -p ${K8S_MASTERPW} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${K8S_MASTER_IP} ${INSTALL_SOFTWARE}
+  sshpass -p ${K8S_MASTERPW} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${K8S_MASTER_IP} ${SETUP_MASTER} | tee ${LOG_FILE}
 
-  KUBEADM_JOIN_CMD=$(grep "kubeadm join " ./kubeadm.log)
+  TOKEN=$(grep "\--token " ./${LOG_FILE})
+  TOKEN_ID=$(echo ${TOKEN#*"token "}|cut -f1 -d' ')
 
-  #Automatic deploy the K8s environments on Worker node
-  SETUP_WORKER="cd iec/scripts/ && source k8s_worker.sh"
-  sshpass -p ${K8S_WORKERPW} ssh ${HOST_USER}@${K8S_WORKER01_IP} ${INSTALL_SOFTWARE}
-  sshpass -p ${K8S_WORKERPW} ssh ${HOST_USER}@${K8S_WORKER01_IP} "echo \"sudo ${KUBEADM_JOIN_CMD}\" >> ./iec/scripts/k8s_worker.sh"
-  sshpass -p ${K8S_WORKERPW} ssh ${HOST_USER}@${K8S_WORKER01_IP} ${SETUP_WORKER}
+  SH256=$(grep "\--discovery-token-ca-cert-hash " ./${LOG_FILE})
+  TOKEN_CA_SH256=${SH256#*"sha256:"}
 
-  #Deploy etcd & CNI from master node
-  #There may be more options in future. e.g: Calico, Contiv-vpp, Ovn-k8s ...
-  SETUP_CNI="cd iec/scripts && source setup-cni.sh"
-  sshpass -p ${K8S_MASTERPW} ssh ${HOST_USER}@${K8S_MASTER_IP} ${SETUP_CNI}
-}
+  KUBEADM_JOIN_CMD="kubeadm join ${K8S_MASTER_IP}:6443 --token ${TOKEN_ID} --discovery-token-ca-cert-hash sha256:${TOKEN_CA_SH256}"
 
+  #Automatic deploy the K8s environments on each worker-node
+  SETUP_WORKER="cd iec/src/foundation/scripts/ && source k8s_worker.sh"
 
-PASSWD=${4:-"123456"}
-HOST_USER=${3:-"iec"}
+  for worker in "${K8S_WORKER_GROUP[@]}"
+  do
+    ip_addr="$(cut -d',' -f1 <<<${worker})"
+    passwd="$(cut -d',' -f2 <<<${worker})"
+    echo "Install & Deploy on ${ip_addr}. password:${passwd}"
 
-K8S_MASTER_IP=${1:-"10.169.40.171"}
-K8S_MASTERPW=${PASSWD}
+    sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${ip_addr} ${INSTALL_SOFTWARE}
+    sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${ip_addr} "echo \"sudo ${KUBEADM_JOIN_CMD}\" >> ./iec/src/foundation/scripts/k8s_worker.sh"
+    sleep 2
+    k8s_worker_preconfigure
 
-K8S_WORKER01_IP=${2:-"10.169.41.172"}
-K8S_WORKERPW=${PASSWD}
+    sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${ip_addr} ${SETUP_WORKER}
+    sshpass -p ${passwd} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${ip_addr} "sudo swapon -a"
+  done
 
-REPO_URL="https://gerrit.akraino.org/r/iec"
-LOG_FILE="kubeadm.log"
 
-if [ -f "./${LOG_FILE}" ]; then
-  rm "${LOG_FILE}"
-fi
+  #Deploy etcd & CNI from master node
+  SETUP_CNI="cd iec/src/foundation/scripts && source setup-cni.sh $CNI_TYPE $POD_NETWORK_CIDR $K8S_MASTER_IP $SVC_CIDR $CLUSTER_IP"
+  sshpass -p ${K8S_MASTERPW} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${K8S_MASTER_IP} ${SETUP_CNI}
+  SETUP_HELM="cd iec/src/foundation/scripts && source helm.sh"
+  sshpass -p ${K8S_MASTERPW} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${K8S_MASTER_IP} ${SETUP_HELM}
+
+}
 
 #
-# Init
+# Check the K8s environments
 #
-if [ $# -lt 4 ]
-then
-  display_help
-  exit 0
-fi
+check_k8s_status(){
+  set -o xtrace
 
+  VERIFY_K8S="cd iec/src/foundation/scripts/ && source nginx.sh"
+  sshpass -p ${K8S_MASTERPW} ssh -o StrictHostKeyChecking=no ${HOST_USER}@${K8S_MASTER_IP} ${VERIFY_K8S}
+}
+
+#
+# print environments
+#
+printOption(){
+  echo "K8S_MASTER_IP:${K8S_MASTER_IP}"
+  echo "HOST_USER:${HOST_USER}"
+  echo "REPO_URL:${REPO_URL}"
+
+  echo "The number of K8s-Workers:${#K8S_WORKER_GROUP[@]}"
+  for worker in "${K8S_WORKER_GROUP[@]}"
+  do
+    ip_addr="$(cut -d',' -f1 <<<${worker})"
+    passwd="$(cut -d',' -f2 <<<${worker})"
+    echo "Install & Deploy on ${ip_addr}. password:${passwd}"
+  done
+
+  echo "KUBE_VERSION: ${KUBE_VERSION}"
+  echo "CNI_TPYE: ${CNI_TYPE}"
+  echo "CLUSTER_IP: ${CLUSTER_IP}"
+  echo "POD_NETWORK_CIDR: ${POD_NETWORK_CIDR}"
+}
+
+# Read the configuration file
+source config
+
+rm -f "${LOG_FILE}"
+
+ARGS=`getopt -a -o C:k:c:h -l cni:,kube:,cni-ver:,help -- "$@"`
+eval set -- "${ARGS}"
+while true
+do
+        case "$1" in
+        -C|--cni)
+                CNI_TYPE="$2"
+                echo "CNI_TYPE=$2"
+                shift
+                ;;
+        -k|--kube)
+                echo "This is config kube version:$2"
+                KUBE_VERSION="$2"
+                shift
+                ;;
+        -c|--cni-ver)
+                echo "This is config cni version:$2"
+                CNI_VERSION="$2"
+                shift
+                ;;
+        -h|--help)
+                echo "this is help case"
+                display_help
+                ;;
+        --)
+                printOption
+                shift
+                break
+                ;;
+        esac
+shift
+done
 
 deploy_k8s
+
+sleep 20
+
+check_k8s_status