fuel-ccp/tools/k8s-node-evacuator/build-and-deploy_k8s-node-e...

100 lines
3.3 KiB
Bash
Executable File

#!/bin/bash
#
# This script builds Docker container and deploys in a Kubernetes pod
# a simple daemon to handle Kubernetes node evacuation.
# When "unschedulable" event is detected nova-compute service is disabled
# on the node and all VMs are live-migrated away.
set -ex
function usage {
set +x
local base_name=$(basename $0)
echo "Usage (all parameters are optional):"
echo " $base_name -s <k8s_api_server_address>"
echo " $base_name -n <k8s namespace to deploy pod in>"
echo " $base_name -i <node_to_deploy_on>"
echo " $base_name -r <Docker registry host:port>"
echo " $base_name -k <Docker registry namsespace>"
set -x
}
NAMESPACE_OPT=" --namespace kube-system"
DOCKER_REGISTRY_HOST_PORT="127.0.0.1:31500"
DOCKER_REGISTRY_NAMESPACE="ccp"
while getopts "s:n:i:r:k:" opt; do
case $opt in
"s" )
SRV_OPT=" -s ${OPTARG}"
;;
"n" )
NAMESPACE_OPT=" --namespace ${OPTARG}"
;;
"i" )
NODE="${OPTARG}"
;;
"r" )
DOCKER_REGISTRY_HOST_PORT="${OPTARG}"
;;
"k" )
DOCKER_REGISTRY_NAMESPACE="${OPTARG}"
;;
* )
usage
exit 1
;;
esac
done
which kubectl 1> /dev/null
function kube_cmd {
kubectl ${SRV_OPT} ${NAMESPACE_OPT} "$@"
}
if [ -z "${NODE}" ]; then
NODE=$(kube_cmd get nodes -o template --template="{{ with index .items 0 }}{{ .metadata.name }}{{ end }}")
echo "K8S node was not specified, using ${NODE}"
fi
kube_cmd label node "${NODE}" app=k8s-node-evacuator --overwrite
workdir=$(dirname $0)
pushd ${workdir}
echo "Preparing Dockerfile:"
sed -i "s/DOCKER_REGISTRY_HOST_PORT_CHANGE_ME/${DOCKER_REGISTRY_HOST_PORT}/" Dockerfile
sed -i "s/DOCKER_REGISTRY_NAMESPACE_CHANGE_ME/${DOCKER_REGISTRY_NAMESPACE}/" Dockerfile
echo "Building Docker image:"
docker build -t k8s-node-evacuator .
docker tag k8s-node-evacuator "${DOCKER_REGISTRY_HOST_PORT}"/"${DOCKER_REGISTRY_NAMESPACE}"/k8s-node-evacuator
docker push "${DOCKER_REGISTRY_HOST_PORT}"/"${DOCKER_REGISTRY_NAMESPACE}"/k8s-node-evacuator
echo "Setting variables in pod yaml file:"
POD_YAML_FILE="k8s-node-evacuator-pod.yaml"
sed -i "s/DOCKER_REGISTRY_HOST_PORT_CHANGE_ME/${DOCKER_REGISTRY_HOST_PORT}/" ${POD_YAML_FILE}
sed -i "s/DOCKER_REGISTRY_NAMESPACE_CHANGE_ME/${DOCKER_REGISTRY_NAMESPACE}/" ${POD_YAML_FILE}
sed -i "s/OS_USER_DOMAIN_NAME_CHANGE_ME/${OS_USER_DOMAIN_NAME}/" ${POD_YAML_FILE}
sed -i "s/OS_PROJECT_NAME_CHANGE_ME/${OS_PROJECT_NAME}/" ${POD_YAML_FILE}
sed -i "s/OS_IDENTITY_API_VERSION_CHANGE_ME/\"${OS_IDENTITY_API_VERSION}\"/" ${POD_YAML_FILE}
sed -i "s/OS_PASSWORD_CHANGE_ME/${OS_PASSWORD}/" ${POD_YAML_FILE}
sed -i "s#OS_AUTH_URL_CHANGE_ME#${OS_AUTH_URL}#" ${POD_YAML_FILE}
sed -i "s/OS_USERNAME_CHANGE_ME/${OS_USERNAME}/" ${POD_YAML_FILE}
sed -i "s/OS_PROJECT_DOMAIN_NAME_CHANGE_ME/${OS_PROJECT_DOMAIN_NAME}/" ${POD_YAML_FILE}
echo "Deploying k8s-node-evacuator pod:"
kube_cmd create -f k8s-node-evacuator-pod.yaml
# Waiting for status Running
while true; do
echo "Waiting for 'Running' state..."
cont_running=$(kube_cmd get pod k8s-node-evacuator -o template --template="{{ .status.phase }}")
if [ "${cont_running}" == "Running" ]; then
break
fi
sleep 3
done
echo "k8s-node-evacuator is ready."