231 lines
5.7 KiB
Bash
Executable File
231 lines
5.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Copyright (c) 2020 Cisco and/or its affiliates.
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at:
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
SCRIPTDIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
|
|
|
function is_ip6 () {
|
|
if [[ $1 =~ .*:.* ]]; then
|
|
echo "true"
|
|
else
|
|
echo "false"
|
|
fi
|
|
}
|
|
|
|
function green ()
|
|
{
|
|
printf "\e[0;32m$1\e[0m\n"
|
|
}
|
|
|
|
function red ()
|
|
{
|
|
printf "\e[0;31m$1\e[0m\n"
|
|
}
|
|
|
|
function 6safe () {
|
|
if [[ $(is_ip6 $1) = true ]]; then
|
|
echo "[$1]"
|
|
else
|
|
echo "$1"
|
|
fi
|
|
}
|
|
|
|
function parse_variables ()
|
|
{
|
|
FIRST_POD_CIDR=""
|
|
for cidr in $(echo $POD_CIDR | sed 's/,/ /g' ) ; do
|
|
if [[ x$FIRST_POD_CIDR == x ]]; then
|
|
FIRST_POD_CIDR=$cidr
|
|
fi
|
|
if [[ $(is_ip6 $cidr) == true ]]; then
|
|
CLUSTER_POD_CIDR6=$cidr
|
|
else
|
|
CLUSTER_POD_CIDR4=$cidr
|
|
fi
|
|
done
|
|
|
|
FIRST_SERVICE_CIDR=""
|
|
for cidr in $(echo $SERVICE_CIDR | sed 's/,/ /g' ) ; do
|
|
if [[ x$FIRST_SERVICE_CIDR == x ]]; then
|
|
FIRST_SERVICE_CIDR=$cidr
|
|
fi
|
|
done
|
|
|
|
FIRST_NODE_IP=""
|
|
for cidr in $(echo $NODE_IP | sed 's/,/ /g' ) ; do
|
|
if [[ x$FIRST_NODE_IP == x ]]; then
|
|
FIRST_NODE_IP=${cidr%%/*}
|
|
fi
|
|
done
|
|
|
|
if [[ x$CLUSTER_POD_CIDR4 != x ]] && [[ x$CLUSTER_POD_CIDR6 != x ]]; then
|
|
IS_DUAL=true
|
|
else
|
|
IS_DUAL=false
|
|
fi
|
|
}
|
|
|
|
function calico_if_linux_setup ()
|
|
{
|
|
sudo modprobe vfio-pci
|
|
echo Y | sudo tee /sys/module/vfio/parameters/enable_unsafe_noiommu_mode
|
|
|
|
sudo ip link set $VPP_DATAPLANE_IF down
|
|
if [ x$RENAME_IF != x ]; then
|
|
sudo ip link set dev $VPP_DATAPLANE_IF name $RENAME_IF
|
|
fi
|
|
sudo ip link set $VPP_DATAPLANE_IF up
|
|
sudo ip addr flush dev $VPP_DATAPLANE_IF
|
|
for cidr in $(echo $NODE_IP | sed 's/,/ /g' ) ; do
|
|
sudo ip addr add $cidr dev $VPP_DATAPLANE_IF
|
|
done
|
|
}
|
|
|
|
function raw_create_cluster_conf ()
|
|
{
|
|
# node ip
|
|
export MAIN_NODE_IP=$MAIN_NODE_IP
|
|
export SAFE6_MAIN_NODE_IP="$(6safe $MAIN_NODE_IP)"
|
|
# node ip
|
|
export FIRST_NODE_IP=$FIRST_NODE_IP
|
|
export SAFE6_FIRST_NODE_IP="$(6safe $FIRST_NODE_IP)"
|
|
|
|
if [[ $IS_DUAL == true ]]; then
|
|
export NODE_CIDR_MASK_SIZE4=16
|
|
export NODE_CIDR_MASK_SIZE6=80
|
|
export DISABLE_NODE_CIDR_MASK="# "
|
|
export DISABLE_NODE_CIDR_MASK_SIZE4=
|
|
export DISABLE_NODE_CIDR_MASK_SIZE6=
|
|
elif [[ x$CLUSTER_POD_CIDR6 != x ]]; then
|
|
export NODE_CIDR_MASK_SIZE=80
|
|
export DISABLE_NODE_CIDR_MASK=
|
|
export DISABLE_NODE_CIDR_MASK_SIZE4="# "
|
|
export DISABLE_NODE_CIDR_MASK_SIZE6="# "
|
|
else
|
|
export NODE_CIDR_MASK_SIZE=16
|
|
export DISABLE_NODE_CIDR_MASK=
|
|
export DISABLE_NODE_CIDR_MASK_SIZE4="# "
|
|
export DISABLE_NODE_CIDR_MASK_SIZE6="# "
|
|
fi
|
|
# pod cidr
|
|
export POD_CIDR=$POD_CIDR
|
|
export FIRST_POD_CIDR=$FIRST_POD_CIDR
|
|
#
|
|
export SERVICE_CIDR=$SERVICE_CIDR
|
|
export FIRST_SERVICE_CIDR=$FIRST_SERVICE_CIDR
|
|
export NODE_NAME=$NODE_NAME
|
|
export DNS_TYPE=$DNS_TYPE
|
|
export IS_DUAL=$IS_DUAL
|
|
export K8_VERSION=${K8_VERSION:=v1.31.0}
|
|
cat $1 | envsubst | sudo tee /tmp/ClusterConf.yaml > /dev/null
|
|
}
|
|
|
|
function raw_create_master_k8 ()
|
|
{
|
|
calico_if_linux_setup
|
|
raw_create_cluster_conf $SCRIPTDIR/kubeadm/ClusterNewConfiguration.template.yaml
|
|
if [ x$VERBOSE = xyes ]; then
|
|
sudo kubeadm init -v 100 --config /tmp/ClusterConf.yaml $@
|
|
else
|
|
sudo kubeadm init --config /tmp/ClusterConf.yaml $@
|
|
fi
|
|
rm -rf $HOME/.kube
|
|
mkdir -p $HOME/.kube
|
|
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
|
|
sudo chown $(id -u):$(id -g) $HOME/.kube/config
|
|
kubectl config set-context --current --namespace=kube-system
|
|
}
|
|
|
|
function raw_join_master_k8 ()
|
|
{
|
|
calico_if_linux_setup
|
|
raw_create_cluster_conf $SCRIPTDIR/kubeadm/ClusterJoinConfiguration.template.yaml
|
|
if [ x$VERBOSE = xyes ]; then
|
|
sudo kubeadm join -v 100 $MAIN_NODE_IP:6443 --config /tmp/ClusterConf.yaml $@
|
|
else
|
|
sudo kubeadm join $MAIN_NODE_IP:6443 --config /tmp/ClusterConf.yaml $@
|
|
fi
|
|
}
|
|
|
|
function provision_cli ()
|
|
{
|
|
NODE_NAME=node
|
|
POD_CIDR=10.0.0.0/16
|
|
SERVICE_CIDR=10.96.0.0/16
|
|
DNS_TYPE=CoreDNS
|
|
if [[ $1 = up ]]; then
|
|
ACTION=up
|
|
elif [[ $1 = dn ]]; then
|
|
ACTION=dn
|
|
else
|
|
print_usage_and_exit;
|
|
fi
|
|
shift
|
|
|
|
while (( "$#" )) ; do
|
|
eval $1
|
|
shift
|
|
done
|
|
VPP_DATAPLANE_IF=$IF
|
|
if [[ x$VPP_DATAPLANE_IF = x ]] && [[ x$ACTION = up ]]; then
|
|
print_usage_and_exit
|
|
fi
|
|
|
|
|
|
if [[ $ACTION = up ]]; then
|
|
green "Creating cluster"
|
|
green "master ip : $MAIN_NODE_IP"
|
|
green "node ip : $NODE_IP"
|
|
green "pod cidr : $POD_CIDR"
|
|
green "service cidr : $SERVICE_CIDR"
|
|
else
|
|
green "Teardown cluster"
|
|
fi
|
|
|
|
parse_variables
|
|
if [[ $ACTION = up ]] && [[ x$MAIN_NODE_IP = x ]]; then
|
|
raw_create_master_k8
|
|
elif [[ $ACTION = up ]]; then
|
|
raw_join_master_k8
|
|
elif [[ $ACTION = dn ]]; then
|
|
sudo kubeadm reset -f
|
|
sudo rm -rf /etc/cni/net.d/
|
|
fi
|
|
|
|
}
|
|
|
|
function print_usage_and_exit ()
|
|
{
|
|
echo "Usage :"
|
|
echo "provision.sh [up|dn] [OPTIONS]"
|
|
echo
|
|
echo "On the first node - provision.sh up IF=eth0 NODE_IP=10.0.0.1/24"
|
|
echo "On the second - provision.sh up IF=eth0 NODE_IP=10.0.0.2/24 MAIN_NODE_IP=10.0.0.1 - start master node <IP>"
|
|
echo
|
|
echo "To drain - provision.sh dn"
|
|
echo
|
|
echo "Options are :"
|
|
echo "IF - linux if name to use"
|
|
echo "NODE_IP - ip of this node"
|
|
echo "MAIN_NODE_IP - ip of the master node to join (if any)"
|
|
echo "POD_CIDR - CIDR for pods (defaults to 10.0.0.0/16)"
|
|
echo "SERVICE_CIDR - CIDR for services (defaults to 10.96.0.0/16)"
|
|
echo "DNS_TYPE - CoreDNS or kube-dns"
|
|
echo "VERBOSE - verbose"
|
|
exit 1
|
|
}
|
|
|
|
provision_cli $@
|
|
|