k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/cluster/get-kube-binaries.sh (about) 1 #!/usr/bin/env bash 2 3 # Copyright 2016 The Kubernetes Authors. 4 # 5 # Licensed under the Apache License, Version 2.0 (the "License"); 6 # you may not use this file except in compliance with the License. 7 # You may obtain a copy of the License at 8 # 9 # http://www.apache.org/licenses/LICENSE-2.0 10 # 11 # Unless required by applicable law or agreed to in writing, software 12 # distributed under the License is distributed on an "AS IS" BASIS, 13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 # See the License for the specific language governing permissions and 15 # limitations under the License. 16 17 # This script downloads and installs the Kubernetes client and server 18 # (and optionally test) binaries, 19 # It is intended to be called from an extracted Kubernetes release tarball. 20 # 21 # We automatically choose the correct client binaries to download. 22 # 23 # Options: 24 # Set KUBERNETES_SERVER_ARCH to choose the server (Kubernetes cluster) 25 # architecture to download: 26 # * amd64 [default] 27 # * arm 28 # * arm64 29 # * ppc64le 30 # * s390x 31 # 32 # Set KUBERNETES_CLIENT_OS to choose the client OS to download: 33 # * current OS [default] 34 # * linux 35 # * darwin 36 # * windows 37 # 38 # Set KUBERNETES_CLIENT_ARCH to choose the client architecture to download: 39 # * current architecture [default] 40 # * amd64 41 # * arm 42 # * arm64 43 # * ppc64le 44 # * s390x 45 # * windows 46 # 47 # Set KUBERNETES_SKIP_CONFIRM to skip the installation confirmation prompt. 48 # Set KUBERNETES_RELEASE_URL to choose where to download binaries from. 49 # (Defaults to https://dl.k8s.io/release). 50 # Set KUBERNETES_DOWNLOAD_TESTS to additionally download and extract the test 51 # binaries tarball. 52 53 set -o errexit 54 set -o nounset 55 set -o pipefail 56 57 KUBE_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd) 58 59 KUBERNETES_RELEASE_URL="${KUBERNETES_RELEASE_URL:-https://dl.k8s.io}" 60 61 function detect_kube_release() { 62 if [[ -n "${KUBE_VERSION:-}" ]]; then 63 return 0 # Allow caller to explicitly set version 64 fi 65 66 if [[ ! -e "${KUBE_ROOT}/version" ]]; then 67 echo "Can't determine Kubernetes release." >&2 68 echo "${BASH_SOURCE[0]} should only be run from a prebuilt Kubernetes release." >&2 69 echo "Did you mean to use get-kube.sh instead?" >&2 70 exit 1 71 fi 72 73 KUBE_VERSION=$(cat "${KUBE_ROOT}/version") 74 } 75 76 function detect_client_info() { 77 if [ -n "${KUBERNETES_CLIENT_OS-}" ]; then 78 CLIENT_PLATFORM="${KUBERNETES_CLIENT_OS}" 79 else 80 local kernel 81 kernel="$(uname -s)" 82 case "${kernel}" in 83 Darwin) 84 CLIENT_PLATFORM="darwin" 85 ;; 86 Linux) 87 CLIENT_PLATFORM="linux" 88 ;; 89 *) 90 echo "Unknown, unsupported platform: ${kernel}." >&2 91 echo "Supported platforms: Linux, Darwin." >&2 92 echo "Bailing out." >&2 93 exit 2 94 esac 95 fi 96 97 if [ -n "${KUBERNETES_CLIENT_ARCH-}" ]; then 98 CLIENT_ARCH="${KUBERNETES_CLIENT_ARCH}" 99 else 100 # TODO: migrate the kube::util::host_platform function out of hack/lib and 101 # use it here. 102 local machine 103 machine="$(uname -m)" 104 case "${machine}" in 105 x86_64*|i?86_64*|amd64*) 106 CLIENT_ARCH="amd64" 107 ;; 108 aarch64*|arm64*) 109 CLIENT_ARCH="arm64" 110 ;; 111 arm*) 112 CLIENT_ARCH="arm" 113 ;; 114 i?86*) 115 CLIENT_ARCH="386" 116 ;; 117 ppc64le*) 118 CLIENT_ARCH="ppc64le" 119 ;; 120 s390x*) 121 CLIENT_ARCH="s390x" 122 ;; 123 *) 124 echo "Unknown, unsupported architecture (${machine})." >&2 125 echo "Supported architectures x86_64, i686, arm, arm64, ppc64le, s390x." >&2 126 echo "Bailing out." >&2 127 exit 3 128 ;; 129 esac 130 fi 131 } 132 133 function md5sum_file() { 134 if which md5 >/dev/null 2>&1; then 135 md5 -q "$1" 136 else 137 md5sum "$1" | awk '{ print $1 }' 138 fi 139 } 140 141 function sha512sum_file() { 142 if which sha512sum >/dev/null 2>&1; then 143 sha512sum "$1" | awk '{ print $1 }' 144 else 145 shasum -a512 "$1" | awk '{ print $1 }' 146 fi 147 } 148 149 function download_tarball() { 150 local -r download_path="$1" 151 local -r file="$2" 152 local trace_on="off" 153 if [[ -o xtrace ]]; then 154 trace_on="on" 155 set +x 156 fi 157 url="${DOWNLOAD_URL_PREFIX}/${file}" 158 mkdir -p "${download_path}" 159 160 if [[ $(which gsutil) ]] && [[ "$url" =~ ^https://storage.googleapis.com/.* ]]; then 161 gsutil cp "${url//'https://storage.googleapis.com/'/gs://}" "${download_path}/${file}" 162 elif [[ $(which curl) ]]; then 163 # if the url belongs to GCS API we should use oauth2_token in the headers 164 curl_headers="" 165 if { [[ "${KUBERNETES_PROVIDER:-gce}" == "gce" ]] || [[ "${KUBERNETES_PROVIDER}" == "gke" ]] ; } && 166 [[ "$url" =~ ^https://storage.googleapis.com.* ]]; then 167 curl_headers="Authorization: Bearer $(gcloud auth print-access-token)" 168 fi 169 curl ${curl_headers:+-H "${curl_headers}"} -fL --retry 3 --keepalive-time 2 "${url}" -o "${download_path}/${file}" 170 elif [[ $(which wget) ]]; then 171 wget "${url}" -O "${download_path}/${file}" 172 else 173 echo "Couldn't find gsutil, curl, or wget. Bailing out." >&2 174 exit 4 175 fi 176 echo 177 local md5sum sha512sum 178 md5sum=$(md5sum_file "${download_path}/${file}") 179 echo "md5sum(${file})=${md5sum}" 180 sha512sum=$(sha512sum_file "${download_path}/${file}") 181 echo "sha512sum(${file})=${sha512sum}" 182 echo 183 # TODO: add actual verification 184 if [[ "${trace_on}" == "on" ]]; then 185 set -x 186 fi 187 } 188 189 function extract_arch_tarball() { 190 local -r tarfile="$1" 191 local -r platform="$2" 192 local -r arch="$3" 193 194 platforms_dir="${KUBE_ROOT}/platforms/${platform}/${arch}" 195 echo "Extracting ${tarfile} into ${platforms_dir}" 196 mkdir -p "${platforms_dir}" 197 # Tarball looks like kubernetes/{client,server,test}/bin/BINARY" 198 tar -xzf "${tarfile}" --strip-components 3 -C "${platforms_dir}" 199 } 200 201 detect_kube_release 202 DOWNLOAD_URL_PREFIX="${KUBERNETES_RELEASE_URL}/${KUBE_VERSION}" 203 204 SERVER_PLATFORM="linux" 205 SERVER_ARCH="${KUBERNETES_SERVER_ARCH:-amd64}" 206 SERVER_TAR="kubernetes-server-${SERVER_PLATFORM}-${SERVER_ARCH}.tar.gz" 207 if [[ -n "${KUBERNETES_NODE_PLATFORM-}" || -n "${KUBERNETES_NODE_ARCH-}" ]]; then 208 NODE_PLATFORM="${KUBERNETES_NODE_PLATFORM:-${SERVER_PLATFORM}}" 209 NODE_ARCH="${KUBERNETES_NODE_ARCH:-${SERVER_ARCH}}" 210 NODE_TAR="kubernetes-node-${NODE_PLATFORM}-${NODE_ARCH}.tar.gz" 211 fi 212 213 detect_client_info 214 CLIENT_TAR="kubernetes-client-${CLIENT_PLATFORM}-${CLIENT_ARCH}.tar.gz" 215 216 echo "Kubernetes release: ${KUBE_VERSION}" 217 echo "Server: ${SERVER_PLATFORM}/${SERVER_ARCH} (to override, set KUBERNETES_SERVER_ARCH)" 218 printf "Client: %s/%s" "${CLIENT_PLATFORM}" "${CLIENT_ARCH}" 219 if [ -z "${KUBERNETES_CLIENT_OS-}" ] && [ -z "${KUBERNETES_CLIENT_ARCH-}" ]; then 220 printf " (autodetected)" 221 fi 222 echo " (to override, set KUBERNETES_CLIENT_OS and/or KUBERNETES_CLIENT_ARCH)" 223 echo 224 225 echo "Will download ${SERVER_TAR} from ${DOWNLOAD_URL_PREFIX}" 226 echo "Will download and extract ${CLIENT_TAR} from ${DOWNLOAD_URL_PREFIX}" 227 228 DOWNLOAD_NODE_TAR=false 229 if [[ -n "${NODE_TAR:-}" ]]; then 230 DOWNLOAD_NODE_TAR=true 231 echo "Will download and extract ${NODE_TAR} from ${DOWNLOAD_URL_PREFIX}" 232 fi 233 234 DOWNLOAD_TESTS_TAR=false 235 if [[ -n "${KUBERNETES_DOWNLOAD_TESTS-}" ]]; then 236 DOWNLOAD_TESTS_TAR=true 237 echo "Will download and extract kubernetes-test tarball(s) from ${DOWNLOAD_URL_PREFIX}" 238 fi 239 240 if [[ -z "${KUBERNETES_SKIP_CONFIRM-}" ]]; then 241 echo "Is this ok? [Y]/n" 242 read -r confirm 243 if [[ "${confirm}" =~ ^[nN]$ ]]; then 244 echo "Aborting." 245 exit 1 246 fi 247 fi 248 249 download_tarball "${KUBE_ROOT}/server" "${SERVER_TAR}" 250 251 if "${DOWNLOAD_NODE_TAR}"; then 252 download_tarball "${KUBE_ROOT}/node" "${NODE_TAR}" 253 fi 254 255 download_tarball "${KUBE_ROOT}/client" "${CLIENT_TAR}" 256 extract_arch_tarball "${KUBE_ROOT}/client/${CLIENT_TAR}" "${CLIENT_PLATFORM}" "${CLIENT_ARCH}" 257 ln -s "${KUBE_ROOT}/platforms/${CLIENT_PLATFORM}/${CLIENT_ARCH}" "${KUBE_ROOT}/client/bin" 258 echo "Add '${KUBE_ROOT}/client/bin' to your PATH to use newly-installed binaries." 259 260 if "${DOWNLOAD_TESTS_TAR}"; then 261 TESTS_PORTABLE_TAR="kubernetes-test-portable.tar.gz" 262 download_tarball "${KUBE_ROOT}/test" "${TESTS_PORTABLE_TAR}" || true 263 if [[ -f "${KUBE_ROOT}/test/${TESTS_PORTABLE_TAR}" ]]; then 264 echo "Extracting ${TESTS_PORTABLE_TAR} into ${KUBE_ROOT}" 265 # Strip leading "kubernetes/" 266 tar -xzf "${KUBE_ROOT}/test/${TESTS_PORTABLE_TAR}" --strip-components 1 -C "${KUBE_ROOT}" 267 268 # Next, download platform-specific test tarballs for all relevant platforms 269 TEST_PLATFORM_TUPLES=( 270 "${CLIENT_PLATFORM}/${CLIENT_ARCH}" 271 "${SERVER_PLATFORM}/${SERVER_ARCH}" 272 ) 273 if [[ -n "${NODE_PLATFORM:-}" && -n "${NODE_ARCH:-}" ]]; then 274 TEST_PLATFORM_TUPLES+=("${NODE_PLATFORM}/${NODE_ARCH}") 275 fi 276 # Loop over only the unique tuples 277 for TUPLE in $(printf "%s\n" "${TEST_PLATFORM_TUPLES[@]}" | sort -u); do 278 OS=$(echo "${TUPLE}" | cut -d/ -f1) 279 ARCH=$(echo "${TUPLE}" | cut -d/ -f2) 280 TEST_PLATFORM_TAR="kubernetes-test-${OS}-${ARCH}.tar.gz" 281 download_tarball "${KUBE_ROOT}/test" "${TEST_PLATFORM_TAR}" 282 extract_arch_tarball "${KUBE_ROOT}/test/${TEST_PLATFORM_TAR}" "${OS}" "${ARCH}" 283 done 284 else 285 echo "Failed to download portable test tarball, falling back to mondo test tarball." 286 TESTS_MONDO_TAR="kubernetes-test.tar.gz" 287 download_tarball "${KUBE_ROOT}/test" "${TESTS_MONDO_TAR}" 288 echo "Extracting ${TESTS_MONDO_TAR} into ${KUBE_ROOT}" 289 # Strip leading "kubernetes/" 290 tar -xzf "${KUBE_ROOT}/test/${TESTS_MONDO_TAR}" --strip-components 1 -C "${KUBE_ROOT}" 291 fi 292 fi