2014-12-11 06:13:34 +00:00
|
|
|
#!/bin/bash
|
|
|
|
|
2015-04-10 08:12:00 +00:00
|
|
|
# Copyright 2015 The Kubernetes Authors All rights reserved.
|
2014-12-11 06:13:34 +00:00
|
|
|
#
|
|
|
|
# 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.
|
|
|
|
|
2015-04-10 08:12:00 +00:00
|
|
|
# A library of helper functions that each provider hosting Kubernetes must implement to use cluster/kube-*.sh scripts.
|
|
|
|
set -e
|
2014-12-11 06:13:34 +00:00
|
|
|
|
2015-04-10 08:12:00 +00:00
|
|
|
SSH_OPTS="-oStrictHostKeyChecking=no -oUserKnownHostsFile=/dev/null -oLogLevel=ERROR"
|
2014-12-11 06:13:34 +00:00
|
|
|
|
2015-04-10 08:12:00 +00:00
|
|
|
MASTER=""
|
|
|
|
MASTER_IP=""
|
|
|
|
MINION_IPS=""
|
2014-12-11 06:13:34 +00:00
|
|
|
|
2015-05-11 02:07:58 +00:00
|
|
|
# Assumed Vars:
|
|
|
|
# KUBE_ROOT
|
|
|
|
function test-build-release {
|
|
|
|
# Make a release
|
|
|
|
"${KUBE_ROOT}/build/release.sh"
|
|
|
|
}
|
|
|
|
|
2015-08-08 21:29:57 +00:00
|
|
|
# From user input set the necessary k8s and etcd configuration information
|
2015-04-10 08:12:00 +00:00
|
|
|
function setClusterInfo() {
|
2015-07-31 13:13:28 +00:00
|
|
|
# Initialize MINION_IPS in setClusterInfo function
|
|
|
|
# MINION_IPS is defined as a global variable, and is concatenated with other nodeIP
|
|
|
|
# When setClusterInfo is called for many times, this could cause potential problems
|
|
|
|
# Such as, you will have MINION_IPS=192.168.0.2,192.168.0.3,192.168.0.2,192.168.0.3 which is obviously wrong
|
|
|
|
MINION_IPS=""
|
|
|
|
|
2015-04-10 08:12:00 +00:00
|
|
|
ii=0
|
2015-08-27 13:53:09 +00:00
|
|
|
for i in $nodes; do
|
2015-06-24 03:01:59 +00:00
|
|
|
nodeIP=${i#*@}
|
2014-12-11 06:13:34 +00:00
|
|
|
|
2015-08-27 13:53:09 +00:00
|
|
|
if [[ "${roles[${ii}]}" == "ai" ]]; then
|
2015-06-24 03:01:59 +00:00
|
|
|
MASTER_IP=$nodeIP
|
|
|
|
MASTER=$i
|
|
|
|
MINION_IPS="$nodeIP"
|
2015-08-27 13:53:09 +00:00
|
|
|
elif [[ "${roles[${ii}]}" == "a" ]]; then
|
2015-06-24 03:01:59 +00:00
|
|
|
MASTER_IP=$nodeIP
|
|
|
|
MASTER=$i
|
2015-08-27 13:53:09 +00:00
|
|
|
elif [[ "${roles[${ii}]}" == "i" ]]; then
|
|
|
|
if [[ -z "${MINION_IPS}" ]];then
|
2015-04-10 08:12:00 +00:00
|
|
|
MINION_IPS="$nodeIP"
|
|
|
|
else
|
2015-06-24 03:01:59 +00:00
|
|
|
MINION_IPS="$MINION_IPS,$nodeIP"
|
2015-04-10 08:12:00 +00:00
|
|
|
fi
|
2015-06-24 03:01:59 +00:00
|
|
|
else
|
|
|
|
echo "unsupported role for ${i}. please check"
|
|
|
|
exit 1
|
|
|
|
fi
|
2014-12-11 06:13:34 +00:00
|
|
|
|
2015-06-24 03:01:59 +00:00
|
|
|
((ii=ii+1))
|
2015-04-10 08:12:00 +00:00
|
|
|
done
|
2014-12-11 06:13:34 +00:00
|
|
|
|
2015-04-10 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
# Verify ssh prereqs
|
|
|
|
function verify-prereqs {
|
2015-05-21 14:16:53 +00:00
|
|
|
local rc
|
|
|
|
|
|
|
|
rc=0
|
|
|
|
ssh-add -L 1> /dev/null 2> /dev/null || rc="$?"
|
|
|
|
# "Could not open a connection to your authentication agent."
|
|
|
|
if [[ "${rc}" -eq 2 ]]; then
|
|
|
|
eval "$(ssh-agent)" > /dev/null
|
|
|
|
trap-add "kill ${SSH_AGENT_PID}" EXIT
|
|
|
|
fi
|
|
|
|
|
|
|
|
rc=0
|
|
|
|
ssh-add -L 1> /dev/null 2> /dev/null || rc="$?"
|
|
|
|
# "The agent has no identities."
|
|
|
|
if [[ "${rc}" -eq 1 ]]; then
|
|
|
|
# Try adding one of the default identities, with or without passphrase.
|
|
|
|
ssh-add || true
|
2015-06-24 03:01:59 +00:00
|
|
|
fi
|
2015-05-21 14:16:53 +00:00
|
|
|
# Expect at least one identity to be available.
|
2015-04-10 08:12:00 +00:00
|
|
|
if ! ssh-add -L 1> /dev/null 2> /dev/null; then
|
|
|
|
echo "Could not find or add an SSH identity."
|
|
|
|
echo "Please start ssh-agent, add your identity, and retry."
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2015-05-29 03:04:47 +00:00
|
|
|
# Install handler for signal trap
|
|
|
|
function trap-add {
|
|
|
|
local handler="$1"
|
|
|
|
local signal="${2-EXIT}"
|
|
|
|
local cur
|
|
|
|
|
|
|
|
cur="$(eval "sh -c 'echo \$3' -- $(trap -p ${signal})")"
|
|
|
|
if [[ -n "${cur}" ]]; then
|
|
|
|
handler="${cur}; ${handler}"
|
2015-04-10 08:12:00 +00:00
|
|
|
fi
|
|
|
|
|
2015-05-29 03:04:47 +00:00
|
|
|
trap "${handler}" ${signal}
|
2015-04-10 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function verify-cluster {
|
|
|
|
ii=0
|
|
|
|
|
|
|
|
for i in ${nodes}
|
|
|
|
do
|
|
|
|
if [ "${roles[${ii}]}" == "a" ]; then
|
2015-06-24 03:01:59 +00:00
|
|
|
verify-master
|
2015-04-10 08:12:00 +00:00
|
|
|
elif [ "${roles[${ii}]}" == "i" ]; then
|
|
|
|
verify-minion $i
|
|
|
|
elif [ "${roles[${ii}]}" == "ai" ]; then
|
|
|
|
verify-master
|
|
|
|
verify-minion $i
|
|
|
|
else
|
|
|
|
echo "unsupported role for ${i}. please check"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
|
|
|
((ii=ii+1))
|
|
|
|
done
|
|
|
|
|
|
|
|
echo
|
|
|
|
echo "Kubernetes cluster is running. The master is running at:"
|
|
|
|
echo
|
2015-07-16 03:03:20 +00:00
|
|
|
echo " http://${MASTER_IP}:8080"
|
2015-04-10 08:12:00 +00:00
|
|
|
echo
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function verify-master(){
|
|
|
|
# verify master has all required daemons
|
2015-06-17 14:35:54 +00:00
|
|
|
printf "Validating master"
|
2015-04-10 08:12:00 +00:00
|
|
|
local -a required_daemon=("kube-apiserver" "kube-controller-manager" "kube-scheduler")
|
|
|
|
local validated="1"
|
|
|
|
until [[ "$validated" == "0" ]]; do
|
|
|
|
validated="0"
|
|
|
|
local daemon
|
|
|
|
for daemon in "${required_daemon[@]}"; do
|
2015-06-17 14:35:54 +00:00
|
|
|
ssh $SSH_OPTS "$MASTER" "pgrep -f ${daemon}" >/dev/null 2>&1 || {
|
2015-04-10 08:12:00 +00:00
|
|
|
printf "."
|
|
|
|
validated="1"
|
|
|
|
sleep 2
|
|
|
|
}
|
|
|
|
done
|
|
|
|
done
|
2015-06-17 14:35:54 +00:00
|
|
|
printf "\n"
|
2015-04-10 08:12:00 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function verify-minion(){
|
|
|
|
# verify minion has all required daemons
|
2015-06-17 14:35:54 +00:00
|
|
|
printf "Validating ${1}"
|
2015-04-10 08:12:00 +00:00
|
|
|
local -a required_daemon=("kube-proxy" "kubelet" "docker")
|
|
|
|
local validated="1"
|
|
|
|
until [[ "$validated" == "0" ]]; do
|
|
|
|
validated="0"
|
|
|
|
local daemon
|
|
|
|
for daemon in "${required_daemon[@]}"; do
|
2015-06-17 14:35:54 +00:00
|
|
|
ssh $SSH_OPTS "$1" "pgrep -f $daemon" >/dev/null 2>&1 || {
|
2015-04-10 08:12:00 +00:00
|
|
|
printf "."
|
|
|
|
validated="1"
|
|
|
|
sleep 2
|
|
|
|
}
|
|
|
|
done
|
|
|
|
done
|
2015-06-17 14:35:54 +00:00
|
|
|
printf "\n"
|
2015-04-10 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function create-etcd-opts(){
|
|
|
|
cat <<EOF > ~/kube/default/etcd
|
2015-08-27 13:53:09 +00:00
|
|
|
ETCD_OPTS="-name infra
|
|
|
|
-listen-client-urls http://0.0.0.0:4001 \
|
|
|
|
-advertise-client-urls http://127.0.0.1:4001"
|
2015-04-10 08:12:00 +00:00
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
function create-kube-apiserver-opts(){
|
|
|
|
cat <<EOF > ~/kube/default/kube-apiserver
|
2015-07-29 05:57:14 +00:00
|
|
|
KUBE_APISERVER_OPTS="--insecure-bind-address=0.0.0.0 \
|
|
|
|
--insecure-port=8080 \
|
|
|
|
--etcd-servers=http://127.0.0.1:4001 \
|
2015-04-10 08:12:00 +00:00
|
|
|
--logtostderr=true \
|
2015-06-26 12:14:32 +00:00
|
|
|
--service-cluster-ip-range=${1} \
|
2015-07-29 05:57:14 +00:00
|
|
|
--admission-control=${2} \
|
2015-07-28 19:29:42 +00:00
|
|
|
--service-node-port-range=${3} \
|
2015-07-29 05:57:14 +00:00
|
|
|
--client-ca-file=/srv/kubernetes/ca.crt \
|
|
|
|
--tls-cert-file=/srv/kubernetes/server.cert \
|
2015-07-16 03:03:20 +00:00
|
|
|
--tls-private-key-file=/srv/kubernetes/server.key"
|
2015-04-10 08:12:00 +00:00
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
function create-kube-controller-manager-opts(){
|
|
|
|
cat <<EOF > ~/kube/default/kube-controller-manager
|
|
|
|
KUBE_CONTROLLER_MANAGER_OPTS="--master=127.0.0.1:8080 \
|
2015-07-29 05:57:14 +00:00
|
|
|
--root-ca-file=/srv/kubernetes/ca.crt \
|
2015-07-16 03:03:20 +00:00
|
|
|
--service-account-private-key-file=/srv/kubernetes/server.key \
|
2015-04-10 08:12:00 +00:00
|
|
|
--logtostderr=true"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function create-kube-scheduler-opts(){
|
|
|
|
cat <<EOF > ~/kube/default/kube-scheduler
|
|
|
|
KUBE_SCHEDULER_OPTS="--logtostderr=true \
|
|
|
|
--master=127.0.0.1:8080"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function create-kubelet-opts(){
|
|
|
|
cat <<EOF > ~/kube/default/kubelet
|
|
|
|
KUBELET_OPTS="--address=0.0.0.0 \
|
|
|
|
--port=10250 \
|
2015-07-29 05:57:14 +00:00
|
|
|
--hostname-override=$1 \
|
|
|
|
--api-servers=http://$2:8080 \
|
2015-04-10 08:12:00 +00:00
|
|
|
--logtostderr=true \
|
2015-07-29 05:57:14 +00:00
|
|
|
--cluster-dns=$3 \
|
|
|
|
--cluster-domain=$4"
|
2015-04-10 08:12:00 +00:00
|
|
|
EOF
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function create-kube-proxy-opts(){
|
|
|
|
cat <<EOF > ~/kube/default/kube-proxy
|
|
|
|
KUBE_PROXY_OPTS="--master=http://${1}:8080 \
|
|
|
|
--logtostderr=true"
|
|
|
|
EOF
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
function create-flanneld-opts(){
|
|
|
|
cat <<EOF > ~/kube/default/flanneld
|
2015-08-27 13:53:09 +00:00
|
|
|
FLANNEL_OPTS="--etcd-endpoints=http://${1}:4001"
|
2015-04-10 08:12:00 +00:00
|
|
|
EOF
|
|
|
|
}
|
|
|
|
|
|
|
|
# Detect the IP for the master
|
|
|
|
#
|
|
|
|
# Assumed vars:
|
|
|
|
# MASTER_NAME
|
|
|
|
# Vars set:
|
|
|
|
# KUBE_MASTER
|
|
|
|
# KUBE_MASTER_IP
|
|
|
|
function detect-master {
|
|
|
|
source "${KUBE_ROOT}/cluster/ubuntu/${KUBE_CONFIG_FILE-"config-default.sh"}"
|
|
|
|
setClusterInfo
|
|
|
|
KUBE_MASTER=$MASTER
|
|
|
|
KUBE_MASTER_IP=$MASTER_IP
|
|
|
|
echo "Using master $MASTER_IP"
|
|
|
|
}
|
|
|
|
|
|
|
|
# Detect the information about the minions
|
|
|
|
#
|
|
|
|
# Assumed vars:
|
|
|
|
# nodes
|
|
|
|
# Vars set:
|
|
|
|
# KUBE_MINION_IP_ADDRESS (array)
|
|
|
|
function detect-minions {
|
|
|
|
source "${KUBE_ROOT}/cluster/ubuntu/${KUBE_CONFIG_FILE-"config-default.sh"}"
|
|
|
|
|
|
|
|
KUBE_MINION_IP_ADDRESSES=()
|
|
|
|
setClusterInfo
|
2015-06-24 03:01:59 +00:00
|
|
|
|
2015-04-10 08:12:00 +00:00
|
|
|
ii=0
|
|
|
|
for i in ${nodes}
|
|
|
|
do
|
|
|
|
if [ "${roles[${ii}]}" == "i" ] || [ "${roles[${ii}]}" == "ai" ]; then
|
|
|
|
KUBE_MINION_IP_ADDRESSES+=("${i#*@}")
|
|
|
|
fi
|
|
|
|
|
|
|
|
((ii=ii+1))
|
|
|
|
done
|
|
|
|
|
|
|
|
if [[ -z "${KUBE_MINION_IP_ADDRESSES[@]}" ]]; then
|
|
|
|
echo "Could not detect Kubernetes minion nodes. Make sure you've launched a cluster with 'kube-up.sh'" >&2
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
|
|
|
# Instantiate a kubernetes cluster on ubuntu
|
2015-06-26 12:14:32 +00:00
|
|
|
function kube-up() {
|
2015-04-10 08:12:00 +00:00
|
|
|
source "${KUBE_ROOT}/cluster/ubuntu/${KUBE_CONFIG_FILE-"config-default.sh"}"
|
|
|
|
|
2015-09-15 09:17:27 +00:00
|
|
|
# ensure the binaries are well prepared
|
2015-04-10 08:12:00 +00:00
|
|
|
if [ ! -f "ubuntu/binaries/master/kube-apiserver" ]; then
|
2015-09-15 09:17:27 +00:00
|
|
|
echo "No local binaries for kube-up, downloading... "
|
|
|
|
"${KUBE_ROOT}/cluster/ubuntu/build.sh"
|
2015-04-10 08:12:00 +00:00
|
|
|
fi
|
|
|
|
|
|
|
|
setClusterInfo
|
|
|
|
ii=0
|
|
|
|
|
|
|
|
for i in ${nodes}
|
|
|
|
do
|
2015-06-24 03:01:59 +00:00
|
|
|
{
|
|
|
|
if [ "${roles[${ii}]}" == "a" ]; then
|
|
|
|
provision-master
|
|
|
|
elif [ "${roles[${ii}]}" == "ai" ]; then
|
|
|
|
provision-masterandminion
|
2015-08-27 13:53:09 +00:00
|
|
|
elif [ "${roles[${ii}]}" == "i" ]; then
|
|
|
|
provision-minion $i
|
2015-06-24 03:01:59 +00:00
|
|
|
else
|
|
|
|
echo "unsupported role for ${i}. please check"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
}
|
2015-04-10 08:12:00 +00:00
|
|
|
|
|
|
|
((ii=ii+1))
|
|
|
|
done
|
|
|
|
wait
|
|
|
|
|
|
|
|
verify-cluster
|
2015-06-03 23:54:56 +00:00
|
|
|
detect-master
|
|
|
|
export CONTEXT="ubuntu"
|
2015-06-18 05:59:27 +00:00
|
|
|
export KUBE_SERVER="http://${KUBE_MASTER_IP}:8080"
|
|
|
|
|
|
|
|
source "${KUBE_ROOT}/cluster/common.sh"
|
|
|
|
|
|
|
|
# set kubernetes user and password
|
2015-08-22 01:47:31 +00:00
|
|
|
gen-kube-basicauth
|
2015-06-18 05:59:27 +00:00
|
|
|
|
2015-06-03 23:54:56 +00:00
|
|
|
create-kubeconfig
|
2015-04-10 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function provision-master() {
|
|
|
|
# copy the binaries and scripts to the ~/kube directory on the master
|
|
|
|
echo "Deploying master on machine ${MASTER_IP}"
|
2015-06-24 03:01:59 +00:00
|
|
|
echo
|
2015-04-10 08:12:00 +00:00
|
|
|
ssh $SSH_OPTS $MASTER "mkdir -p ~/kube/default"
|
2015-08-27 13:53:09 +00:00
|
|
|
scp -r $SSH_OPTS saltbase/salt/generate-cert/make-ca-cert.sh ubuntu/reconfDocker.sh ubuntu/config-default.sh ubuntu/util.sh ubuntu/master/* ubuntu/binaries/master/ "${MASTER}:~/kube"
|
2015-04-10 08:12:00 +00:00
|
|
|
|
|
|
|
# remote login to MASTER and use sudo to configue k8s master
|
|
|
|
ssh $SSH_OPTS -t $MASTER "source ~/kube/util.sh; \
|
|
|
|
setClusterInfo; \
|
2015-08-27 13:53:09 +00:00
|
|
|
create-etcd-opts; \
|
2015-07-28 19:29:42 +00:00
|
|
|
create-kube-apiserver-opts "${SERVICE_CLUSTER_IP_RANGE}" "${ADMISSION_CONTROL}" "${SERVICE_NODE_PORT_RANGE}"; \
|
2015-04-10 08:12:00 +00:00
|
|
|
create-kube-controller-manager-opts "${MINION_IPS}"; \
|
|
|
|
create-kube-scheduler-opts; \
|
2015-08-27 13:53:09 +00:00
|
|
|
create-flanneld-opts "127.0.0.1"; \
|
2015-09-15 09:17:27 +00:00
|
|
|
sudo -p '[sudo] password to start master: ' cp ~/kube/default/* /etc/default/ && sudo cp ~/kube/init_conf/* /etc/init/ && sudo cp ~/kube/init_scripts/* /etc/init.d/ ;\
|
2015-07-16 03:03:20 +00:00
|
|
|
sudo groupadd -f -r kube-cert; \
|
2015-09-15 18:38:14 +00:00
|
|
|
${PROXY_SETTING} sudo -E ~/kube/make-ca-cert.sh ${MASTER_IP} IP:${MASTER_IP},IP:${SERVICE_CLUSTER_IP_RANGE%.*}.1,DNS:kubernetes,DNS:kubernetes.default,DNS:kubernetes.default.svc,DNS:kubernetes.default.svc.cluster.local; \
|
2015-07-16 03:03:20 +00:00
|
|
|
sudo mkdir -p /opt/bin/ && sudo cp ~/kube/master/* /opt/bin/; \
|
2015-08-27 13:53:09 +00:00
|
|
|
sudo service etcd start; \
|
|
|
|
sudo FLANNEL_NET=${FLANNEL_NET} -b ~/kube/reconfDocker.sh "a";"
|
2015-04-10 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function provision-minion() {
|
2015-06-24 03:01:59 +00:00
|
|
|
# copy the binaries and scripts to the ~/kube directory on the minion
|
|
|
|
echo "Deploying minion on machine ${1#*@}"
|
|
|
|
echo
|
|
|
|
ssh $SSH_OPTS $1 "mkdir -p ~/kube/default"
|
|
|
|
scp -r $SSH_OPTS ubuntu/config-default.sh ubuntu/util.sh ubuntu/reconfDocker.sh ubuntu/minion/* ubuntu/binaries/minion "${1}:~/kube"
|
|
|
|
|
|
|
|
# remote login to MASTER and use sudo to configue k8s master
|
|
|
|
ssh $SSH_OPTS -t $1 "source ~/kube/util.sh; \
|
2015-04-10 08:12:00 +00:00
|
|
|
setClusterInfo; \
|
2015-08-27 13:53:09 +00:00
|
|
|
create-kubelet-opts "${1#*@}" "${MASTER_IP}" "${DNS_SERVER_IP}" "${DNS_DOMAIN}"; \
|
2015-04-10 08:12:00 +00:00
|
|
|
create-kube-proxy-opts "${MASTER_IP}"; \
|
2015-08-27 13:53:09 +00:00
|
|
|
create-flanneld-opts "${MASTER_IP}"; \
|
2015-09-15 09:17:27 +00:00
|
|
|
sudo -p '[sudo] password to start node: ' cp ~/kube/default/* /etc/default/ && sudo cp ~/kube/init_conf/* /etc/init/ && sudo cp ~/kube/init_scripts/* /etc/init.d/ \
|
2015-04-10 08:12:00 +00:00
|
|
|
&& sudo mkdir -p /opt/bin/ && sudo cp ~/kube/minion/* /opt/bin; \
|
2015-08-27 13:53:09 +00:00
|
|
|
sudo service flanneld start; \
|
|
|
|
sudo -b ~/kube/reconfDocker.sh "i";"
|
2015-04-10 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
function provision-masterandminion() {
|
|
|
|
# copy the binaries and scripts to the ~/kube directory on the master
|
|
|
|
echo "Deploying master and minion on machine ${MASTER_IP}"
|
2015-06-24 03:01:59 +00:00
|
|
|
echo
|
2015-04-10 08:12:00 +00:00
|
|
|
ssh $SSH_OPTS $MASTER "mkdir -p ~/kube/default"
|
2015-08-27 13:53:09 +00:00
|
|
|
# scp order matters
|
|
|
|
scp -r $SSH_OPTS saltbase/salt/generate-cert/make-ca-cert.sh ubuntu/config-default.sh ubuntu/util.sh ubuntu/minion/* ubuntu/master/* ubuntu/reconfDocker.sh ubuntu/binaries/master/ ubuntu/binaries/minion "${MASTER}:~/kube"
|
2015-06-24 03:01:59 +00:00
|
|
|
|
2015-04-10 08:12:00 +00:00
|
|
|
# remote login to the node and use sudo to configue k8s
|
|
|
|
ssh $SSH_OPTS -t $MASTER "source ~/kube/util.sh; \
|
|
|
|
setClusterInfo; \
|
2015-08-27 13:53:09 +00:00
|
|
|
create-etcd-opts; \
|
2015-07-28 19:29:42 +00:00
|
|
|
create-kube-apiserver-opts "${SERVICE_CLUSTER_IP_RANGE}" "${ADMISSION_CONTROL}" "${SERVICE_NODE_PORT_RANGE}"; \
|
2015-04-10 08:12:00 +00:00
|
|
|
create-kube-controller-manager-opts "${MINION_IPS}"; \
|
|
|
|
create-kube-scheduler-opts; \
|
2015-06-24 03:01:59 +00:00
|
|
|
create-kubelet-opts "${MASTER_IP}" "${MASTER_IP}" "${DNS_SERVER_IP}" "${DNS_DOMAIN}";
|
2015-04-10 08:12:00 +00:00
|
|
|
create-kube-proxy-opts "${MASTER_IP}";\
|
2015-08-27 13:53:09 +00:00
|
|
|
create-flanneld-opts "127.0.0.1"; \
|
2015-09-15 09:17:27 +00:00
|
|
|
sudo -p '[sudo] password to start master: ' cp ~/kube/default/* /etc/default/ && sudo cp ~/kube/init_conf/* /etc/init/ && sudo cp ~/kube/init_scripts/* /etc/init.d/ ; \
|
2015-07-16 03:03:20 +00:00
|
|
|
sudo groupadd -f -r kube-cert; \
|
2015-09-15 18:38:14 +00:00
|
|
|
${PROXY_SETTING} sudo -E ~/kube/make-ca-cert.sh ${MASTER_IP} IP:${MASTER_IP},IP:${SERVICE_CLUSTER_IP_RANGE%.*}.1,DNS:kubernetes,DNS:kubernetes.default,DNS:kubernetes.default.svc,DNS:kubernetes.default.svc.cluster.local; \
|
2015-07-16 03:03:20 +00:00
|
|
|
sudo mkdir -p /opt/bin/ && sudo cp ~/kube/master/* /opt/bin/ && sudo cp ~/kube/minion/* /opt/bin/; \
|
2015-04-10 08:12:00 +00:00
|
|
|
sudo service etcd start; \
|
2015-08-27 13:53:09 +00:00
|
|
|
sudo FLANNEL_NET=${FLANNEL_NET} -b ~/kube/reconfDocker.sh "ai";"
|
2015-04-10 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Delete a kubernetes cluster
|
|
|
|
function kube-down {
|
|
|
|
source "${KUBE_ROOT}/cluster/ubuntu/${KUBE_CONFIG_FILE-"config-default.sh"}"
|
2015-09-02 02:24:46 +00:00
|
|
|
|
|
|
|
source "${KUBE_ROOT}/cluster/common.sh"
|
|
|
|
tear_down_alive_resources
|
2015-04-10 08:12:00 +00:00
|
|
|
|
2015-08-27 13:53:09 +00:00
|
|
|
ii=0
|
2015-04-10 08:12:00 +00:00
|
|
|
for i in ${nodes}; do
|
2015-06-24 03:01:59 +00:00
|
|
|
{
|
|
|
|
echo "Cleaning on node ${i#*@}"
|
2015-08-27 13:53:09 +00:00
|
|
|
if [[ "${roles[${ii}]}" == "ai" || "${roles[${ii}]}" == "a" ]]; then
|
2015-09-15 09:17:27 +00:00
|
|
|
ssh -t $i 'pgrep etcd && sudo -p "[sudo] password to stop master: " service etcd stop && sudo rm -rf /infra*;
|
2015-08-27 13:53:09 +00:00
|
|
|
sudo rm -rf /opt/bin/etcd* /etc/init/etcd.conf /etc/init.d/etcd /etc/default/etcd'
|
|
|
|
elif [[ "${roles[${ii}]}" == "i" ]]; then
|
2015-09-15 09:17:27 +00:00
|
|
|
ssh -t $i 'pgrep flanneld && sudo -p "[sudo] password to stop node: " service flanneld stop'
|
2015-08-27 13:53:09 +00:00
|
|
|
else
|
|
|
|
echo "unsupported role for ${i}"
|
|
|
|
fi
|
|
|
|
# Delete the files in order to generate a clean environment, so you can change each node's role at next deployment.
|
|
|
|
ssh -t $i 'sudo rm -f /opt/bin/kube* /opt/bin/flanneld;
|
|
|
|
sudo rm -rf /etc/init/kube* /etc/init/flanneld.conf /etc/init.d/kube* /etc/init.d/flanneld;
|
|
|
|
sudo rm -rf /etc/default/kube* /etc/default/flanneld;
|
|
|
|
sudo rm -rf ~/kube /var/lib/kubelet'
|
2015-06-24 03:01:59 +00:00
|
|
|
}
|
2015-08-27 13:53:09 +00:00
|
|
|
((ii=ii+1))
|
2015-04-10 08:12:00 +00:00
|
|
|
done
|
|
|
|
}
|
|
|
|
|
2015-08-31 19:15:11 +00:00
|
|
|
|
|
|
|
# Perform common upgrade setup tasks
|
|
|
|
function prepare-push() {
|
2015-09-15 09:17:27 +00:00
|
|
|
# Use local binaries for kube-push
|
|
|
|
if [[ "${KUBE_VERSION}" == "" ]]; then
|
2015-09-13 05:48:32 +00:00
|
|
|
if [[ ! -d "${KUBE_ROOT}/cluster/ubuntu/binaries" ]]; then
|
|
|
|
echo "No local binaries.Please check"
|
|
|
|
exit 1
|
|
|
|
else
|
|
|
|
echo "Please make sure all the required local binaries are prepared ahead"
|
|
|
|
sleep 3
|
|
|
|
fi
|
|
|
|
else
|
|
|
|
# Run build.sh to get the required release
|
2015-09-18 06:14:20 +00:00
|
|
|
export KUBE_VERSION
|
|
|
|
"${KUBE_ROOT}/cluster/ubuntu/build.sh"
|
2015-08-31 19:15:11 +00:00
|
|
|
fi
|
|
|
|
}
|
|
|
|
|
2015-09-09 01:19:09 +00:00
|
|
|
# Update a kubernetes master with required release
|
2015-08-31 19:15:11 +00:00
|
|
|
function push-master {
|
|
|
|
source "${KUBE_ROOT}/cluster/ubuntu/${KUBE_CONFIG_FILE-"config-default.sh"}"
|
2015-09-15 09:17:27 +00:00
|
|
|
|
|
|
|
if [[ ! -f "${KUBE_ROOT}/cluster/ubuntu/binaries/master/kube-apiserver" ]]; then
|
|
|
|
echo "There is no required release of kubernetes, please check first"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2015-08-31 19:15:11 +00:00
|
|
|
setClusterInfo
|
|
|
|
ii=0
|
|
|
|
for i in ${nodes}; do
|
2015-09-09 01:19:09 +00:00
|
|
|
if [[ "${roles[${ii}]}" == "a" ]]; then
|
|
|
|
echo "Cleaning master ${i#*@}"
|
|
|
|
ssh -t $i 'sudo -p "[sudo] stop the all process: " service etcd stop;
|
|
|
|
sudo rm -rf /opt/bin/etcd* /etc/init/etcd.conf /etc/init.d/etcd /etc/default/etcd;
|
|
|
|
sudo rm -f /opt/bin/kube* /opt/bin/flanneld;
|
|
|
|
sudo rm -rf /etc/init/kube* /etc/init/flanneld.conf /etc/init.d/kube* /etc/init.d/flanneld;
|
|
|
|
sudo rm -rf /etc/default/kube* /etc/default/flanneld;
|
|
|
|
sudo rm -rf ~/kube' || true
|
2015-08-31 19:15:11 +00:00
|
|
|
provision-master
|
2015-09-09 01:19:09 +00:00
|
|
|
elif [[ "${roles[${ii}]}" == "ai" ]]; then
|
|
|
|
echo "Cleaning master ${i#*@}"
|
|
|
|
ssh -t $i 'sudo -p "[sudo] stop the all process: " service etcd stop;
|
|
|
|
sudo rm -rf /opt/bin/etcd* /etc/init/etcd.conf /etc/init.d/etcd /etc/default/etcd;
|
|
|
|
sudo rm -f /opt/bin/kube* /opt/bin/flanneld;
|
|
|
|
sudo rm -rf /etc/init/kube* /etc/init/flanneld.conf /etc/init.d/kube* /etc/init.d/flanneld;
|
|
|
|
sudo rm -rf /etc/default/kube* /etc/default/flanneld;
|
|
|
|
sudo rm -rf ~/kube' || true
|
|
|
|
provision-masterandminion
|
2015-08-31 19:15:11 +00:00
|
|
|
elif [[ "${roles[${ii}]}" == "i" ]]; then
|
2015-09-09 01:19:09 +00:00
|
|
|
((ii=ii+1))
|
2015-08-31 19:15:11 +00:00
|
|
|
continue
|
|
|
|
else
|
2015-09-09 01:19:09 +00:00
|
|
|
echo "unsupported role for ${i}, please check"
|
2015-08-31 19:15:11 +00:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
((ii=ii+1))
|
|
|
|
done
|
|
|
|
verify-cluster
|
|
|
|
}
|
|
|
|
|
2015-09-09 01:19:09 +00:00
|
|
|
# Update a kubernetes node with required release
|
2015-08-31 19:15:11 +00:00
|
|
|
function push-node() {
|
|
|
|
source "${KUBE_ROOT}/cluster/ubuntu/${KUBE_CONFIG_FILE-"config-default.sh"}"
|
2015-09-15 09:17:27 +00:00
|
|
|
|
|
|
|
if [[ ! -f "${KUBE_ROOT}/cluster/ubuntu/binaries/minion/kubelet" ]]; then
|
|
|
|
echo "There is no required release of kubernetes, please check first"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2015-09-09 01:19:09 +00:00
|
|
|
node_ip=${1}
|
2015-08-31 19:15:11 +00:00
|
|
|
setClusterInfo
|
|
|
|
ii=0
|
2015-09-09 01:19:09 +00:00
|
|
|
existing=false
|
2015-08-31 19:15:11 +00:00
|
|
|
for i in ${nodes}; do
|
2015-09-09 01:19:09 +00:00
|
|
|
if [[ "${roles[${ii}]}" == "i" && ${i#*@} == $node_ip ]]; then
|
|
|
|
echo "Cleaning node ${i#*@}"
|
|
|
|
ssh -t $i 'sudo -p "[sudo] stop the all process: " service flanneld stop;
|
|
|
|
sudo rm -f /opt/bin/kube* /opt/bin/flanneld;
|
|
|
|
sudo rm -rf /etc/init/kube* /etc/init/flanneld.conf /etc/init.d/kube* /etc/init.d/flanneld;
|
|
|
|
sudo rm -rf /etc/default/kube* /etc/default/flanneld;
|
|
|
|
sudo rm -rf ~/kube' || true
|
2015-08-31 19:15:11 +00:00
|
|
|
provision-minion $i
|
2015-09-09 01:19:09 +00:00
|
|
|
existing=true
|
|
|
|
elif [[ "${roles[${ii}]}" == "a" || "${roles[${ii}]}" == "ai" ]] && [[ ${i#*@} == $node_ip ]]; then
|
|
|
|
echo "${i} is master node, please try ./kube-push -m instead"
|
|
|
|
existing=true
|
|
|
|
elif [[ "${roles[${ii}]}" == "i" || "${roles[${ii}]}" == "a" || "${roles[${ii}]}" == "ai" ]]; then
|
|
|
|
((ii=ii+1))
|
|
|
|
continue
|
2015-08-31 19:15:11 +00:00
|
|
|
else
|
2015-09-09 01:19:09 +00:00
|
|
|
echo "unsupported role for ${i}, please check"
|
2015-08-31 19:15:11 +00:00
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
((ii=ii+1))
|
|
|
|
done
|
2015-09-09 01:19:09 +00:00
|
|
|
if [[ "${existing}" == false ]]; then
|
|
|
|
echo "node ${node_ip} does not exist"
|
|
|
|
else
|
|
|
|
verify-cluster
|
|
|
|
fi
|
|
|
|
|
2015-08-31 19:15:11 +00:00
|
|
|
}
|
|
|
|
|
2015-09-09 01:19:09 +00:00
|
|
|
# Update a kubernetes cluster with required source
|
|
|
|
function kube-push {
|
2015-08-31 19:15:11 +00:00
|
|
|
prepare-push
|
|
|
|
source "${KUBE_ROOT}/cluster/ubuntu/${KUBE_CONFIG_FILE-"config-default.sh"}"
|
2015-09-09 01:19:09 +00:00
|
|
|
|
2015-09-13 05:48:32 +00:00
|
|
|
if [[ ! -f "${KUBE_ROOT}/cluster/ubuntu/binaries/master/kube-apiserver" ]]; then
|
|
|
|
echo "There is no required release of kubernetes, please check first"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
|
2015-09-09 01:19:09 +00:00
|
|
|
#stop all the kube's process & etcd
|
|
|
|
ii=0
|
2015-08-31 19:15:11 +00:00
|
|
|
for i in ${nodes}; do
|
2015-09-09 01:19:09 +00:00
|
|
|
{
|
|
|
|
echo "Cleaning on node ${i#*@}"
|
|
|
|
if [[ "${roles[${ii}]}" == "ai" || "${roles[${ii}]}" == "a" ]]; then
|
2015-09-15 09:17:27 +00:00
|
|
|
ssh -t $i 'pgrep etcd && sudo -p "[sudo] password to stop master: " service etcd stop;
|
2015-09-09 01:19:09 +00:00
|
|
|
sudo rm -rf /opt/bin/etcd* /etc/init/etcd.conf /etc/init.d/etcd /etc/default/etcd' || true
|
|
|
|
elif [[ "${roles[${ii}]}" == "i" ]]; then
|
2015-09-15 09:17:27 +00:00
|
|
|
ssh -t $i 'pgrep flanneld && sudo -p "[sudo] password to stop node: " service flanneld stop' || true
|
2015-09-09 01:19:09 +00:00
|
|
|
else
|
|
|
|
echo "unsupported role for ${i}"
|
|
|
|
fi
|
|
|
|
|
|
|
|
ssh -t $i 'sudo rm -f /opt/bin/kube* /opt/bin/flanneld;
|
|
|
|
sudo rm -rf /etc/init/kube* /etc/init/flanneld.conf /etc/init.d/kube* /etc/init.d/flanneld;
|
|
|
|
sudo rm -rf /etc/default/kube* /etc/default/flanneld;
|
|
|
|
sudo rm -rf ~/kube' || true
|
|
|
|
}
|
|
|
|
((ii=ii+1))
|
2015-08-31 19:15:11 +00:00
|
|
|
done
|
2015-09-09 01:19:09 +00:00
|
|
|
|
2015-09-13 05:48:32 +00:00
|
|
|
#provision all nodes,including master & nodes
|
2015-08-31 19:15:11 +00:00
|
|
|
setClusterInfo
|
|
|
|
ii=0
|
|
|
|
for i in ${nodes}; do
|
|
|
|
if [[ "${roles[${ii}]}" == "a" ]]; then
|
|
|
|
provision-master
|
|
|
|
elif [[ "${roles[${ii}]}" == "i" ]]; then
|
|
|
|
provision-minion $i
|
|
|
|
elif [[ "${roles[${ii}]}" == "ai" ]]; then
|
|
|
|
provision-masterandminion
|
|
|
|
else
|
|
|
|
echo "unsupported role for ${i}. please check"
|
|
|
|
exit 1
|
|
|
|
fi
|
|
|
|
((ii=ii+1))
|
|
|
|
done
|
|
|
|
verify-cluster
|
2015-04-10 08:12:00 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
# Perform preparations required to run e2e tests
|
|
|
|
function prepare-e2e() {
|
|
|
|
echo "Ubuntu doesn't need special preparations for e2e tests" 1>&2
|
2015-05-24 04:59:46 +00:00
|
|
|
}
|