-
Notifications
You must be signed in to change notification settings - Fork 38.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Create a get-kube-binaries script to download client/server tarballs #33701
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,199 @@ | ||
#!/bin/bash | ||
|
||
# Copyright 2016 The Kubernetes Authors. | ||
# | ||
# 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. | ||
|
||
# This script downloads and installs the Kubernetes client and server binaries. | ||
# It is intended to be called from an extracted Kubernetes release tarball. | ||
# | ||
# We automatically choose the correct client binaries to download. | ||
# | ||
# Options: | ||
# Set KUBERNETES_SERVER_ARCH to choose the server (Kubernetes cluster) | ||
# architecture to download: | ||
# * amd64 [default] | ||
# * arm | ||
# * arm64 | ||
# * ppc64le | ||
# | ||
# Set KUBERNETES_SKIP_CONFIRM to skip the installation confirmation prompt. | ||
# Set KUBERNETES_RELEASE_URL to choose where to download binaries from. | ||
# (Defaults to https://storage.googleapis.com/kubernetes-release/release). | ||
|
||
set -o errexit | ||
set -o nounset | ||
set -o pipefail | ||
|
||
KUBE_ROOT=$(cd $(dirname "${BASH_SOURCE}")/.. && pwd) | ||
|
||
KUBERNETES_RELEASE_URL="${KUBERNETES_RELEASE_URL:-https://storage.googleapis.com/kubernetes-release/release}" | ||
|
||
function detect_kube_release() { | ||
if [[ ! -e "${KUBE_ROOT}/version" ]]; then | ||
echo "Can't determine Kubernetes release." >&2 | ||
echo "This script should only be run from a prebuilt Kubernetes release." >&2 | ||
echo "Did you mean to use get-kube.sh instead?" >&2 | ||
exit 1 | ||
fi | ||
|
||
KUBERNETES_RELEASE=$(cat "${KUBE_ROOT}/version") | ||
DOWNLOAD_URL_PREFIX="${KUBERNETES_RELEASE_URL}/${KUBERNETES_RELEASE}" | ||
} | ||
|
||
function detect_client_info() { | ||
local kernel=$(uname -s) | ||
case "${kernel}" in | ||
Darwin) | ||
CLIENT_PLATFORM="darwin" | ||
;; | ||
Linux) | ||
CLIENT_PLATFORM="linux" | ||
;; | ||
*) | ||
echo "Unknown, unsupported platform: ${kernel}." >&2 | ||
echo "Supported platforms: Linux, Darwin." >&2 | ||
echo "Bailing out." >&2 | ||
exit 2 | ||
esac | ||
|
||
# TODO: migrate the kube::util::host_platform function out of hack/lib and | ||
# use it here. | ||
local machine=$(uname -m) | ||
case "${machine}" in | ||
x86_64*|i?86_64*|amd64*) | ||
CLIENT_ARCH="amd64" | ||
;; | ||
aarch64*|arm64*) | ||
CLIENT_ARCH="arm64" | ||
;; | ||
arm*) | ||
CLIENT_ARCH="arm" | ||
;; | ||
i?86*) | ||
CLIENT_ARCH="386" | ||
;; | ||
*) | ||
echo "Unknown, unsupported architecture (${machine})." >&2 | ||
echo "Supported architectures x86_64, i686, arm, arm64." >&2 | ||
echo "Bailing out." >&2 | ||
exit 3 | ||
;; | ||
esac | ||
} | ||
|
||
function md5sum_file() { | ||
if which md5 >/dev/null 2>&1; then | ||
md5 -q "$1" | ||
else | ||
md5sum "$1" | awk '{ print $1 }' | ||
fi | ||
} | ||
|
||
function sha1sum_file() { | ||
if which shasum >/dev/null 2>&1; then | ||
shasum -a1 "$1" | awk '{ print $1 }' | ||
else | ||
sha1sum "$1" | awk '{ print $1 }' | ||
fi | ||
} | ||
|
||
function download_tarball() { | ||
local -r download_path="$1" | ||
local -r file="$2" | ||
url="${DOWNLOAD_URL_PREFIX}/${file}" | ||
mkdir -p "${download_path}" | ||
if [[ $(which curl) ]]; then | ||
curl -L "${url}" -o "${download_path}/${file}" | ||
elif [[ $(which wget) ]]; then | ||
wget "${url}" -O "${download_path}/${file}" | ||
else | ||
echo "Couldn't find curl or wget. Bailing out." >&2 | ||
exit 4 | ||
fi | ||
echo | ||
local md5sum=$(md5sum_file "${download_path}/${file}") | ||
echo "md5sum(${file})=${md5sum}" | ||
local sha1sum=$(sha1sum_file "${download_path}/${file}") | ||
echo "sha1sum(${file})=${sha1sum}" | ||
echo | ||
# TODO: add actual verification | ||
} | ||
|
||
function extract_tarball() { | ||
local -r tarfile="$1" | ||
local -r platform="$2" | ||
local -r arch="$3" | ||
|
||
platforms_dir="${KUBE_ROOT}/platforms/${platform}/${arch}" | ||
echo "Extracting ${tarfile} into ${platforms_dir}" | ||
mkdir -p "${platforms_dir}" | ||
# Tarball looks like kubernetes/{client,server}/bin/BINARY" | ||
tar -xzf "${tarfile}" --strip-components 3 -C "${platforms_dir}" | ||
# Create convenience symlink | ||
ln -sf "${platforms_dir}" "$(dirname ${tarfile})/bin" | ||
echo "Add '$(dirname ${tarfile})/bin' to your PATH to use newly-installed binaries." | ||
} | ||
|
||
detect_kube_release | ||
|
||
SERVER_PLATFORM="linux" | ||
SERVER_ARCH="${KUBERNETES_SERVER_ARCH:-amd64}" | ||
SERVER_TAR="kubernetes-server-${SERVER_PLATFORM}-${SERVER_ARCH}.tar.gz" | ||
|
||
detect_client_info | ||
CLIENT_TAR="kubernetes-client-${CLIENT_PLATFORM}-${CLIENT_ARCH}.tar.gz" | ||
|
||
echo "Kubernetes release: ${KUBERNETES_RELEASE}" | ||
echo "Server: ${SERVER_PLATFORM}/${SERVER_ARCH}" | ||
echo "Client: ${CLIENT_PLATFORM}/${CLIENT_ARCH}" | ||
echo | ||
|
||
# TODO: remove this check and default to true when we stop shipping server | ||
# tarballs in kubernetes.tar.gz | ||
DOWNLOAD_SERVER_TAR=false | ||
if [[ ! -e "${KUBE_ROOT}/server/${SERVER_TAR}" ]]; then | ||
DOWNLOAD_SERVER_TAR=true | ||
echo "Will download ${SERVER_TAR} from ${DOWNLOAD_URL_PREFIX}" | ||
fi | ||
|
||
# TODO: remove this check and default to true when we stop shipping kubectl | ||
# in kubernetes.tar.gz | ||
DOWNLOAD_CLIENT_TAR=false | ||
if [[ ! -x "${KUBE_ROOT}/platforms/${CLIENT_PLATFORM}/${CLIENT_ARCH}/kubectl" ]]; then | ||
DOWNLOAD_CLIENT_TAR=true | ||
echo "Will download and extract ${CLIENT_TAR} from ${DOWNLOAD_URL_PREFIX}" | ||
fi | ||
|
||
if [[ "${DOWNLOAD_CLIENT_TAR}" == false && "${DOWNLOAD_SERVER_TAR}" == false ]]; then | ||
echo "Nothing additional to download." | ||
exit 0 | ||
fi | ||
|
||
if [[ -z "${KUBERNETES_SKIP_CONFIRM-}" ]]; then | ||
echo "Is this ok? [Y]/n" | ||
read confirm | ||
if [[ "${confirm}" =~ ^[nN]$ ]]; then | ||
echo "Aborting." | ||
exit 0 | ||
fi | ||
fi | ||
|
||
if "${DOWNLOAD_SERVER_TAR}"; then | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Perhaps echo the tar file URLs you would download? This will help in the "offline" case where we can tell folks what they should download somehow. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this actually already happens on L167 and L175. I can add this to get-kube.sh too, though. |
||
download_tarball "${KUBE_ROOT}/server" "${SERVER_TAR}" | ||
fi | ||
|
||
if "${DOWNLOAD_CLIENT_TAR}"; then | ||
download_tarball "${KUBE_ROOT}/client" "${CLIENT_TAR}" | ||
extract_tarball "${KUBE_ROOT}/client/${CLIENT_TAR}" "${CLIENT_PLATFORM}" "${CLIENT_ARCH}" | ||
fi |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why not do this now?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The kubernetes.tar.gz doesn't have any embedded hashes right now. I plan to add them, but I'm trying to avoid any changes to build/ until #30787 is done.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(and just reading the hashes from the GCS bucket doesn't really achieve much over just downloading the tarballs.)