sigs.k8s.io/cluster-api@v1.7.1/bootstrap/kubeadm/internal/cloudinit/kubeadm-bootstrap-script.sh (about)

     1  #!/bin/bash
     2  # Copyright 2020 The Kubernetes Authors.
     3  #
     4  # Licensed under the Apache License, Version 2.0 (the "License");
     5  # you may not use this file except in compliance with the License.
     6  # You may obtain a copy of the License at
     7  #
     8  #     http://www.apache.org/licenses/LICENSE-2.0
     9  #
    10  # Unless required by applicable law or agreed to in writing, software
    11  # distributed under the License is distributed on an "AS IS" BASIS,
    12  # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  # See the License for the specific language governing permissions and
    14  # limitations under the License.
    15  
    16  # Log an error and exit.
    17  # Args:
    18  #   $1 Message to log with the error
    19  #   $2 The error code to return
    20  log::error_exit() {
    21    local message="${1}"
    22    local code="${2}"
    23  
    24    log::error "${message}"
    25    # {{ if .ControlPlane }}
    26    log::info "Removing member from cluster status"
    27    kubeadm reset -f update-cluster-status || true
    28    log::info "Removing etcd member"
    29    kubeadm reset -f remove-etcd-member || true
    30    # {{ end }}
    31    log::info "Resetting kubeadm"
    32    kubeadm reset -f || true
    33    log::error "cluster.x-k8s.io kubeadm bootstrap script $0 exiting with status ${code}"
    34    exit "${code}"
    35  }
    36  
    37  log::success_exit() {
    38    log::info "cluster.x-k8s.io kubeadm bootstrap script $0 finished"
    39    exit 0
    40  }
    41  
    42  # Log an error but keep going.
    43  log::error() {
    44    local message="${1}"
    45    timestamp=$(date --iso-8601=seconds)
    46    echo "!!! [${timestamp}] ${1}" >&2
    47    shift
    48    for message; do
    49      echo "    ${message}" >&2
    50    done
    51  }
    52  
    53  # Print a status line.  Formatted to show up in a stream of output.
    54  log::info() {
    55    timestamp=$(date --iso-8601=seconds)
    56    echo "+++ [${timestamp}] ${1}"
    57    shift
    58    for message; do
    59      echo "    ${message}"
    60    done
    61  }
    62  
    63  check_kubeadm_command() {
    64    local command="${1}"
    65    local code="${2}"
    66    case ${code} in
    67    "0")
    68      log::info "kubeadm reported successful execution for ${command}"
    69      ;;
    70    "1")
    71      log::error "kubeadm reported failed action(s) for ${command}"
    72      ;;
    73    "2")
    74      log::error "kubeadm reported preflight check error during ${command}"
    75      ;;
    76    "3")
    77      log::error_exit "kubeadm reported validation error for ${command}" "${code}"
    78      ;;
    79    *)
    80      log::error "kubeadm reported unknown error ${code} for ${command}"
    81      ;;
    82    esac
    83  }
    84  
    85  function retry-command() {
    86    n=0
    87    local kubeadm_return
    88    until [ $n -ge 5 ]; do
    89      log::info "running '$*'"
    90      # shellcheck disable=SC1083
    91      "$@" --config=/run/kubeadm/kubeadm-join-config.yaml {{.KubeadmVerbosity}}
    92      kubeadm_return=$?
    93      check_kubeadm_command "'$*'" "${kubeadm_return}"
    94      if [ ${kubeadm_return} -eq 0 ]; then
    95        break
    96      fi
    97      # We allow preflight errors to pass
    98      if [ ${kubeadm_return} -eq 2 ]; then
    99        break
   100      fi
   101      n=$((n + 1))
   102      sleep 15
   103    done
   104    if [ ${kubeadm_return} -ne 0 ]; then
   105      log::error_exit "too many errors, exiting" "${kubeadm_return}"
   106    fi
   107  }
   108  
   109  # {{ if .ControlPlane }}
   110  function try-or-die-command() {
   111    local kubeadm_return
   112    log::info "running '$*'"
   113    # shellcheck disable=SC1083
   114    "$@" --config=/run/kubeadm/kubeadm-join-config.yaml {{.KubeadmVerbosity}}
   115    kubeadm_return=$?
   116    check_kubeadm_command "'$*'" "${kubeadm_return}"
   117    if [ ${kubeadm_return} -ne 0 ]; then
   118      log::error_exit "fatal error, exiting" "${kubeadm_return}"
   119    fi
   120  }
   121  # {{ end }}
   122  
   123  retry-command kubeadm join phase preflight --ignore-preflight-errors=DirAvailable--etc-kubernetes-manifests
   124  # {{ if .ControlPlane }}
   125  retry-command kubeadm join phase control-plane-prepare download-certs
   126  retry-command kubeadm join phase control-plane-prepare certs
   127  retry-command kubeadm join phase control-plane-prepare kubeconfig
   128  retry-command kubeadm join phase control-plane-prepare control-plane
   129  # {{ end }}
   130  retry-command kubeadm join phase kubelet-start
   131  # {{ if .ControlPlane }}
   132  try-or-die-command kubeadm join phase control-plane-join etcd
   133  retry-command kubeadm join phase control-plane-join update-status
   134  retry-command kubeadm join phase control-plane-join mark-control-plane
   135  # {{ end }}
   136  
   137  log::success_exit