#!/bin/bash # Copyright Istio Authors # # Licensed under the Apache License, Version 2.0 (the "License"); # set -e # This script can only produce desired results on Linux systems. ENVOS=$(uname 2>/dev/null || true) if [[ "${ENVOS}" != "Linux" ]]; then echo "Your environment is not supported by this script." exit 1 fi # Check prerequisites REQUISITES=("kubectl" "kind" "docker") for item in "${REQUISITES[@]}"; do if [[ -z $(which "${item}") ]]; then echo "${item} cannot be found on your system, please install ${item}" exit 1 fi done # Function to print the usage message function printHelp() { echo "Usage: " echo " $0 --cluster-name cluster1 --k8s-release 1.22.1 --ip-octet 255" echo "" echo "Where:" echo " -n|--cluster-name - name of the k8s cluster to be created" echo " -r|--k8s-release - the release of the k8s to setup, latest available if not given" echo " -s|--ip-octet - the 3rd octet for public ip addresses, 255 if not given, valid range: 0-255" echo " -h|--help - print the usage of this script" } # Setup default values CLUSTERNAME="cluster1" K8SRELEASE="" IPSPACE=255 # Handling parameters while [[ $# -gt 0 ]]; do optkey="$1" case $optkey in -h|--help) printHelp; exit 0;; -n|--cluster-name) CLUSTERNAME="$2";shift;shift;; -r|--k8s-release) K8SRELEASE="--image=kindest/node:v$2";shift;shift;; -s|--ip-space) IPSPACE="$2";shift;shift;; *) # unknown option echo "parameter $1 is not supported"; exit 1;; esac done # Create k8s cluster using the giving release and name if [[ -z "${K8SRELEASE}" ]]; then kind create cluster --name "${CLUSTERNAME}" else kind create cluster "${K8SRELEASE}" --name "${CLUSTERNAME}" fi # Setup cluster context kubectl cluster-info --context "kind-${CLUSTERNAME}" # Setup metallb using v0.12. kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12/manifests/namespace.yaml kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.12/manifests/metallb.yaml # The following makes sure that the kube configuration for the cluster is not # using the loopback ip as part of the api server endpoint. Without this, # multiple clusters would not be able to interact with each other. PREFIX=$(docker network inspect -f '{{range .IPAM.Config }}{{ .Gateway }}{{end}}' kind | cut -d '.' -f1,2) # Now configure the loadbalancer public IP range cat <