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