#!/bin/bash # # 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. # set +eux # K3s releases: https://github.com/k3s-io/k3s/releases/ K8S_VERSION="v1.29.3+k3s1" # installs k3s function install_k3s() { [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function export INSTALL_K3S_EXEC="--disable traefik" curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION=${K8S_VERSION} sh -s - sudo chmod 644 /etc/rancher/k3s/k3s.yaml [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function } # updates service nodeport range function update_service_nodeport_range() { [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function sudo k3s server --kube-apiserver-arg=service-node-port-range=80-32767 [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function } # checks cluster readiness function check_for_readiness() { [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function # Check for Ready node, takes ~30 seconds echo "Waiting for K8s nodes to be ready" local time_for_failure=60 # seconds broken local sampling_period=5 # seconds local counter=0 local cluster_ready="" while (( counter < time_for_failure )) do kubectl get nodes |grep master |grep -v none | grep Ready if [ $? -eq 0 ] ; then echo "K8s cluster is ready" cluster_ready="y" break else echo "K8s cluster is not ready yet" counter=$((counter + sampling_period)) sleep ${sampling_period} fi done [ -n "$cluster_ready" ] || FATAL_TRACK k8scluster "K3s cluster nodes not ready after $time_for_failure seconds." echo "Waiting for pods to be ready" local time_for_readiness=20 # seconds ready local time_for_failure=100 # seconds broken # 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 #################################################################################### K3S_NAMESPACE=kube-system while [[ (${failures_in_a_row} -lt ${failures_threshold}) && (${oks_in_a_row} -lt ${oks_threshold}) ]] do # State of pods rather than completed jobs K3S_PODS_STATE=$(kubectl get pod -n ${K3S_NAMESPACE} --no-headers |grep -v Completed 2>&1) K3S_PODS_READY=$(echo "${K3S_PODS_STATE}" | awk '$2=="1/1" || $2=="2/2" {printf ("%s\t%s\t\n", $1, $2)}') K3S_PODS_NOT_READY=$(echo "${K3S_PODS_STATE}" | awk '$2!="1/1" && $2!="2/2" {printf ("%s\t%s\t\n", $1, $2)}') COUNT_K3S_PODS_READY=$(echo "${K3S_PODS_READY}"| grep -v -e '^$' | wc -l) COUNT_K3S_PODS_NOT_READY=$(echo "${K3S_PODS_NOT_READY}" | grep -v -e '^$' | wc -l) # OK sample if [[ ${COUNT_K3S_PODS_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 K3S if [[ "${COUNT_K3S_PODS_NOT_READY}" -ne 0 ]] then echo "K3S kube-system: Waiting for ${COUNT_K3S_PODS_NOT_READY} of $((${COUNT_K3S_PODS_NOT_READY}+${COUNT_K3S_PODS_READY})) pods to be ready:" echo "${K3S_PODS_NOT_READY}" echo fi fi #------------ NEXT SAMPLE sleep ${sampling_period} done #################################################################################### # OUTCOME #################################################################################### if [[ (${failures_in_a_row} -ge ${failures_threshold}) ]] then echo FATAL_TRACK k8scluster "K8S CLUSTER IS BROKEN" else echo echo "K8S CLUSTER IS READY" fi [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function } # Retrieves and saves the credentials function save_credentials() { [ -z "${DEBUG_INSTALL}" ] || DEBUG beginning of function KUBEDIR="${HOME}/.kube" KUBEFILE="$KUBEDIR/config" mkdir -p "${KUBEDIR}" sudo cp /etc/rancher/k3s/k3s.yaml "${KUBEFILE}" sudo chown $(id -u):$(id -g) "${KUBEFILE}" chmod 700 "${KUBEFILE}" echo echo "Credentials saved at ${KUBEFILE}" echo [ -z "${DEBUG_INSTALL}" ] || DEBUG end of function } # main while getopts ":D:-: " o; do case "${o}" in D) OSM_DEVOPS="${OPTARG}" ;; -) [ "${OPTARG}" == "debug" ] && DEBUG_INSTALL="y" && continue echo -e "Invalid option: '--$OPTARG'\n" >&2 exit 1 ;; :) echo "Option -$OPTARG requires an argument" >&2 exit 1 ;; \?) echo -e "Invalid option: '-$OPTARG'\n" >&2 exit 1 ;; *) exit 1 ;; esac done source $OSM_DEVOPS/common/logging source $OSM_DEVOPS/common/track echo "DEBUG_INSTALL=$DEBUG_INSTALL" echo "OSM_DEVOPS=$OSM_DEVOPS" echo "HOME=$HOME" install_k3s track k8scluster k3s_install_ok check_for_readiness track k8scluster k3s_node_ready_ok # update_service_nodeport_range # check_for_readiness # track k8scluster k3s_update_nodeport_range_ok save_credentials track k8scluster k3s_creds_ok