Improve gce bootstrapping in various ways.

Signed-off-by: Lantao Liu <lantaol@google.com>
This commit is contained in:
Lantao Liu 2018-04-17 07:40:20 +00:00 committed by Derek McGowan
parent 1bd3cdc572
commit 4453aac005
No known key found for this signature in database
GPG Key ID: F58C5D0A4405ACDB
4 changed files with 131 additions and 53 deletions

View File

@ -24,25 +24,6 @@ write_files:
[Install] [Install]
WantedBy=containerd.target WantedBy=containerd.target
# containerd on master uses the cni binary and config in the
# release tarball.
- path: /etc/containerd/config.toml
permissions: 0644
owner: root
content: |
[plugins.linux]
shim = "/home/containerd/usr/local/bin/containerd-shim"
runtime = "/home/containerd/usr/local/sbin/runc"
[plugins.cri]
enable_tls_streaming = true
[plugins.cri.cni]
bin_dir = "/home/containerd/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
conf_template = "/home/containerd/opt/containerd/cluster/gce/cni.template"
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://mirror.gcr.io","https://registry-1.docker.io"]
- path: /etc/systemd/system/containerd.service - path: /etc/systemd/system/containerd.service
permissions: 0644 permissions: 0644
owner: root owner: root

View File

@ -24,23 +24,6 @@ write_files:
[Install] [Install]
WantedBy=containerd.target WantedBy=containerd.target
- path: /etc/containerd/config.toml
permissions: 0644
owner: root
content: |
[plugins.linux]
shim = "/home/containerd/usr/local/bin/containerd-shim"
runtime = "/home/containerd/usr/local/sbin/runc"
[plugins.cri]
enable_tls_streaming = true
[plugins.cri.cni]
bin_dir = "/home/containerd/opt/cni/bin"
conf_dir = "/etc/cni/net.d"
conf_template = "/home/containerd/opt/containerd/cluster/gce/cni.template"
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://mirror.gcr.io","https://registry-1.docker.io"]
- path: /etc/systemd/system/containerd.service - path: /etc/systemd/system/containerd.service
permissions: 0644 permissions: 0644
owner: root owner: root

View File

@ -22,6 +22,8 @@ set -o pipefail
# CONTAINERD_HOME is the directory for containerd. # CONTAINERD_HOME is the directory for containerd.
CONTAINERD_HOME="/home/containerd" CONTAINERD_HOME="/home/containerd"
cd "${CONTAINERD_HOME}" cd "${CONTAINERD_HOME}"
# KUBE_HOME is the directory for kubernetes.
KUBE_HOME="/home/kubernetes"
# fetch_metadata fetches metadata from GCE metadata server. # fetch_metadata fetches metadata from GCE metadata server.
# Var set: # Var set:
@ -36,32 +38,144 @@ fetch_metadata() {
fi fi
} }
# DEPLOY_PATH is the gcs path where cri-containerd tarball is stored. # fetch_env fetches environment variables from GCE metadata server
DEPLOY_PATH=${DEPLOY_PATH:-"cri-containerd-release"} # and generate a env file under ${CONTAINERD_HOME}. It assumes that
# the environment variables in metadata are in yaml format.
fetch_env() {
local -r env_file_name=$1
(
umask 077;
local -r tmp_env_file="/tmp/${env_file_name}.yaml"
tmp_env_content=$(fetch_metadata "${env_file_name}")
if [ -z "${tmp_env_content}" ]; then
echo "No environment variable is specified in ${env_file_name}"
return
fi
echo "${tmp_env_content}" > "${tmp_env_file}"
# Convert the yaml format file into a shell-style file.
eval $(python -c '''
import pipes,sys,yaml
for k,v in yaml.load(sys.stdin).iteritems():
print("readonly {var}={value}".format(var = k, value = pipes.quote(str(v))))
''' < "${tmp_env_file}" > "${CONTAINERD_HOME}/${env_file_name}")
rm -f "${tmp_env_file}"
)
}
# PKG_PREFIX is the prefix of the cri-containerd tarball name. # is_preloaded checks whether a package has been preloaded in the image.
# By default use the release tarball with cni built in. is_preloaded() {
PKG_PREFIX=${PKG_PREFIX:-"cri-containerd-cni"} local -r tar=$1
local -r sha1=$2
grep -qs "${tar},${sha1}" "${KUBE_HOME}/preload_info"
}
# VERSION is the cri-containerd version to use. # KUBE_ENV_METADATA is the metadata key for kubernetes envs.
VERSION_METADATA="version" KUBE_ENV_METADATA="kube-env"
VERSION=$(fetch_metadata "${VERSION_METADATA}") fetch_env ${KUBE_ENV_METADATA}
if [ -z "${VERSION}" ]; then if [ -f "${CONTAINERD_HOME}/${KUBE_ENV_METADATA}" ]; then
echo "Version is not set." source "${CONTAINERD_HOME}/${KUBE_ENV_METADATA}"
exit 1
fi fi
# CONTAINERD_ENV_METADATA is the metadata key for containerd envs.
CONTAINERD_ENV_METADATA="containerd-env"
fetch_env ${CONTAINERD_ENV_METADATA}
if [ -f "${CONTAINERD_HOME}/${CONTAINERD_ENV_METADATA}" ]; then
source "${CONTAINERD_HOME}/${CONTAINERD_ENV_METADATA}"
fi
# CONTAINERD_PKG_PREFIX is the prefix of the cri-containerd tarball name.
# By default use the release tarball with cni built in.
pkg_prefix=${CONTAINERD_PKG_PREFIX:-"cri-containerd-cni"}
# Behave differently for test and production.
if [ "${CONTAINERD_TEST:-"false"}" != "true" ]; then
# CONTAINERD_DEPLOY_PATH is the gcs path where cri-containerd tarball is stored.
deploy_path=${CONTAINERD_DEPLOY_PATH:-"cri-containerd-release"}
# CONTAINERD_VERSION is the cri-containerd version to use.
version=${CONTAINERD_VERSION:-""}
if [ -z "${version}" ]; then
echo "CONTAINERD_VERSION is not set."
exit 1
fi
else
deploy_path=${CONTAINERD_DEPLOY_PATH:-"cri-containerd-staging"}
# PULL_REFS_METADATA is the metadata key of PULL_REFS from prow.
PULL_REFS_METADATA="PULL_REFS"
pull_refs=$(fetch_metadata "${PULL_REFS_METADATA}")
if [ ! -z "${pull_refs}" ]; then
deploy_dir=$(echo "${pull_refs}" | sha1sum | awk '{print $1}')
deploy_path="${deploy_path}/${deploy_dir}"
fi
# TODO(random-liu): Put version into the metadata instead of
# deciding it in cloud init. This may cause issue to reboot test.
version=$(curl -f --ipv4 --retry 6 --retry-delay 3 --silent --show-error \
https://storage.googleapis.com/${deploy_path}/latest)
fi
TARBALL_GCS_NAME="${pkg_prefix}-${version}.linux-amd64.tar.gz"
# TARBALL_GCS_PATH is the path to download cri-containerd tarball for node e2e. # TARBALL_GCS_PATH is the path to download cri-containerd tarball for node e2e.
TARBALL_GCS_PATH="https://storage.googleapis.com/${DEPLOY_PATH}/${PKG_PREFIX}-${VERSION}.linux-amd64.tar.gz" TARBALL_GCS_PATH="https://storage.googleapis.com/${deploy_path}/${TARBALL_GCS_NAME}"
# TARBALL is the name of the tarball after being downloaded. # TARBALL is the name of the tarball after being downloaded.
TARBALL="cri-containerd.tar.gz" TARBALL="cri-containerd.tar.gz"
# CONTAINERD_TAR_SHA1 is the sha1sum of containerd tarball.
if is_preloaded "${TARBALL_GCS_NAME}" "${CONTAINERD_TAR_SHA1:-""}"; then
echo "${TARBALL_GCS_NAME} is preloaded"
else
# Download and untar the release tar ball. # Download and untar the release tar ball.
curl -f --ipv4 -Lo "${TARBALL}" --connect-timeout 20 --max-time 300 --retry 6 --retry-delay 10 "${TARBALL_GCS_PATH}" curl -f --ipv4 -Lo "${TARBALL}" --connect-timeout 20 --max-time 300 --retry 6 --retry-delay 10 "${TARBALL_GCS_PATH}"
tar xvf "${TARBALL}" tar xvf "${TARBALL}"
rm -f "${TARBALL}"
fi
# Configure containerd.
# Copy crictl config. # Copy crictl config.
cp "${CONTAINERD_HOME}/etc/crictl.yaml" /etc cp "${CONTAINERD_HOME}/etc/crictl.yaml" /etc
# Generate containerd config
config_path=${CONTAINERD_CONFIG_PATH:-"/etc/containerd/config.toml"}
mkdir -p $(dirname ${config_path})
cni_bin_dir="${CONTAINERD_HOME}/opt/cni/bin"
cni_template_path="${CONTAINERD_HOME}/opt/containerd/cluster/gce/cni.template"
# NETWORK_POLICY_PROVIDER is from kube-env.
network_policy_provider="${NETWORK_POLICY_PROVIDER:-"none"}"
if [ -n "${network_policy_provider}" ] && [ "${network_policy_provider}" != "none" ] && [ "${KUBERNETES_MASTER:-}" != "true" ]; then
# Use Kubernetes cni daemonset on node if network policy provider is specified.
cni_bin_dir="${KUBE_HOME}/bin"
cni_template_path=""
fi
cat > ${config_path} <<EOF
[plugins.linux]
shim = "${CONTAINERD_HOME}/usr/local/bin/containerd-shim"
runtime = "${CONTAINERD_HOME}/usr/local/sbin/runc"
[plugins.cri]
enable_tls_streaming = true
[plugins.cri.cni]
bin_dir = "${cni_bin_dir}"
conf_dir = "/etc/cni/net.d"
conf_template = "${cni_template_path}"
[plugins.cri.registry.mirrors."docker.io"]
endpoint = ["https://mirror.gcr.io","https://registry-1.docker.io"]
EOF
chmod 644 "${config_path}"
echo "export PATH=${CONTAINERD_HOME}/usr/local/bin/:${CONTAINERD_HOME}/usr/local/sbin/:\$PATH" > \ echo "export PATH=${CONTAINERD_HOME}/usr/local/bin/:${CONTAINERD_HOME}/usr/local/sbin/:\$PATH" > \
/etc/profile.d/containerd_env.sh /etc/profile.d/containerd_env.sh
# Run extra init script for test.
if [ "${CONTAINERD_TEST:-"false"}" == "true" ]; then
# EXTRA_INIT_SCRIPT is the name of the extra init script after being downloaded.
EXTRA_INIT_SCRIPT="containerd-extra-init.sh"
# EXTRA_INIT_SCRIPT_METADATA is the metadata key of init script.
EXTRA_INIT_SCRIPT_METADATA="containerd-extra-init-sh"
extra_init=$(fetch_metadata "${EXTRA_INIT_SCRIPT_METADATA}")
# Return if containerd-extra-init-sh is not set.
if [ -z "${extra_init}" ]; then
exit 0
fi
echo "${extra_init}" > "${EXTRA_INIT_SCRIPT}"
chmod 544 "${EXTRA_INIT_SCRIPT}"
./${EXTRA_INIT_SCRIPT}
fi

View File

@ -8,8 +8,8 @@ if [ ! -f "${version_file}" ]; then
echo "version file does not exist" echo "version file does not exist"
exit 1 exit 1
fi fi
export KUBE_MASTER_EXTRA_METADATA="user-data=${GCE_DIR}/cloud-init/master.yaml,containerd-configure-sh=${GCE_DIR}/configure.sh,version=${version_file}" export KUBE_MASTER_EXTRA_METADATA="user-data=${GCE_DIR}/cloud-init/master.yaml,containerd-configure-sh=${GCE_DIR}/configure.sh,containerd-env=${version_file}"
export KUBE_NODE_EXTRA_METADATA="user-data=${GCE_DIR}/cloud-init/node.yaml,containerd-configure-sh=${GCE_DIR}/configure.sh,version=${version_file}" export KUBE_NODE_EXTRA_METADATA="user-data=${GCE_DIR}/cloud-init/node.yaml,containerd-configure-sh=${GCE_DIR}/configure.sh,containerd-env=${version_file}"
export KUBE_CONTAINER_RUNTIME="remote" export KUBE_CONTAINER_RUNTIME="remote"
export KUBE_CONTAINER_RUNTIME_ENDPOINT="/run/containerd/containerd.sock" export KUBE_CONTAINER_RUNTIME_ENDPOINT="/run/containerd/containerd.sock"
export KUBE_LOAD_IMAGE_COMMAND="/home/containerd/usr/local/bin/ctr cri load" export KUBE_LOAD_IMAGE_COMMAND="/home/containerd/usr/local/bin/ctr cri load"