#!/usr/bin/env bash ### # create_stack.sh - Intialize a Kubernetes cluster and install components ## set -o errexit set -o pipefail set -o nounset CUR_DIR=$(pwd) SCRIPT_DIR="$(dirname "${BASH_SOURCE[0]}")" : ${TOKEN:=} : ${MASTER_IP:=} : ${CERT_SANS:=} HIGH_POD_COUNT=${HIGH_POD_COUNT:-""} # versions CANAL_VER="${CLRK8S_CANAL_VER:-v3.10}" CILIUM_VER="${CLRK8S_CILIUM_VER:-v1.6}" FLANNEL_VER="${CLRK8S_FLANNEL_VER:-16b0fe66285d1ad1f42b154ab852682f6fafb1a7}" K8S_VER="${CLRK8S_K8S_VER:-}" KATA_VER="${CLRK8S_KATA_VER:-1.8.2-kernel-config}" ROOK_VER="${CLRK8S_ROOK_VER:-v1.1.1}" METRICS_VER="${CLRK8S_METRICS_VER:-v0.3.5}" DASHBOARD_VER="${CLRK8S_DASHBOARD_VER:-v2.0.0-beta2}" INGRES_VER="${CLRK8S_INGRES_VER:-nginx-0.25.1}" EFK_VER="${CLRK8S_EFK_VER:-v1.15.1}" METALLB_VER="${CLRK8S_METALLB_VER:-v0.8.1}" NPD_VER="${CLRK8S_NPD_VER:-v0.6.6}" PROMETHEUS_VER="${CLRK8S_PROMETHEUS_VER:-f458e85e5d7675f7bc253072e1b4c8892b51af0f}" CNI=${CLRK8S_CNI:-"canal"} RUNNER=${CLRK8S_RUNNER:-"crio"} NFD_VER="${CLRK8S_NFD_VER:-v0.4.0}" function print_usage_exit() { exit_code=${1:-0} cat </dev/null 2>&1) || $? -ne 0 ]]; do echo "Waiting for Prometheus CRDs" sleep 2 done #Expose the dashboards #kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090 & #kubectl --namespace monitoring port-forward svc/grafana 3000 & #kubectl --namespace monitoring port-forward svc/alertmanager-main 9093 & } function dashboard() { DASHBOARD_VER=${1:-$DASHBOARD_VER} DASHBOARD_URL="https://github.com/kubernetes/dashboard.git" DASHBOARD_DIR="2-dashboard" get_repo "${DASHBOARD_URL}" "${DASHBOARD_DIR}/overlays/${DASHBOARD_VER}" set_repo_version "${DASHBOARD_VER}" "${DASHBOARD_DIR}/overlays/${DASHBOARD_VER}/dashboard" kubectl apply -k "${DASHBOARD_DIR}/overlays/${DASHBOARD_VER}" } function ingres() { INGRES_VER=${1:-$INGRES_VER} INGRES_URL="https://github.com/kubernetes/ingress-nginx.git" INGRES_DIR="5-ingres-lb" get_repo "${INGRES_URL}" "${INGRES_DIR}/overlays/${INGRES_VER}" set_repo_version "${INGRES_VER}" "${INGRES_DIR}/overlays/${INGRES_VER}/ingress-nginx" kubectl apply -k "${INGRES_DIR}/overlays/${INGRES_VER}" } function efk() { EFK_VER=${1:-$EFK_VER} EFK_URL="https://github.com/kubernetes/kubernetes.git" EFK_DIR="3-efk" get_repo "${EFK_URL}" "${EFK_DIR}/overlays/${EFK_VER}" set_repo_version "${EFK_VER}" "${EFK_DIR}/overlays/${EFK_VER}/kubernetes" kubectl apply -k "${EFK_DIR}/overlays/${EFK_VER}" } function metallb() { METALLB_VER=${1:-$METALLB_VER} METALLB_URL="https://github.com/danderson/metallb.git" METALLB_DIR="6-metal-lb" get_repo "${METALLB_URL}" "${METALLB_DIR}/overlays/${METALLB_VER}" set_repo_version "${METALLB_VER}" "${METALLB_DIR}/overlays/${METALLB_VER}/metallb" kubectl apply -k "${METALLB_DIR}/overlays/${METALLB_VER}" } function npd() { NPD_VER=${1:-$NPD_VER} NPD_URL="https://github.com/kubernetes/node-problem-detector.git" NPD_DIR="node-problem-detector" get_repo "${NPD_URL}" "${NPD_DIR}/overlays/${NPD_VER}" set_repo_version "${NPD_VER}" "${NPD_DIR}/overlays/${NPD_VER}/node-problem-detector" kubectl apply -k "${NPD_DIR}/overlays/${NPD_VER}" } # node feature discovery function nfd() { NFD_VER=${1:-$NFD_VER} NFD_URL="https://github.com/kubernetes-sigs/node-feature-discovery.git" NFD_DIR="node-feature-discovery" get_repo "${NFD_URL}" "${NFD_DIR}/overlays/${NFD_VER}" set_repo_version "${NFD_VER}" "${NFD_DIR}/overlays/${NFD_VER}/node-feature-discovery" kubectl apply -k "${NFD_DIR}/overlays/${NFD_VER}" } function miscellaneous() { # dashboard dashboard # EFK efk #Create an ingress load balancer ingres #Create a bare metal load balancer. #kubectl apply -f 6-metal-lb/metallb.yaml #The config map should be properly modified to pick a range that can live #on this subnet behind the same gateway (i.e. same L2 domain) #kubectl apply -f 6-metal-lb/example-layer2-config.yaml } function minimal() { cluster_init cni kata metrics } function all() { minimal storage monitoring miscellaneous } function get_repo() { local repo="${1}" local path="${2}" clone_dir=$(basename "${repo}" .git) [[ -d "${path}/${clone_dir}" ]] || git -C "${path}" clone "${repo}" } function set_repo_version() { local ver="${1}" local path="${2}" pushd "$(pwd)" cd "${path}" git fetch origin "${ver}" git -c advice.detachedHead=false checkout "${ver}" popd } ### # main ## declare -A command_handlers command_handlers[init]=cluster_init command_handlers[cni]=cni command_handlers[minimal]=minimal command_handlers[all]=all command_handlers[help]=print_usage_exit command_handlers[storage]=storage command_handlers[monitoring]=monitoring command_handlers[metallb]=metallb command_handlers[npd]=npd command_handlers[nfd]=nfd declare -A command_help command_help[init]="Only inits a cluster using kubeadm" command_help[cni]="Setup network for running cluster" command_help[minimal]="init + cni + kata + metrics" command_help[all]="minimal + storage + monitoring + miscellaneous" command_help[help]="show this message" command_help[nfd]="node feature discovery" cd "${SCRIPT_DIR}" cmd_handler=${command_handlers[${1:-none}]:-unimplemented} if [ "${cmd_handler}" != "unimplemented" ]; then if [ $# -eq 1 ]; then "${cmd_handler}" exit $? fi "${cmd_handler}" "$2" else print_usage_exit 1 fi