Improve gce bootstrapping in various ways.
Signed-off-by: Lantao Liu <lantaol@google.com>
This commit is contained in:
parent
1bd3cdc572
commit
4453aac005
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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"
|
||||||
|
|
||||||
# Download and untar the release tar ball.
|
# CONTAINERD_TAR_SHA1 is the sha1sum of containerd tarball.
|
||||||
curl -f --ipv4 -Lo "${TARBALL}" --connect-timeout 20 --max-time 300 --retry 6 --retry-delay 10 "${TARBALL_GCS_PATH}"
|
if is_preloaded "${TARBALL_GCS_NAME}" "${CONTAINERD_TAR_SHA1:-""}"; then
|
||||||
tar xvf "${TARBALL}"
|
echo "${TARBALL_GCS_NAME} is preloaded"
|
||||||
|
else
|
||||||
|
# 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}"
|
||||||
|
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
|
||||||
|
@ -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"
|
||||||
|
Loading…
Reference in New Issue
Block a user