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