kube-addons: Use python container if python is not found on the machine.

To build the python image, BUILD_PYTHON_IMAGE should be set during make.
When the addon script is running, it will check if python is installed
on the machine, if not, it will use the python image that built previously.
pull/6/head
Yifan Gu 2015-12-09 17:50:16 -08:00
parent 41cb3d6a39
commit 516032f336
6 changed files with 39 additions and 5 deletions

View File

@ -819,6 +819,16 @@ function kube::release::write_addon_docker_images_for_server() {
) &
done
if [[ ! -z "${BUILD_PYTHON_IMAGE:-}" ]]; then
(
kube::log::status "Building Docker python image"
local img_name=python:2.7-slim-pyyaml
docker build -t "${img_name}" "${KUBE_ROOT}/cluster/addons/python-image"
docker save "${img_name}" > "${1}/${img_name}.tar"
) &
fi
kube::util::wait-for-jobs || { kube::log::error "unable to pull or write addon image"; return 1; }
kube::log::status "Addon images done"
)

View File

@ -58,6 +58,8 @@ of:
pods.
1. Note that this cannot happen for Services as their version is always empty.
Note that in order to run the updator script, python is required on the machine.
For OS distros that don't have python installed, a python container will be used.

View File

@ -0,0 +1,3 @@
FROM python:2.7-slim
RUN pip install pyyaml

View File

@ -0,0 +1,6 @@
# Python image
The python image here is used by OS distros that don't have python installed to
run python scripts to parse the yaml files in the addon updator script.
[![Analytics](https://kubernetes-site.appspot.com/UA-36037335-10/GitHub/cluster/addons/python-image/README.md?pixel)]()

View File

@ -98,7 +98,7 @@ function log() {
function get-object-kind-from-file() {
# prints to stdout, so log cannot be used
#WARNING: only yaml is supported
cat $1 | python -c '''
cat $1 | ${PYTHON} -c '''
try:
import pipes,sys,yaml
y = yaml.load(sys.stdin)
@ -120,7 +120,7 @@ function get-object-nsname-from-file() {
# prints to stdout, so log cannot be used
#WARNING: only yaml is supported
#addons that do not specify a namespace are assumed to be in "default".
cat $1 | python -c '''
cat $1 | ${PYTHON} -c '''
try:
import pipes,sys,yaml
y = yaml.load(sys.stdin)

View File

@ -24,6 +24,16 @@ ADDON_CHECK_INTERVAL_SEC=${TEST_ADDON_CHECK_INTERVAL_SEC:-600}
SYSTEM_NAMESPACE=kube-system
token_dir=${TOKEN_DIR:-/srv/kubernetes}
function ensure_python() {
if ! python --version > /dev/null 2>&1; then
echo "No python on the machine, will use a python image"
local -r PYTHON_IMAGE=python:2.7-slim-pyyaml
export PYTHON="docker run --interactive --rm --net=none ${PYTHON_IMAGE} python"
else
export PYTHON=python
fi
}
function create-kubeconfig-secret() {
local -r token=$1
local -r username=$2
@ -152,11 +162,16 @@ function load-docker-images() {
# managed result is of that. Start everything below that directory.
echo "== Kubernetes addon manager started at $(date -Is) with ADDON_CHECK_INTERVAL_SEC=${ADDON_CHECK_INTERVAL_SEC} =="
# Load any images that we may need
load-docker-images /srv/salt/kube-addons-images
ensure_python
# Load the kube-env, which has all the environment variables we care
# about, in a flat yaml format.
kube_env_yaml="/var/cache/kubernetes-install/kube_env.yaml"
if [ ! -e "${kubelet_kubeconfig_file}" ]; then
eval $(python -c '''
eval $(${PYTHON} -c '''
import pipes,sys,yaml
for k,v in yaml.load(sys.stdin).iteritems():
@ -164,8 +179,6 @@ for k,v in yaml.load(sys.stdin).iteritems():
''' < "${kube_env_yaml}")
fi
# Load any images that we may need
load-docker-images /srv/salt/kube-addons-images
# Create the namespace that will be used to host the cluster-level add-ons.
start_addon /etc/kubernetes/addons/namespace.yaml 100 10 "" &