X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=installers%2Ffull_install_osm.sh;h=d9f09954565e966c19ab930704a02289994ea391;hb=18d047ff163473669a017b6baa1f0bf814344839;hp=41f0abb4cf9094a6343f14daf485daeb0d3535ab;hpb=5d394b2d447d8ebce44a346af624826041346a7f;p=osm%2Fdevops.git diff --git a/installers/full_install_osm.sh b/installers/full_install_osm.sh index 41f0abb4..d9f09954 100755 --- a/installers/full_install_osm.sh +++ b/installers/full_install_osm.sh @@ -462,17 +462,19 @@ function juju_createcontroller() { } function juju_addk8s() { - cat $HOME/.kube/config | juju add-k8s $OSM_VCA_K8S_CLOUDNAME --controller $OSM_STACK_NAME --storage openebs-hostpath + cat $HOME/.kube/config | juju add-k8s $OSM_VCA_K8S_CLOUDNAME --controller $OSM_STACK_NAME --storage openebs-hostpath \ + || FATAL "Failed to add K8s endpoint and credential for controller $OSM_STACK_NAME in cloud $OSM_VCA_K8S_CLOUDNAME" } function juju_createcontroller_k8s(){ - cat $HOME/.kube/config | juju add-k8s $OSM_VCA_K8S_CLOUDNAME --client + cat $HOME/.kube/config | juju add-k8s $OSM_VCA_K8S_CLOUDNAME --client \ + || FATAL "Failed to add K8s endpoint and credential for client in cloud $OSM_VCA_K8S_CLOUDNAME" juju bootstrap $OSM_VCA_K8S_CLOUDNAME $OSM_STACK_NAME \ --config controller-service-type=loadbalancer \ - --agent-version=$JUJU_AGENT_VERSION + --agent-version=$JUJU_AGENT_VERSION \ + || FATAL "Failed to bootstrap controller $OSM_STACK_NAME in cloud $OSM_VCA_K8S_CLOUDNAME" } - function juju_addlxd_cloud(){ mkdir -p /tmp/.osm OSM_VCA_CLOUDNAME="lxd-cloud" @@ -513,7 +515,6 @@ EOF juju controller-config features=[k8s-operators] } - function juju_createproxy() { check_install_iptables_persistent @@ -553,6 +554,7 @@ function generate_docker_images() { if [ -z "$TO_REBUILD" ] || echo $TO_REBUILD | grep -q GRAFANA ; then sg docker -c "docker pull grafana/grafana:${GRAFANA_TAG}" || FATAL "cannot get grafana docker image" + sg docker -c "docker pull kiwigrid/k8s-sidecar:${KIWIGRID_K8S_SIDECAR_TAG}" || FATAL "cannot get kiwigrid k8s-sidecar docker image" fi if [ -z "$TO_REBUILD" ] || echo $TO_REBUILD | grep -q NBI || echo $TO_REBUILD | grep -q KEYSTONE-DB ; then @@ -802,7 +804,11 @@ function install_kube() { sudo add-apt-repository "deb https://apt.kubernetes.io/ kubernetes-xenial main" sudo apt-get update echo "Installing Kubernetes Packages ..." - sudo apt-get install -y kubelet=1.15.0-00 kubeadm=1.15.0-00 kubectl=1.15.0-00 + K8S_VERSION=1.23.3-00 + sudo apt-get install -y kubelet=${K8S_VERSION} kubeadm=${K8S_VERSION} kubectl=${K8S_VERSION} + cat << EOF | sudo tee -a /etc/default/kubelet + KUBELET_EXTRA_ARGS="--cgroup-driver=cgroupfs" +EOF sudo apt-mark hold kubelet kubeadm kubectl } @@ -822,11 +828,14 @@ function kube_config_dir() { } function install_k8s_storageclass() { + echo "Installing open-iscsi" + sudo apt-get update + sudo apt-get install open-iscsi + sudo systemctl enable --now iscsid echo "Installing OpenEBS" - kubectl create ns openebs helm repo add openebs https://openebs.github.io/charts helm repo update - helm install --namespace openebs openebs openebs/openebs --version 1.12.0 + helm install --create-namespace --namespace openebs openebs openebs/openebs --version 3.1.0 helm ls -n openebs local storageclass_timeout=400 local counter=0 @@ -850,8 +859,9 @@ function install_k8s_storageclass() { } function install_k8s_metallb() { - METALLB_IP_RANGE=$DEFAULT_IP-$DEFAULT_IP - cat ${OSM_DEVOPS}/installers/k8s/metallb/metallb.yaml | kubectl apply -f - + METALLB_IP_RANGE=$DEFAULT_IP/32 + kubectl apply -f ${OSM_DEVOPS}/installers/k8s/metallb/metallb.yaml \ + || FATAL "Cannot install MetalLB" echo "apiVersion: v1 kind: ConfigMap metadata: @@ -863,8 +873,106 @@ data: - name: default protocol: layer2 addresses: - - $METALLB_IP_RANGE" | kubectl apply -f - + - $METALLB_IP_RANGE" | kubectl apply -f - \ + || FATAL "Cannot apply MetalLB ConfigMap" +} + +#installs metallb from helm +function install_helm_metallb() { + METALLB_IP_RANGE=$DEFAULT_IP/32 + echo "configInline: + address-pools: + - name: default + protocol: layer2 + addresses: + - $METALLB_IP_RANGE" | sudo tee -a $OSM_DOCKER_WORK_DIR/metallb-config.yaml + helm repo add metallb https://metallb.github.io/metallb + helm repo update + helm install --create-namespace --namespace metallb-system metallb metallb/metallb -f $OSM_DOCKER_WORK_DIR/metallb-config.yaml +} + +#checks openebs and metallb readiness +function check_for_readiness() { + # Default input values + sampling_period=2 # seconds + time_for_readiness=20 # seconds ready + time_for_failure=200 # seconds broken + OPENEBS_NAMESPACE=openebs + METALLB_NAMESPACE=metallb-system + # STACK_NAME=osm # By default, "osm" + + # Equivalent number of samples + oks_threshold=$((time_for_readiness/${sampling_period})) # No. ok samples to declare the system ready + failures_threshold=$((time_for_failure/${sampling_period})) # No. nok samples to declare the system broken + failures_in_a_row=0 + oks_in_a_row=0 + + #################################################################################### + # Loop to check system readiness + #################################################################################### + while [[ (${failures_in_a_row} -lt ${failures_threshold}) && (${oks_in_a_row} -lt ${oks_threshold}) ]] + do + # State of OpenEBS + OPENEBS_STATE=$(kubectl get pod -n ${OPENEBS_NAMESPACE} --no-headers 2>&1) + OPENEBS_READY=$(echo "${OPENEBS_STATE}" | awk '$2=="1/1" || $2=="2/2" {printf ("%s\t%s\t\n", $1, $2)}') + OPENEBS_NOT_READY=$(echo "${OPENEBS_STATE}" | awk '$2!="1/1" && $2!="2/2" {printf ("%s\t%s\t\n", $1, $2)}') + COUNT_OPENEBS_READY=$(echo "${OPENEBS_READY}"| grep -v -e '^$' | wc -l) + COUNT_OPENEBS_NOT_READY=$(echo "${OPENEBS_NOT_READY}" | grep -v -e '^$' | wc -l) + + # State of MetalLB + METALLB_STATE=$(kubectl get pod -n ${METALLB_NAMESPACE} --no-headers 2>&1) + METALLB_READY=$(echo "${METALLB_STATE}" | awk '$2=="1/1" || $2=="2/2" {printf ("%s\t%s\t\n", $1, $2)}') + METALLB_NOT_READY=$(echo "${METALLB_STATE}" | awk '$2!="1/1" && $2!="2/2" {printf ("%s\t%s\t\n", $1, $2)}') + COUNT_METALLB_READY=$(echo "${METALLB_READY}" | grep -v -e '^$' | wc -l) + COUNT_METALLB_NOT_READY=$(echo "${METALLB_NOT_READY}" | grep -v -e '^$' | wc -l) + + # OK sample + if [[ $((${COUNT_OPENEBS_NOT_READY}+${COUNT_METALLB_NOT_READY})) -eq 0 ]] + then + ((++oks_in_a_row)) + failures_in_a_row=0 + echo -ne ===\> Successful checks: "${oks_in_a_row}"/${oks_threshold}\\r + # NOK sample + else + ((++failures_in_a_row)) + oks_in_a_row=0 + echo + echo Bootstraping... "${failures_in_a_row}" checks of ${failures_threshold} + + # Reports failed pods in OpenEBS + if [[ "${COUNT_OPENEBS_NOT_READY}" -ne 0 ]] + then + echo "OpenEBS: Waiting for ${COUNT_OPENEBS_NOT_READY} of $((${COUNT_OPENEBS_NOT_READY}+${COUNT_OPENEBS_READY})) pods to be ready:" + echo "${OPENEBS_NOT_READY}" + echo + fi + + # Reports failed statefulsets + if [[ "${COUNT_METALLB_NOT_READY}" -ne 0 ]] + then + echo "MetalLB: Waiting for ${COUNT_METALLB_NOT_READY} of $((${COUNT_METALLB_NOT_READY}+${COUNT_METALLB_READY})) pods to be ready:" + echo "${METALLB_NOT_READY}" + echo + fi + fi + + #------------ NEXT SAMPLE + sleep ${sampling_period} + done + + #################################################################################### + # OUTCOME + #################################################################################### + if [[ (${failures_in_a_row} -ge ${failures_threshold}) ]] + then + echo + FATAL "K8S CLUSTER IS BROKEN" + else + echo + echo "K8S CLUSTER IS READY" + fi } + #deploys flannel as daemonsets function deploy_cni_provider() { CNI_DIR="$(mktemp -d -q --tmpdir "flannel.XXXXXX")" @@ -901,13 +1009,7 @@ function deploy_osm_services() { #deploy charmed services function deploy_charmed_services() { juju add-model $OSM_STACK_NAME $OSM_VCA_K8S_CLOUDNAME - # deploy mongodb charm - namespace=$OSM_STACK_NAME - juju deploy cs:~charmed-osm/mongodb-k8s \ - --config enable-sidecar=true \ - --config replica-set=rs0 \ - --config namespace=$namespace \ - -m $namespace + juju deploy ch:mongodb-k8s -m $OSM_STACK_NAME } function deploy_osm_pla_service() { @@ -918,19 +1020,22 @@ function deploy_osm_pla_service() { } #Install Helm v3 +#Helm releases can be found here: https://github.com/helm/helm/releases function install_helm() { - helm > /dev/null 2>&1 - if [ $? != 0 ] ; then + HELM_VERSION="v3.7.2" + if ! [[ "$(helm version --short 2>/dev/null)" =~ ^v3.* ]]; then # Helm is not installed. Install helm - echo "Helm is not installed, installing ..." - curl https://get.helm.sh/helm-v3.6.3-linux-amd64.tar.gz --output helm-v3.6.3.tar.gz - tar -zxvf helm-v3.6.3.tar.gz + echo "Helm3 is not installed, installing ..." + curl https://get.helm.sh/helm-${HELM_VERSION}-linux-amd64.tar.gz --output helm-${HELM_VERSION}.tar.gz + tar -zxvf helm-${HELM_VERSION}.tar.gz sudo mv linux-amd64/helm /usr/local/bin/helm rm -r linux-amd64 - rm helm-v3.6.3.tar.gz - helm repo add stable https://charts.helm.sh/stable - helm repo update + rm helm-${HELM_VERSION}.tar.gz + else + echo "Helm3 is already installed. Skipping installation..." fi + helm repo add stable https://charts.helm.sh/stable + helm repo update } function parse_yaml() { @@ -1191,8 +1296,9 @@ function install_lightweight() { track install_helm install_k8s_storageclass track k8s_storageclass - install_k8s_metallb + install_helm_metallb track k8s_metallb + check_for_readiness else #install_docker_compose [ -n "$INSTALL_NODOCKER" ] || init_docker_swarm @@ -1528,8 +1634,8 @@ function parse_docker_registry_url() { } LXD_VERSION=4.0 -JUJU_VERSION=2.8 -JUJU_AGENT_VERSION=2.8.11 +JUJU_VERSION=2.9 +JUJU_AGENT_VERSION=2.9.29 UNINSTALL="" DEVELOP="" UPDATE="" @@ -1587,8 +1693,9 @@ OSM_DOCKER_TAG=latest DOCKER_USER=opensourcemano PULL_IMAGES="y" KAFKA_TAG=2.11-1.0.2 -PROMETHEUS_TAG=v2.4.3 -GRAFANA_TAG=latest +KIWIGRID_K8S_SIDECAR_TAG="1.15.6" +PROMETHEUS_TAG=v2.28.1 +GRAFANA_TAG=8.1.1 PROMETHEUS_NODE_EXPORTER_TAG=0.18.1 PROMETHEUS_CADVISOR_TAG=latest KEYSTONEDB_TAG=10 @@ -1782,17 +1889,29 @@ done [ -n "$TO_REBUILD" ] && [ "$TO_REBUILD" != " NONE" ] && echo $TO_REBUILD | grep -q NONE && FATAL "Incompatible option: -m NONE cannot be used with other -m options" [ -n "$TO_REBUILD" ] && [ "$TO_REBUILD" == " PLA" ] && [ -z "$INSTALL_PLA" ] && FATAL "Incompatible option: -m PLA cannot be used without --pla option" -if [ -n "$SHOWOPTS" ]; then - dump_vars +# Uninstall if "--uninstall" +if [ -n "$UNINSTALL" ]; then + if [ -n "$CHARMED" ]; then + ${OSM_DEVOPS}/installers/charmed_uninstall.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D $OSM_DEVOPS -t $DOCKER_TAG "$@" || \ + FATAL_TRACK charmed_uninstall "charmed_uninstall.sh failed" + else + ${OSM_DEVOPS}/installers/uninstall_osm.sh "$@" || \ + FATAL_TRACK community_uninstall "uninstall_osm.sh failed" + fi + echo -e "\nDONE" exit 0 fi if [ -n "$CHARMED" ]; then - if [ -n "$UNINSTALL" ]; then - ${OSM_DEVOPS}/installers/charmed_uninstall.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D /usr/share/osm-devops -t $DOCKER_TAG "$@" - else - ${OSM_DEVOPS}/installers/charmed_install.sh -R $RELEASE -r $REPOSITORY -u $REPOSITORY_BASE -D /usr/share/osm-devops -t $DOCKER_TAG "$@" - fi + export OSM_TRACK_INSTALLATION_ID="$(date +%s)-$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 16)" + track start release $RELEASE none none docker_tag $OSM_DOCKER_TAG none none installation_type $OSM_INSTALLATION_TYPE none none + ${OSM_DEVOPS}/installers/charmed_install.sh --tag $OSM_DOCKER_TAG "$@" || \ + FATAL_TRACK charmed_install "charmed_install.sh failed" + wget -q -O- https://osm-download.etsi.org/ftp/osm-11.0-eleven/README2.txt &> /dev/null + track end installation_type $OSM_INSTALLATION_TYPE + echo -e "\nDONE" + exit 0 +fi exit 0 fi