mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-04 01:40:07 +00:00
Merge pull request #2461 from MSOpenTech/deploy
Bring Azure deploy scripts up to date
This commit is contained in:
commit
802d214ed0
@ -28,8 +28,6 @@ While the concepts and architecture in Kubernetes represent years of experience
|
|||||||
* [CloudStack](docs/getting-started-guides/cloudstack.md)
|
* [CloudStack](docs/getting-started-guides/cloudstack.md)
|
||||||
* [Rackspace](docs/getting-started-guides/rackspace.md)
|
* [Rackspace](docs/getting-started-guides/rackspace.md)
|
||||||
* [vSphere](docs/getting-started-guides/vsphere.md)
|
* [vSphere](docs/getting-started-guides/vsphere.md)
|
||||||
|
|
||||||
* The following clouds are currently broken at Kubernetes head. Please sync your client to `v0.3` (`git checkout v0.3`) to use these:
|
|
||||||
* [Microsoft Azure](docs/getting-started-guides/azure.md)
|
* [Microsoft Azure](docs/getting-started-guides/azure.md)
|
||||||
|
|
||||||
* [Kubernetes 101](examples/walkthrough)
|
* [Kubernetes 101](examples/walkthrough)
|
||||||
|
@ -14,15 +14,17 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
SCRIPT_DIR=$(CDPATH="" cd $(dirname $0); pwd)
|
INSTANCE_PREFIX=kubernetes
|
||||||
source $SCRIPT_DIR/../release/azure/config.sh
|
AZ_LOCATION='West US'
|
||||||
|
TAG=testing
|
||||||
|
AZ_CS_PREFIX=kube
|
||||||
|
AZ_VNET=MyVnet
|
||||||
|
AZ_SUBNET=Subnet-1
|
||||||
|
AZ_IMAGE=b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20140927-en-us-30GB
|
||||||
|
AZ_CS="" # is set in azure/util.sh verify-prereqs
|
||||||
|
|
||||||
AZ_SSH_KEY=$HOME/.ssh/azure_rsa
|
AZ_SSH_KEY=$HOME/.ssh/azure_rsa
|
||||||
AZ_SSH_CERT=$HOME/.ssh/azure.pem
|
AZ_SSH_CERT=$HOME/.ssh/azure.pem
|
||||||
AZ_IMAGE=b39f27a8b8c64d52b05eac6a62ebad85__Ubuntu-14_04_1-LTS-amd64-server-20140926-en-us-30GB
|
|
||||||
AZ_SUBNET=Subnet-1
|
|
||||||
AZ_VNET=kube-$AZ_HSH
|
|
||||||
AZ_CS=kube-$AZ_HSH
|
|
||||||
|
|
||||||
NUM_MINIONS=4
|
NUM_MINIONS=4
|
||||||
|
|
||||||
@ -32,3 +34,5 @@ MINION_TAG="${INSTANCE_PREFIX}-minion"
|
|||||||
MINION_NAMES=($(eval echo ${INSTANCE_PREFIX}-minion-{1..${NUM_MINIONS}}))
|
MINION_NAMES=($(eval echo ${INSTANCE_PREFIX}-minion-{1..${NUM_MINIONS}}))
|
||||||
MINION_IP_RANGES=($(eval echo "10.244.{1..${NUM_MINIONS}}.0/24"))
|
MINION_IP_RANGES=($(eval echo "10.244.{1..${NUM_MINIONS}}.0/24"))
|
||||||
MINION_SCOPES=""
|
MINION_SCOPES=""
|
||||||
|
|
||||||
|
PORTAL_NET="10.250.0.0/16"
|
58
cluster/azure/templates/common.sh
Normal file
58
cluster/azure/templates/common.sh
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Retry a download until we get it.
|
||||||
|
#
|
||||||
|
# $1 is the URL to download
|
||||||
|
download-or-bust() {
|
||||||
|
local -r url="$1"
|
||||||
|
local -r file="${url##*/}"
|
||||||
|
rm -f "$file"
|
||||||
|
until [[ -e "${file}" ]]; do
|
||||||
|
curl --ipv4 -Lo "$file" --connect-timeout 20 --retry 6 --retry-delay 10 "$url"
|
||||||
|
md5sum "$file"
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Install salt from GCS. See README.md for instructions on how to update these
|
||||||
|
# debs.
|
||||||
|
#
|
||||||
|
# $1 If set to --master, also install the master
|
||||||
|
install-salt() {
|
||||||
|
apt-get update
|
||||||
|
|
||||||
|
mkdir -p /var/cache/salt-install
|
||||||
|
cd /var/cache/salt-install
|
||||||
|
|
||||||
|
TARS=(
|
||||||
|
libzmq3_3.2.3+dfsg-1~bpo70~dst+1_amd64.deb
|
||||||
|
python-zmq_13.1.0-1~bpo70~dst+1_amd64.deb
|
||||||
|
salt-common_2014.1.13+ds-1~bpo70+1_all.deb
|
||||||
|
salt-minion_2014.1.13+ds-1~bpo70+1_all.deb
|
||||||
|
)
|
||||||
|
if [[ ${1-} == '--master' ]]; then
|
||||||
|
TARS+=(salt-master_2014.1.13+ds-1~bpo70+1_all.deb)
|
||||||
|
fi
|
||||||
|
URL_BASE="https://storage.googleapis.com/kubernetes-release/salt"
|
||||||
|
|
||||||
|
for tar in "${TARS[@]}"; do
|
||||||
|
download-or-bust "${URL_BASE}/${tar}"
|
||||||
|
dpkg -i "${tar}"
|
||||||
|
done
|
||||||
|
|
||||||
|
# This will install any of the unmet dependencies from above.
|
||||||
|
apt-get install -f -y
|
||||||
|
}
|
28
cluster/azure/templates/create-dynamic-salt-files.sh
Normal file
28
cluster/azure/templates/create-dynamic-salt-files.sh
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# Create the overlay files for the salt tree. We create these in a separate
|
||||||
|
# place so that we can blow away the rest of the salt configs on a kube-push and
|
||||||
|
# re-apply these.
|
||||||
|
|
||||||
|
mkdir -p /srv/salt-overlay/pillar
|
||||||
|
cat <<EOF >/srv/salt-overlay/pillar/cluster-params.sls
|
||||||
|
node_instance_prefix: $NODE_INSTANCE_PREFIX
|
||||||
|
portal_net: $PORTAL_NET
|
||||||
|
EOF
|
||||||
|
|
||||||
|
mkdir -p /srv/salt-overlay/salt/nginx
|
||||||
|
echo $MASTER_HTPASSWD > /srv/salt-overlay/salt/nginx/htpasswd
|
@ -20,12 +20,16 @@
|
|||||||
# the release tar to download and unpack. It is meant to be pushed to the
|
# the release tar to download and unpack. It is meant to be pushed to the
|
||||||
# master and run.
|
# master and run.
|
||||||
|
|
||||||
echo "Downloading release ($MASTER_RELEASE_TAR)"
|
|
||||||
wget $MASTER_RELEASE_TAR
|
|
||||||
|
|
||||||
echo "Unpacking release"
|
echo "Downloading binary release tar ($SERVER_BINARY_TAR_URL)"
|
||||||
rm -rf master-release || false
|
download-or-bust "$SERVER_BINARY_TAR_URL"
|
||||||
tar xzf master-release.tgz
|
|
||||||
|
echo "Downloading binary release tar ($SALT_TAR_URL)"
|
||||||
|
download-or-bust "$SALT_TAR_URL"
|
||||||
|
|
||||||
|
echo "Unpacking Salt tree"
|
||||||
|
rm -rf kubernetes
|
||||||
|
tar xzf "${SALT_TAR_URL##*/}"
|
||||||
|
|
||||||
echo "Running release install script"
|
echo "Running release install script"
|
||||||
sudo master-release/src/scripts/master-release-install.sh
|
sudo kubernetes/saltbase/install.sh "${SERVER_BINARY_TAR_URL##*/}"
|
@ -35,7 +35,7 @@ cat <<EOF >/etc/salt/master.d/reactor.conf
|
|||||||
# React to new minions starting by running highstate on them.
|
# React to new minions starting by running highstate on them.
|
||||||
reactor:
|
reactor:
|
||||||
- 'salt/minion/*/start':
|
- 'salt/minion/*/start':
|
||||||
- /srv/reactor/start.sls
|
- /srv/reactor/highstate-new.sls
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
mkdir -p /srv/salt/nginx
|
mkdir -p /srv/salt/nginx
|
||||||
@ -49,12 +49,20 @@ echo "$SERVER_CRT" > /etc/openvpn/server.crt
|
|||||||
echo "$SERVER_KEY" > /etc/openvpn/server.key
|
echo "$SERVER_KEY" > /etc/openvpn/server.key
|
||||||
umask $umask
|
umask $umask
|
||||||
|
|
||||||
# Install Salt
|
cat <<EOF >/etc/salt/minion.d/log-level-debug.conf
|
||||||
#
|
log_level: debug
|
||||||
# We specify -X to avoid a race condition that can cause minion failure to
|
log_level_logfile: debug
|
||||||
# install. See https://github.com/saltstack/salt-bootstrap/issues/270
|
EOF
|
||||||
#
|
|
||||||
# -M installs the master
|
|
||||||
curl -L http://bootstrap.saltstack.com | sh -s -- -M -X
|
|
||||||
|
|
||||||
echo $MASTER_HTPASSWD > /srv/salt/nginx/htpasswd
|
cat <<EOF >/etc/salt/master.d/log-level-debug.d
|
||||||
|
log_level: debug
|
||||||
|
log_level_logfile: debug
|
||||||
|
EOF
|
||||||
|
|
||||||
|
install-salt --master
|
||||||
|
|
||||||
|
# Wait a few minutes and trigger another Salt run to better recover from
|
||||||
|
# any transient errors.
|
||||||
|
echo "Sleeping 180"
|
||||||
|
sleep 180
|
||||||
|
salt-call state.highstate || true
|
@ -26,11 +26,13 @@ umask $umask
|
|||||||
mkdir -p /etc/salt/minion.d
|
mkdir -p /etc/salt/minion.d
|
||||||
echo "master: $MASTER_NAME" > /etc/salt/minion.d/master.conf
|
echo "master: $MASTER_NAME" > /etc/salt/minion.d/master.conf
|
||||||
|
|
||||||
# Turn on debugging for salt-minion
|
cat <<EOF >/etc/salt/minion.d/log-level-debug.conf
|
||||||
# echo "DAEMON_ARGS=\"\$DAEMON_ARGS --log-file-level=debug\"" > /etc/default/salt-minion
|
log_level: debug
|
||||||
|
log_level_logfile: debug
|
||||||
|
EOF
|
||||||
|
|
||||||
hostnamef=$(hostname -f)
|
hostnamef=$(hostname -f)
|
||||||
sudo apt-get install ipcalc
|
apt-get install -y ipcalc
|
||||||
netmask=$(ipcalc $MINION_IP_RANGE | grep Netmask | awk '{ print $2 }')
|
netmask=$(ipcalc $MINION_IP_RANGE | grep Netmask | awk '{ print $2 }')
|
||||||
network=$(ipcalc $MINION_IP_RANGE | grep Address | awk '{ print $2 }')
|
network=$(ipcalc $MINION_IP_RANGE | grep Address | awk '{ print $2 }')
|
||||||
cbrstring="$network $netmask"
|
cbrstring="$network $netmask"
|
||||||
@ -46,8 +48,10 @@ grains:
|
|||||||
cbr-string: $cbrstring
|
cbr-string: $cbrstring
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
# Install Salt
|
install-salt
|
||||||
#
|
|
||||||
# We specify -X to avoid a race condition that can cause minion failure to
|
# Wait a few minutes and trigger another Salt run to better recover from
|
||||||
# install. See https://github.com/saltstack/salt-bootstrap/issues/270
|
# any transient errors.
|
||||||
curl -L http://bootstrap.saltstack.com | sh -s -- -X
|
echo "Sleeping 180"
|
||||||
|
sleep 180
|
||||||
|
salt-call state.highstate || true
|
567
cluster/azure/util.sh
Normal file
567
cluster/azure/util.sh
Normal file
@ -0,0 +1,567 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2014 Google Inc. All rights reserved.
|
||||||
|
#
|
||||||
|
# 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.
|
||||||
|
|
||||||
|
# A library of helper functions and constant for the local config.
|
||||||
|
|
||||||
|
# Use the config file specified in $KUBE_CONFIG_FILE, or default to
|
||||||
|
# config-default.sh.
|
||||||
|
|
||||||
|
KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../..
|
||||||
|
source "${KUBE_ROOT}/cluster/azure/${KUBE_CONFIG_FILE-"config-default.sh"}"
|
||||||
|
|
||||||
|
function azure_call {
|
||||||
|
local -a params=()
|
||||||
|
local param
|
||||||
|
# the '... in "$@"' is implicit on a for, so doesn't need to be stated.
|
||||||
|
for param; do
|
||||||
|
params+=("${param}")
|
||||||
|
done
|
||||||
|
local rc=0
|
||||||
|
local stderr
|
||||||
|
local count=0
|
||||||
|
while [[ count -lt 10 ]]; do
|
||||||
|
stderr=$(azure "${params[@]}" 2>&1 >&3) && break
|
||||||
|
rc=$?
|
||||||
|
if [[ "${stderr}" != *"getaddrinfo ENOTFOUND"* ]]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
count=$(($count + 1))
|
||||||
|
done 3>&1
|
||||||
|
if [[ "${rc}" -ne 0 ]]; then
|
||||||
|
echo "${stderr}" >&2
|
||||||
|
return "${rc}"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function json_val () {
|
||||||
|
python -c 'import json,sys;obj=json.load(sys.stdin);print obj'$1'';
|
||||||
|
}
|
||||||
|
|
||||||
|
# Verify prereqs
|
||||||
|
function verify-prereqs {
|
||||||
|
if [[ -z "$(which azure)" ]]; then
|
||||||
|
echo "Couldn't find azure in PATH"
|
||||||
|
echo " please install with 'npm install azure-cli'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$(azure_call account list | grep true)" ]]; then
|
||||||
|
echo "Default azure account not set"
|
||||||
|
echo " please set with 'azure account set'"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
account=$(azure_call account list | grep true)
|
||||||
|
if which md5 > /dev/null 2>&1; then
|
||||||
|
AZ_HSH=$(md5 -q -s "$account")
|
||||||
|
else
|
||||||
|
AZ_HSH=$(echo -n "$account" | md5sum)
|
||||||
|
fi
|
||||||
|
|
||||||
|
AZ_HSH=${AZ_HSH:0:7}
|
||||||
|
AZ_STG=kube$AZ_HSH
|
||||||
|
echo "==> AZ_STG: $AZ_STG"
|
||||||
|
|
||||||
|
AZ_CS="$AZ_CS_PREFIX-$AZ_HSH"
|
||||||
|
echo "==> AZ_CS: $AZ_CS"
|
||||||
|
|
||||||
|
CONTAINER=kube-$TAG
|
||||||
|
echo "==> CONTAINER: $CONTAINER"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a temp dir that'll be deleted at the end of this bash session.
|
||||||
|
#
|
||||||
|
# Vars set:
|
||||||
|
# KUBE_TEMP
|
||||||
|
function ensure-temp-dir {
|
||||||
|
if [[ -z ${KUBE_TEMP-} ]]; then
|
||||||
|
KUBE_TEMP=$(mktemp -d -t kubernetes.XXXXXX)
|
||||||
|
trap 'rm -rf "${KUBE_TEMP}"' EXIT
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Verify and find the various tar files that we are going to use on the server.
|
||||||
|
#
|
||||||
|
# Vars set:
|
||||||
|
# SERVER_BINARY_TAR
|
||||||
|
# SALT_TAR
|
||||||
|
function find-release-tars {
|
||||||
|
SERVER_BINARY_TAR="${KUBE_ROOT}/server/kubernetes-server-linux-amd64.tar.gz"
|
||||||
|
if [[ ! -f "$SERVER_BINARY_TAR" ]]; then
|
||||||
|
SERVER_BINARY_TAR="${KUBE_ROOT}/_output/release-tars/kubernetes-server-linux-amd64.tar.gz"
|
||||||
|
fi
|
||||||
|
if [[ ! -f "$SERVER_BINARY_TAR" ]]; then
|
||||||
|
echo "!!! Cannot find kubernetes-server-linux-amd64.tar.gz"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
SALT_TAR="${KUBE_ROOT}/server/kubernetes-salt.tar.gz"
|
||||||
|
if [[ ! -f "$SALT_TAR" ]]; then
|
||||||
|
SALT_TAR="${KUBE_ROOT}/_output/release-tars/kubernetes-salt.tar.gz"
|
||||||
|
fi
|
||||||
|
if [[ ! -f "$SALT_TAR" ]]; then
|
||||||
|
echo "!!! Cannot find kubernetes-salt.tar.gz"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Take the local tar files and upload them to Azure Storage. They will then be
|
||||||
|
# downloaded by the master as part of the start up script for the master.
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# SERVER_BINARY_TAR
|
||||||
|
# SALT_TAR
|
||||||
|
# Vars set:
|
||||||
|
# SERVER_BINARY_TAR_URL
|
||||||
|
# SALT_TAR_URL
|
||||||
|
function upload-server-tars() {
|
||||||
|
SERVER_BINARY_TAR_URL=
|
||||||
|
SALT_TAR_URL=
|
||||||
|
|
||||||
|
echo "==> SERVER_BINARY_TAR: $SERVER_BINARY_TAR"
|
||||||
|
echo "==> SALT_TAR: $SALT_TAR"
|
||||||
|
|
||||||
|
echo "+++ Staging server tars to Azure Storage: $AZ_STG"
|
||||||
|
local server_binary_url="${SERVER_BINARY_TAR##*/}"
|
||||||
|
local salt_url="${SALT_TAR##*/}"
|
||||||
|
|
||||||
|
SERVER_BINARY_TAR_URL="https://${AZ_STG}.blob.core.windows.net/$CONTAINER/$server_binary_url"
|
||||||
|
SALT_TAR_URL="https://${AZ_STG}.blob.core.windows.net/$CONTAINER/$salt_url"
|
||||||
|
|
||||||
|
echo "==> SERVER_BINARY_TAR_URL: $SERVER_BINARY_TAR_URL"
|
||||||
|
echo "==> SALT_TAR_URL: $SALT_TAR_URL"
|
||||||
|
|
||||||
|
echo "--> Checking storage exsists..."
|
||||||
|
if [[ -z "$(azure_call storage account show $AZ_STG 2>/dev/null | \
|
||||||
|
grep data)" ]]; then
|
||||||
|
echo "--> Creating storage..."
|
||||||
|
azure_call storage account create -l "$AZ_LOCATION" $AZ_STG
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "--> Getting storage key..."
|
||||||
|
stg_key=$(azure_call storage account keys list $AZ_STG --json | \
|
||||||
|
json_val '["primaryKey"]')
|
||||||
|
|
||||||
|
echo "--> Checking storage container exsists..."
|
||||||
|
if [[ -z "$(azure_call storage container show -a $AZ_STG -k "$stg_key" \
|
||||||
|
$CONTAINER 2>/dev/null | grep data)" ]]; then
|
||||||
|
echo "--> Creating storage container..."
|
||||||
|
azure_call storage container create \
|
||||||
|
-a $AZ_STG \
|
||||||
|
-k "$stg_key" \
|
||||||
|
-p Blob \
|
||||||
|
$CONTAINER
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "--> Checking server binary exists in the container..."
|
||||||
|
if [[ -n "$(azure_call storage blob show -a $AZ_STG -k "$stg_key" \
|
||||||
|
$CONTAINER $server_binary_url 2>/dev/null | grep data)" ]]; then
|
||||||
|
echo "--> Deleting server binary in the container..."
|
||||||
|
azure_call storage blob delete \
|
||||||
|
-a $AZ_STG \
|
||||||
|
-k "$stg_key" \
|
||||||
|
$CONTAINER \
|
||||||
|
$server_binary_url
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "--> Uploading server binary to the container..."
|
||||||
|
azure_call storage blob upload \
|
||||||
|
-a $AZ_STG \
|
||||||
|
-k "$stg_key" \
|
||||||
|
$SERVER_BINARY_TAR \
|
||||||
|
$CONTAINER \
|
||||||
|
$server_binary_url
|
||||||
|
|
||||||
|
echo "--> Checking salt data exists in the container..."
|
||||||
|
if [[ -n "$(azure_call storage blob show -a $AZ_STG -k "$stg_key" \
|
||||||
|
$CONTAINER $salt_url 2>/dev/null | grep data)" ]]; then
|
||||||
|
echo "--> Deleting salt data in the container..."
|
||||||
|
azure_call storage blob delete \
|
||||||
|
-a $AZ_STG \
|
||||||
|
-k "$stg_key" \
|
||||||
|
$CONTAINER \
|
||||||
|
$salt_url
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "--> Uploading salt data to the container..."
|
||||||
|
azure_call storage blob upload \
|
||||||
|
-a $AZ_STG \
|
||||||
|
-k "$stg_key" \
|
||||||
|
$SALT_TAR \
|
||||||
|
$CONTAINER \
|
||||||
|
$salt_url
|
||||||
|
}
|
||||||
|
|
||||||
|
# Detect the information about the minions
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# MINION_NAMES
|
||||||
|
# ZONE
|
||||||
|
# Vars set:
|
||||||
|
#
|
||||||
|
function detect-minions () {
|
||||||
|
if [[ -z "$AZ_CS" ]]; then
|
||||||
|
verify-prereqs
|
||||||
|
fi
|
||||||
|
ssh_ports=($(eval echo "2200{1..$NUM_MINIONS}"))
|
||||||
|
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
||||||
|
MINION_NAMES[$i]=$(ssh -oStrictHostKeyChecking=no -i $AZ_SSH_KEY -p ${ssh_ports[$i]} $AZ_CS.cloudapp.net hostname -f)
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Detect the IP for the master
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# MASTER_NAME
|
||||||
|
# ZONE
|
||||||
|
# Vars set:
|
||||||
|
# KUBE_MASTER
|
||||||
|
# KUBE_MASTER_IP
|
||||||
|
function detect-master () {
|
||||||
|
if [[ -z "$AZ_CS" ]]; then
|
||||||
|
verify-prereqs
|
||||||
|
fi
|
||||||
|
|
||||||
|
KUBE_MASTER=${MASTER_NAME}
|
||||||
|
KUBE_MASTER_IP="${AZ_CS}.cloudapp.net"
|
||||||
|
echo "Using master: $KUBE_MASTER (external IP: $KUBE_MASTER_IP)"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ensure that we have a password created for validating to the master. Will
|
||||||
|
# read from $HOME/.kubernetres_auth if available.
|
||||||
|
#
|
||||||
|
# Vars set:
|
||||||
|
# KUBE_USER
|
||||||
|
# KUBE_PASSWORD
|
||||||
|
function get-password {
|
||||||
|
local file="$HOME/.kubernetes_auth"
|
||||||
|
if [[ -r "$file" ]]; then
|
||||||
|
KUBE_USER=$(cat "$file" | python -c 'import json,sys;print json.load(sys.stdin)["User"]')
|
||||||
|
KUBE_PASSWORD=$(cat "$file" | python -c 'import json,sys;print json.load(sys.stdin)["Password"]')
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
KUBE_USER=admin
|
||||||
|
KUBE_PASSWORD=$(python -c 'import string,random; print "".join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(16))')
|
||||||
|
|
||||||
|
# Remove this code, since in all use cases I can see, we are overwriting this
|
||||||
|
# at cluster creation time.
|
||||||
|
cat << EOF > "$file"
|
||||||
|
{
|
||||||
|
"User": "$KUBE_USER",
|
||||||
|
"Password": "$KUBE_PASSWORD"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
chmod 0600 "$file"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Generate authentication token for admin user. Will
|
||||||
|
# read from $HOME/.kubernetes_auth if available.
|
||||||
|
#
|
||||||
|
# Vars set:
|
||||||
|
# KUBE_ADMIN_TOKEN
|
||||||
|
function get-admin-token {
|
||||||
|
local file="$HOME/.kubernetes_auth"
|
||||||
|
if [[ -r "$file" ]]; then
|
||||||
|
KUBE_ADMIN_TOKEN=$(cat "$file" | python -c 'import json,sys;print json.load(sys.stdin)["BearerToken"]')
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
KUBE_ADMIN_TOKEN=$(python -c 'import string,random; print "".join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(32))')
|
||||||
|
}
|
||||||
|
|
||||||
|
# Instantiate a kubernetes cluster
|
||||||
|
#
|
||||||
|
# Assumed vars
|
||||||
|
# KUBE_ROOT
|
||||||
|
# <Various vars set in config file>
|
||||||
|
function kube-up {
|
||||||
|
# Make sure we have the tar files staged on Azure Storage
|
||||||
|
find-release-tars
|
||||||
|
upload-server-tars
|
||||||
|
|
||||||
|
ensure-temp-dir
|
||||||
|
|
||||||
|
get-password
|
||||||
|
python "${KUBE_ROOT}/third_party/htpasswd/htpasswd.py" \
|
||||||
|
-b -c "${KUBE_TEMP}/htpasswd" "$KUBE_USER" "$KUBE_PASSWORD"
|
||||||
|
local htpasswd
|
||||||
|
htpasswd=$(cat "${KUBE_TEMP}/htpasswd")
|
||||||
|
|
||||||
|
# Generate openvpn certs
|
||||||
|
echo "--> Generating openvpn certs"
|
||||||
|
echo 01 > ${KUBE_TEMP}/ca.srl
|
||||||
|
openssl genrsa -out ${KUBE_TEMP}/ca.key
|
||||||
|
openssl req -new -x509 -days 1095 \
|
||||||
|
-key ${KUBE_TEMP}/ca.key \
|
||||||
|
-out ${KUBE_TEMP}/ca.crt \
|
||||||
|
-subj "/CN=openvpn-ca"
|
||||||
|
openssl genrsa -out ${KUBE_TEMP}/server.key
|
||||||
|
openssl req -new \
|
||||||
|
-key ${KUBE_TEMP}/server.key \
|
||||||
|
-out ${KUBE_TEMP}/server.csr \
|
||||||
|
-subj "/CN=server"
|
||||||
|
openssl x509 -req -days 1095 \
|
||||||
|
-in ${KUBE_TEMP}/server.csr \
|
||||||
|
-CA ${KUBE_TEMP}/ca.crt \
|
||||||
|
-CAkey ${KUBE_TEMP}/ca.key \
|
||||||
|
-CAserial ${KUBE_TEMP}/ca.srl \
|
||||||
|
-out ${KUBE_TEMP}/server.crt
|
||||||
|
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
||||||
|
openssl genrsa -out ${KUBE_TEMP}/${MINION_NAMES[$i]}.key
|
||||||
|
openssl req -new \
|
||||||
|
-key ${KUBE_TEMP}/${MINION_NAMES[$i]}.key \
|
||||||
|
-out ${KUBE_TEMP}/${MINION_NAMES[$i]}.csr \
|
||||||
|
-subj "/CN=${MINION_NAMES[$i]}"
|
||||||
|
openssl x509 -req -days 1095 \
|
||||||
|
-in ${KUBE_TEMP}/${MINION_NAMES[$i]}.csr \
|
||||||
|
-CA ${KUBE_TEMP}/ca.crt \
|
||||||
|
-CAkey ${KUBE_TEMP}/ca.key \
|
||||||
|
-CAserial ${KUBE_TEMP}/ca.srl \
|
||||||
|
-out ${KUBE_TEMP}/${MINION_NAMES[$i]}.crt
|
||||||
|
done
|
||||||
|
|
||||||
|
# Build up start up script for master
|
||||||
|
echo "--> Building up start up script for master"
|
||||||
|
(
|
||||||
|
echo "#!/bin/bash"
|
||||||
|
echo "CA_CRT=\"$(cat ${KUBE_TEMP}/ca.crt)\""
|
||||||
|
echo "SERVER_CRT=\"$(cat ${KUBE_TEMP}/server.crt)\""
|
||||||
|
echo "SERVER_KEY=\"$(cat ${KUBE_TEMP}/server.key)\""
|
||||||
|
echo "mkdir -p /var/cache/kubernetes-install"
|
||||||
|
echo "cd /var/cache/kubernetes-install"
|
||||||
|
echo "readonly MASTER_NAME='${MASTER_NAME}'"
|
||||||
|
echo "readonly NODE_INSTANCE_PREFIX='${INSTANCE_PREFIX}-minion'"
|
||||||
|
echo "readonly SERVER_BINARY_TAR_URL='${SERVER_BINARY_TAR_URL}'"
|
||||||
|
echo "readonly SALT_TAR_URL='${SALT_TAR_URL}'"
|
||||||
|
echo "readonly MASTER_HTPASSWD='${htpasswd}'"
|
||||||
|
echo "readonly PORTAL_NET='${PORTAL_NET}'"
|
||||||
|
grep -v "^#" "${KUBE_ROOT}/cluster/azure/templates/common.sh"
|
||||||
|
grep -v "^#" "${KUBE_ROOT}/cluster/azure/templates/create-dynamic-salt-files.sh"
|
||||||
|
grep -v "^#" "${KUBE_ROOT}/cluster/azure/templates/download-release.sh"
|
||||||
|
grep -v "^#" "${KUBE_ROOT}/cluster/azure/templates/salt-master.sh"
|
||||||
|
) > "${KUBE_TEMP}/master-start.sh"
|
||||||
|
|
||||||
|
if [[ ! -f $AZ_SSH_KEY ]]; then
|
||||||
|
ssh-keygen -f $AZ_SSH_KEY -N ''
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! -f $AZ_SSH_CERT ]]; then
|
||||||
|
openssl req -new -x509 -days 1095 -key $AZ_SSH_KEY -out $AZ_SSH_CERT \
|
||||||
|
-subj "/CN=azure-ssh-key"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -z "$(azure_call network vnet show $AZ_VNET 2>/dev/null | grep data)" ]]; then
|
||||||
|
#azure network vnet create with $AZ_SUBNET
|
||||||
|
#FIXME not working
|
||||||
|
echo error create vnet $AZ_VNET with subnet $AZ_SUBNET
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "--> Starting VM"
|
||||||
|
azure_call vm create \
|
||||||
|
-w $AZ_VNET \
|
||||||
|
-n $MASTER_NAME \
|
||||||
|
-l "$AZ_LOCATION" \
|
||||||
|
-t $AZ_SSH_CERT \
|
||||||
|
-e 22000 -P \
|
||||||
|
-d ${KUBE_TEMP}/master-start.sh \
|
||||||
|
-b $AZ_SUBNET \
|
||||||
|
$AZ_CS $AZ_IMAGE $USER
|
||||||
|
|
||||||
|
ssh_ports=($(eval echo "2200{1..$NUM_MINIONS}"))
|
||||||
|
|
||||||
|
#Build up start up script for minions
|
||||||
|
echo "--> Building up start up script for minions"
|
||||||
|
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
||||||
|
(
|
||||||
|
echo "#!/bin/bash"
|
||||||
|
echo "MASTER_NAME='${MASTER_NAME}'"
|
||||||
|
echo "CA_CRT=\"$(cat ${KUBE_TEMP}/ca.crt)\""
|
||||||
|
echo "CLIENT_CRT=\"$(cat ${KUBE_TEMP}/${MINION_NAMES[$i]}.crt)\""
|
||||||
|
echo "CLIENT_KEY=\"$(cat ${KUBE_TEMP}/${MINION_NAMES[$i]}.key)\""
|
||||||
|
echo "MINION_IP_RANGE='${MINION_IP_RANGES[$i]}'"
|
||||||
|
grep -v "^#" "${KUBE_ROOT}/cluster/azure/templates/common.sh"
|
||||||
|
grep -v "^#" "${KUBE_ROOT}/cluster/azure/templates/salt-minion.sh"
|
||||||
|
) > "${KUBE_TEMP}/minion-start-${i}.sh"
|
||||||
|
|
||||||
|
echo "--> Starting VM"
|
||||||
|
azure_call vm create \
|
||||||
|
-c -w $AZ_VNET \
|
||||||
|
-n ${MINION_NAMES[$i]} \
|
||||||
|
-l "$AZ_LOCATION" \
|
||||||
|
-t $AZ_SSH_CERT \
|
||||||
|
-e ${ssh_ports[$i]} -P \
|
||||||
|
-d ${KUBE_TEMP}/minion-start-${i}.sh \
|
||||||
|
-b $AZ_SUBNET \
|
||||||
|
$AZ_CS $AZ_IMAGE $USER
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "--> Createing endpoint"
|
||||||
|
azure_call vm endpoint create $MASTER_NAME 443
|
||||||
|
|
||||||
|
detect-master > /dev/null
|
||||||
|
|
||||||
|
echo "==> KUBE_MASTER_IP: ${KUBE_MASTER_IP}"
|
||||||
|
|
||||||
|
echo "Waiting for cluster initialization."
|
||||||
|
echo
|
||||||
|
echo " This will continually check to see if the API for kubernetes is reachable."
|
||||||
|
echo " This might loop forever if there was some uncaught error during start"
|
||||||
|
echo " up."
|
||||||
|
echo
|
||||||
|
|
||||||
|
until curl --insecure --user "${KUBE_USER}:${KUBE_PASSWORD}" --max-time 5 \
|
||||||
|
--fail --output /dev/null --silent "https://${KUBE_MASTER_IP}/api/v1beta1/pods"; do
|
||||||
|
printf "."
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
printf "\n"
|
||||||
|
echo "Kubernetes cluster created."
|
||||||
|
|
||||||
|
local kube_cert=".kubecfg.crt"
|
||||||
|
local kube_key=".kubecfg.key"
|
||||||
|
local ca_cert=".kubernetes.ca.crt"
|
||||||
|
|
||||||
|
# TODO: generate ADMIN (and KUBELET) tokens and put those in the master's
|
||||||
|
# config file. Distribute the same way the htpasswd is done.
|
||||||
|
(umask 077
|
||||||
|
ssh -oStrictHostKeyChecking=no -i $AZ_SSH_KEY -p 22000 $AZ_CS.cloudapp.net \
|
||||||
|
sudo cat /srv/kubernetes/kubecfg.crt >"${HOME}/${kube_cert}" 2>/dev/null
|
||||||
|
ssh -oStrictHostKeyChecking=no -i $AZ_SSH_KEY -p 22000 $AZ_CS.cloudapp.net \
|
||||||
|
sudo cat /srv/kubernetes/kubecfg.key >"${HOME}/${kube_key}" 2>/dev/null
|
||||||
|
ssh -oStrictHostKeyChecking=no -i $AZ_SSH_KEY -p 22000 $AZ_CS.cloudapp.net \
|
||||||
|
sudo cat /srv/kubernetes/ca.crt >"${HOME}/${ca_cert}" 2>/dev/null
|
||||||
|
|
||||||
|
cat << EOF > ~/.kubernetes_auth
|
||||||
|
{
|
||||||
|
"User": "$KUBE_USER",
|
||||||
|
"Password": "$KUBE_PASSWORD",
|
||||||
|
"CAFile": "$HOME/$ca_cert",
|
||||||
|
"CertFile": "$HOME/$kube_cert",
|
||||||
|
"KeyFile": "$HOME/$kube_key"
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
chmod 0600 ~/.kubernetes_auth "${HOME}/${kube_cert}" \
|
||||||
|
"${HOME}/${kube_key}" "${HOME}/${ca_cert}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Wait for salt on the minions
|
||||||
|
sleep 30
|
||||||
|
|
||||||
|
echo "Sanity checking cluster..."
|
||||||
|
# Basic sanity checking
|
||||||
|
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
||||||
|
# Make sure docker is installed
|
||||||
|
echo "--> Making sure docker is installed on ${MINION_NAMES[$i]}."
|
||||||
|
ssh -oStrictHostKeyChecking=no -i $AZ_SSH_KEY -p ${ssh_ports[$i]} \
|
||||||
|
$AZ_CS.cloudapp.net which docker > /dev/null || {
|
||||||
|
echo "Docker failed to install on ${MINION_NAMES[$i]}. Your cluster is unlikely" >&2
|
||||||
|
echo "to work correctly. Please run ./cluster/kube-down.sh and re-create the" >&2
|
||||||
|
echo "cluster. (sorry!)" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
done
|
||||||
|
|
||||||
|
echo
|
||||||
|
echo "Kubernetes cluster is running. The master is running at:"
|
||||||
|
echo
|
||||||
|
echo " https://${KUBE_MASTER_IP}"
|
||||||
|
echo
|
||||||
|
echo "The user name and password to use is located in ~/.kubernetes_auth."
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
# Delete a kubernetes cluster
|
||||||
|
function kube-down {
|
||||||
|
echo "Bringing down cluster"
|
||||||
|
|
||||||
|
set +e
|
||||||
|
azure_call vm delete $MASTER_NAME -b -q
|
||||||
|
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
||||||
|
azure_call vm delete ${MINION_NAMES[$i]} -b -q
|
||||||
|
done
|
||||||
|
|
||||||
|
wait
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update a kubernetes cluster with latest source
|
||||||
|
#function kube-push {
|
||||||
|
# detect-project
|
||||||
|
# detect-master
|
||||||
|
|
||||||
|
# Make sure we have the tar files staged on Azure Storage
|
||||||
|
# find-release-tars
|
||||||
|
# upload-server-tars
|
||||||
|
|
||||||
|
# (
|
||||||
|
# echo "#! /bin/bash"
|
||||||
|
# echo "mkdir -p /var/cache/kubernetes-install"
|
||||||
|
# echo "cd /var/cache/kubernetes-install"
|
||||||
|
# echo "readonly SERVER_BINARY_TAR_URL='${SERVER_BINARY_TAR_URL}'"
|
||||||
|
# echo "readonly SALT_TAR_URL='${SALT_TAR_URL}'"
|
||||||
|
# grep -v "^#" "${KUBE_ROOT}/cluster/azure/templates/common.sh"
|
||||||
|
# grep -v "^#" "${KUBE_ROOT}/cluster/azure/templates/download-release.sh"
|
||||||
|
# echo "echo Executing configuration"
|
||||||
|
# echo "sudo salt '*' mine.update"
|
||||||
|
# echo "sudo salt --force-color '*' state.highstate"
|
||||||
|
# ) | gcutil ssh --project "$PROJECT" --zone "$ZONE" "$KUBE_MASTER" sudo bash
|
||||||
|
|
||||||
|
# get-password
|
||||||
|
|
||||||
|
# echo
|
||||||
|
# echo "Kubernetes cluster is running. The master is running at:"
|
||||||
|
# echo
|
||||||
|
# echo " https://${KUBE_MASTER_IP}"
|
||||||
|
# echo
|
||||||
|
# echo "The user name and password to use is located in ~/.kubernetes_auth."
|
||||||
|
# echo
|
||||||
|
|
||||||
|
#}
|
||||||
|
|
||||||
|
# -----------------------------------------------------------------------------
|
||||||
|
# Cluster specific test helpers used from hack/e2e-test.sh
|
||||||
|
|
||||||
|
# Execute prior to running tests to build a release if required for env.
|
||||||
|
#
|
||||||
|
# Assumed Vars:
|
||||||
|
# KUBE_ROOT
|
||||||
|
function test-build-release {
|
||||||
|
# Make a release
|
||||||
|
"${KUBE_ROOT}/build/release.sh"
|
||||||
|
}
|
||||||
|
|
||||||
|
# SSH to a node by name ($1) and run a command ($2).
|
||||||
|
function ssh-to-node {
|
||||||
|
local node="$1"
|
||||||
|
local cmd="$2"
|
||||||
|
ssh --ssh_arg "-o LogLevel=quiet" "${node}" "${cmd}"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Restart the kube-proxy on a node ($1)
|
||||||
|
function restart-kube-proxy {
|
||||||
|
ssh-to-node "$1" "sudo /etc/init.d/kube-proxy restart"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Setup monitoring using heapster and InfluxDB
|
||||||
|
function setup-monitoring {
|
||||||
|
echo "not implemented" >/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
function teardown-monitoring {
|
||||||
|
echo "not implemented" >/dev/null
|
||||||
|
}
|
@ -5,6 +5,9 @@
|
|||||||
{% if grains.cloud == 'aws' %}
|
{% if grains.cloud == 'aws' %}
|
||||||
{% set cert_ip='_use_aws_external_ip_' %}
|
{% set cert_ip='_use_aws_external_ip_' %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if grains.cloud == 'azure' %}
|
||||||
|
{% set cert_ip='_use_azure_dns_name_' %}
|
||||||
|
{% endif %}
|
||||||
{% if grains.cloud == 'vagrant' %}
|
{% if grains.cloud == 'vagrant' %}
|
||||||
{% set cert_ip=grains.ip_interfaces.eth1[0] %}
|
{% set cert_ip=grains.ip_interfaces.eth1[0] %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
@ -24,6 +24,8 @@ cert_group=kube-cert
|
|||||||
|
|
||||||
mkdir -p "$cert_dir"
|
mkdir -p "$cert_dir"
|
||||||
|
|
||||||
|
use_cn=false
|
||||||
|
|
||||||
# TODO: Add support for discovery on other providers?
|
# TODO: Add support for discovery on other providers?
|
||||||
if [ "$cert_ip" == "_use_gce_external_ip_" ]; then
|
if [ "$cert_ip" == "_use_gce_external_ip_" ]; then
|
||||||
cert_ip=$(curl -s -H Metadata-Flavor:Google http://metadata.google.internal./computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip)
|
cert_ip=$(curl -s -H Metadata-Flavor:Google http://metadata.google.internal./computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip)
|
||||||
@ -33,6 +35,11 @@ if [ "$cert_ip" == "_use_aws_external_ip_" ]; then
|
|||||||
cert_ip=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)
|
cert_ip=$(curl -s http://169.254.169.254/latest/meta-data/public-ipv4)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ "$cert_ip" == "_use_azure_dns_name_" ]; then
|
||||||
|
cert_ip=$(hostname -f | awk -F. '{ print $2 }').cloudapp.net
|
||||||
|
use_cn=true
|
||||||
|
fi
|
||||||
|
|
||||||
tmpdir=$(mktemp -d --tmpdir kubernetes_cacert.XXXXXX)
|
tmpdir=$(mktemp -d --tmpdir kubernetes_cacert.XXXXXX)
|
||||||
trap 'rm -rf "${tmpdir}"' EXIT
|
trap 'rm -rf "${tmpdir}"' EXIT
|
||||||
cd "${tmpdir}"
|
cd "${tmpdir}"
|
||||||
@ -55,10 +62,16 @@ tar xzf easy-rsa.tar.gz > /dev/null 2>&1
|
|||||||
cd easy-rsa-master/easyrsa3
|
cd easy-rsa-master/easyrsa3
|
||||||
./easyrsa init-pki > /dev/null 2>&1
|
./easyrsa init-pki > /dev/null 2>&1
|
||||||
./easyrsa --batch build-ca nopass > /dev/null 2>&1
|
./easyrsa --batch build-ca nopass > /dev/null 2>&1
|
||||||
./easyrsa --subject-alt-name=IP:$cert_ip build-server-full kubernetes-master nopass > /dev/null 2>&1
|
if [ $use_cn = "true" ]; then
|
||||||
|
./easyrsa build-server-full $cert_ip nopass > /dev/null 2>&1
|
||||||
|
cp -p pki/issued/$cert_ip.crt "${cert_dir}/server.cert" > /dev/null 2>&1
|
||||||
|
cp -p pki/private/$cert_ip.key "${cert_dir}/server.key" > /dev/null 2>&1
|
||||||
|
else
|
||||||
|
./easyrsa --subject-alt-name=IP:$cert_ip build-server-full kubernetes-master nopass > /dev/null 2>&1
|
||||||
|
cp -p pki/issued/kubernetes-master.crt "${cert_dir}/server.cert" > /dev/null 2>&1
|
||||||
|
cp -p pki/private/kubernetes-master.key "${cert_dir}/server.key" > /dev/null 2>&1
|
||||||
|
fi
|
||||||
./easyrsa build-client-full kubecfg nopass > /dev/null 2>&1
|
./easyrsa build-client-full kubecfg nopass > /dev/null 2>&1
|
||||||
cp -p pki/issued/kubernetes-master.crt "${cert_dir}/server.cert" > /dev/null 2>&1
|
|
||||||
cp -p pki/private/kubernetes-master.key "${cert_dir}/server.key" > /dev/null 2>&1
|
|
||||||
cp -p pki/ca.crt "${cert_dir}/ca.crt"
|
cp -p pki/ca.crt "${cert_dir}/ca.crt"
|
||||||
cp -p pki/issued/kubecfg.crt "${cert_dir}/kubecfg.crt"
|
cp -p pki/issued/kubecfg.crt "${cert_dir}/kubecfg.crt"
|
||||||
cp -p pki/private/kubecfg.key "${cert_dir}/kubecfg.key"
|
cp -p pki/private/kubecfg.key "${cert_dir}/kubecfg.key"
|
||||||
|
@ -1,30 +1,24 @@
|
|||||||
# WARNING
|
|
||||||
These instructions are broken at git HEAD. Please either:
|
|
||||||
* Sync back to `v0.3` with `git checkout v0.3`
|
|
||||||
* Download a [snapshot of `v0.3`](https://github.com/GoogleCloudPlatform/kubernetes/archive/v0.3.tar.gz)
|
|
||||||
|
|
||||||
## Getting started on Microsoft Azure
|
## Getting started on Microsoft Azure
|
||||||
|
|
||||||
### Prerequisites
|
### Azure Prerequisites
|
||||||
|
|
||||||
1. You need an Azure account. Visit http://azure.microsoft.com/ to get started.
|
1. You need an Azure account. Visit http://azure.microsoft.com/ to get started.
|
||||||
2. Install and configure the Azure cross-platform command-line interface. http://azure.microsoft.com/en-us/documentation/articles/xplat-cli/
|
2. Install and configure the Azure cross-platform command-line interface. http://azure.microsoft.com/en-us/documentation/articles/xplat-cli/
|
||||||
3. Make sure you have a default account set in the Azure cli, using `azure account set`
|
3. Make sure you have a default account set in the Azure cli, using `azure account set`
|
||||||
4. You must have Go (version 1.2 or later) installed: [www.golang.org](http://www.golang.org).
|
|
||||||
5. Get the Kubernetes source:
|
|
||||||
|
|
||||||
git clone https://github.com/GoogleCloudPlatform/kubernetes.git
|
### Prerequisites for your workstation
|
||||||
|
|
||||||
|
1. Be running a Linux or Mac OS X.
|
||||||
|
2. Get or build a [binary release](binary_release.md)
|
||||||
|
3. If you want to build your own release, you need to have [Docker
|
||||||
|
installed](https://docs.docker.com/installation/). On Mac OS X you can use
|
||||||
|
boot2docker.
|
||||||
|
|
||||||
### Setup
|
### Setup
|
||||||
The cluster setup scripts can setup Kubernetes for multiple targets. First modify `cluster/kube-env.sh` to specify azure:
|
The cluster setup scripts can setup Kubernetes for multiple targets. First modify `cluster/kube-env.sh` to specify azure:
|
||||||
|
|
||||||
KUBERNETES_PROVIDER="azure"
|
KUBERNETES_PROVIDER="azure"
|
||||||
|
|
||||||
Next build Kubernetes, package the release, and upload to Azure Storage:
|
|
||||||
|
|
||||||
cd kubernetes
|
|
||||||
release/azure/release.sh
|
|
||||||
|
|
||||||
Next, specify an existing virtual network in `cluster/azure/config-defualt.sh`:
|
Next, specify an existing virtual network in `cluster/azure/config-defualt.sh`:
|
||||||
|
|
||||||
AZ_VNET=<vnet name>
|
AZ_VNET=<vnet name>
|
||||||
@ -35,16 +29,15 @@ You can then use the `cluster/kube-*.sh` scripts to manage your azure cluster, s
|
|||||||
|
|
||||||
cluster/kube-up.sh
|
cluster/kube-up.sh
|
||||||
|
|
||||||
|
The script above will start (by default) a single master VM along with 4 worker VMs. You
|
||||||
|
can tweak some of these parameters by editing `cluster/azure/config-default.sh`.
|
||||||
|
|
||||||
### Running a container (simple version)
|
### Running a container (simple version)
|
||||||
|
|
||||||
Once you have your instances up and running, the `hack/build-go.sh` script sets up
|
The `cluster/kubecfg.sh` command below spins up two containers, running [Nginx](http://nginx.org/en/) and with port 80 mapped to 8080:
|
||||||
your Go workspace and builds the Go components.
|
|
||||||
|
|
||||||
The `cluster/kubecfg.sh` script spins up two containers, running [Nginx](http://nginx.org/en/) and with port 80 mapped to 8080:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
cd kubernetes
|
cd kubernetes
|
||||||
hack/build-go.sh
|
|
||||||
cluster/kubecfg.sh -p 8080:80 run dockerfile/nginx 2 myNginx
|
cluster/kubecfg.sh -p 8080:80 run dockerfile/nginx 2 myNginx
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -1,294 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright 2014 Google Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
SCRIPT_DIR=$(CDPATH="" cd $(dirname $0); pwd)
|
|
||||||
|
|
||||||
# Use the config file specified in $KUBE_CONFIG_FILE, or default to
|
|
||||||
# config-default.sh.
|
|
||||||
source ${SCRIPT_DIR}/azure/${KUBE_CONFIG_FILE-"config-default.sh"}
|
|
||||||
|
|
||||||
function detect-minions () {
|
|
||||||
ssh_ports=($(eval echo "2200{1..$NUM_MINIONS}"))
|
|
||||||
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
|
||||||
MINION_NAMES[$i]=$(ssh -i $AZ_SSH_KEY -p ${ssh_ports[$i]} $AZ_CS.cloudapp.net hostname -f)
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
function detect-master () {
|
|
||||||
KUBE_MASTER_IP=${AZ_CS}.cloudapp.net
|
|
||||||
echo "Using master: $KUBE_MASTER (external IP: $KUBE_MASTER_IP)"
|
|
||||||
}
|
|
||||||
|
|
||||||
function get-password {
|
|
||||||
file=${HOME}/.kubernetes_auth
|
|
||||||
if [ -e ${file} ]; then
|
|
||||||
user=$(cat $file | python -c 'import json,sys;print json.load(sys.stdin)["User"]')
|
|
||||||
passwd=$(cat $file | python -c 'import json,sys;print json.load(sys.stdin)["Password"]')
|
|
||||||
return
|
|
||||||
fi
|
|
||||||
user=admin
|
|
||||||
passwd=$(python -c 'import string,random; print "".join(random.SystemRandom().choice(string.ascii_letters + string.digits) for _ in range(16))')
|
|
||||||
|
|
||||||
# Store password for reuse.
|
|
||||||
cat << EOF > ~/.kubernetes_auth
|
|
||||||
{
|
|
||||||
"User": "$user",
|
|
||||||
"Password": "$passwd"
|
|
||||||
}
|
|
||||||
EOF
|
|
||||||
chmod 0600 ~/.kubernetes_auth
|
|
||||||
}
|
|
||||||
|
|
||||||
# Verify prereqs
|
|
||||||
function verify-prereqs {
|
|
||||||
echo "OK"
|
|
||||||
# Already done in sourcing config-default, which sources
|
|
||||||
# release/azure/config.sh
|
|
||||||
}
|
|
||||||
|
|
||||||
# Instantiate a kubernetes cluster
|
|
||||||
function kube-up {
|
|
||||||
KUBE_TEMP=$(mktemp -d -t kubernetes.XXXXXX)
|
|
||||||
trap "rm -rf ${KUBE_TEMP}" EXIT
|
|
||||||
|
|
||||||
get-password
|
|
||||||
python $SCRIPT_DIR/../third_party/htpasswd/htpasswd.py -b -c \
|
|
||||||
${KUBE_TEMP}/htpasswd $user $passwd
|
|
||||||
HTPASSWD=$(cat ${KUBE_TEMP}/htpasswd)
|
|
||||||
|
|
||||||
# Generate openvpn certs
|
|
||||||
echo 01 > ${KUBE_TEMP}/ca.srl
|
|
||||||
openssl genrsa -out ${KUBE_TEMP}/ca.key
|
|
||||||
openssl req -new -x509 -days 1095 \
|
|
||||||
-key ${KUBE_TEMP}/ca.key \
|
|
||||||
-out ${KUBE_TEMP}/ca.crt \
|
|
||||||
-subj "/CN=openvpn-ca"
|
|
||||||
openssl genrsa -out ${KUBE_TEMP}/server.key
|
|
||||||
openssl req -new \
|
|
||||||
-key ${KUBE_TEMP}/server.key \
|
|
||||||
-out ${KUBE_TEMP}/server.csr \
|
|
||||||
-subj "/CN=server"
|
|
||||||
openssl x509 -req -days 1095 \
|
|
||||||
-in ${KUBE_TEMP}/server.csr \
|
|
||||||
-CA ${KUBE_TEMP}/ca.crt \
|
|
||||||
-CAkey ${KUBE_TEMP}/ca.key \
|
|
||||||
-CAserial ${KUBE_TEMP}/ca.srl \
|
|
||||||
-out ${KUBE_TEMP}/server.crt
|
|
||||||
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
|
||||||
openssl genrsa -out ${KUBE_TEMP}/${MINION_NAMES[$i]}.key
|
|
||||||
openssl req -new \
|
|
||||||
-key ${KUBE_TEMP}/${MINION_NAMES[$i]}.key \
|
|
||||||
-out ${KUBE_TEMP}/${MINION_NAMES[$i]}.csr \
|
|
||||||
-subj "/CN=${MINION_NAMES[$i]}"
|
|
||||||
openssl x509 -req -days 1095 \
|
|
||||||
-in ${KUBE_TEMP}/${MINION_NAMES[$i]}.csr \
|
|
||||||
-CA ${KUBE_TEMP}/ca.crt \
|
|
||||||
-CAkey ${KUBE_TEMP}/ca.key \
|
|
||||||
-CAserial ${KUBE_TEMP}/ca.srl \
|
|
||||||
-out ${KUBE_TEMP}/${MINION_NAMES[$i]}.crt
|
|
||||||
done
|
|
||||||
|
|
||||||
# Build up start up script for master
|
|
||||||
(
|
|
||||||
echo "#!/bin/bash"
|
|
||||||
echo "MASTER_NAME=${MASTER_NAME}"
|
|
||||||
echo "MASTER_RELEASE_TAR=${FULL_URL}"
|
|
||||||
echo "MASTER_HTPASSWD='${HTPASSWD}'"
|
|
||||||
echo "CA_CRT=\"$(cat ${KUBE_TEMP}/ca.crt)\""
|
|
||||||
echo "SERVER_CRT=\"$(cat ${KUBE_TEMP}/server.crt)\""
|
|
||||||
echo "SERVER_KEY=\"$(cat ${KUBE_TEMP}/server.key)\""
|
|
||||||
grep -v "^#" $SCRIPT_DIR/azure/templates/download-release.sh
|
|
||||||
grep -v "^#" $SCRIPT_DIR/azure/templates/salt-master.sh
|
|
||||||
) > ${KUBE_TEMP}/master-start.sh
|
|
||||||
|
|
||||||
echo "Starting VMs"
|
|
||||||
|
|
||||||
if [ ! -f $AZ_SSH_KEY ]; then
|
|
||||||
ssh-keygen -f $AZ_SSH_KEY -N ''
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ ! -f $AZ_SSH_CERT ]; then
|
|
||||||
openssl req -new -x509 -days 1095 -key $AZ_SSH_KEY -out $AZ_SSH_CERT \
|
|
||||||
-subj "/CN=azure-ssh-key"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$(azure network vnet show $AZ_VNET 2>/dev/null | grep data)" ]; then
|
|
||||||
#azure network vnet create with $AZ_SUBNET
|
|
||||||
#FIXME not working
|
|
||||||
echo error create vnet $AZ_VNET with subnet $AZ_SUBNET
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
azure vm create \
|
|
||||||
-w $AZ_VNET \
|
|
||||||
-n $MASTER_NAME \
|
|
||||||
-l "$AZ_LOCATION" \
|
|
||||||
-t $AZ_SSH_CERT \
|
|
||||||
-e 22000 -P \
|
|
||||||
-d ${KUBE_TEMP}/master-start.sh \
|
|
||||||
-b $AZ_SUBNET \
|
|
||||||
$AZ_CS $AZ_IMAGE $USER
|
|
||||||
|
|
||||||
ssh_ports=($(eval echo "2200{1..$NUM_MINIONS}"))
|
|
||||||
|
|
||||||
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
|
||||||
(
|
|
||||||
echo "#!/bin/bash"
|
|
||||||
echo "MASTER_NAME=${MASTER_NAME}"
|
|
||||||
echo "MINION_IP_RANGE=${MINION_IP_RANGES[$i]}"
|
|
||||||
echo "CA_CRT=\"$(cat ${KUBE_TEMP}/ca.crt)\""
|
|
||||||
echo "CLIENT_CRT=\"$(cat ${KUBE_TEMP}/${MINION_NAMES[$i]}.crt)\""
|
|
||||||
echo "CLIENT_KEY=\"$(cat ${KUBE_TEMP}/${MINION_NAMES[$i]}.key)\""
|
|
||||||
grep -v "^#" $SCRIPT_DIR/azure/templates/salt-minion.sh
|
|
||||||
) > ${KUBE_TEMP}/minion-start-${i}.sh
|
|
||||||
|
|
||||||
azure vm create \
|
|
||||||
-c -w $AZ_VNET \
|
|
||||||
-n ${MINION_NAMES[$i]} \
|
|
||||||
-l "$AZ_LOCATION" \
|
|
||||||
-t $AZ_SSH_CERT \
|
|
||||||
-e ${ssh_ports[$i]} -P \
|
|
||||||
-d ${KUBE_TEMP}/minion-start-${i}.sh \
|
|
||||||
-b $AZ_SUBNET \
|
|
||||||
$AZ_CS $AZ_IMAGE $USER
|
|
||||||
done
|
|
||||||
|
|
||||||
azure vm endpoint create $MASTER_NAME 443
|
|
||||||
|
|
||||||
echo "Waiting for cluster initialization."
|
|
||||||
echo
|
|
||||||
echo " This will continually check to see if the API for kubernetes is reachable."
|
|
||||||
echo " This might loop forever if there was some uncaught error during start"
|
|
||||||
echo " up."
|
|
||||||
echo
|
|
||||||
|
|
||||||
until $(curl --insecure --user ${user}:${passwd} --max-time 5 \
|
|
||||||
--fail --output /dev/null --silent https://$AZ_CS.cloudapp.net/api/v1beta1/pods); do
|
|
||||||
printf "."
|
|
||||||
sleep 2
|
|
||||||
done
|
|
||||||
|
|
||||||
# Basic sanity checking
|
|
||||||
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
|
||||||
# Make sure docker is installed
|
|
||||||
ssh -i $AZ_SSH_KEY -p ${ssh_ports[$i]} $AZ_CS.cloudapp.net which docker > /dev/null
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
echo "Docker failed to install on ${MINION_NAMES[$i]}. Your cluster is unlikely to work correctly."
|
|
||||||
echo "Please run ./cluster/kube-down.sh and re-create the cluster. (sorry!)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Make sure the kubelet is running
|
|
||||||
ssh -i $AZ_SSH_KEY -p ${ssh_ports[$i]} $AZ_CS.cloudapp.net /etc/init.d/kubelet status
|
|
||||||
if [ "$?" != "0" ]; then
|
|
||||||
echo "Kubelet failed to install on ${MINION_NAMES[$i]}. Your cluster is unlikely to work correctly."
|
|
||||||
echo "Please run ./cluster/kube-down.sh and re-create the cluster. (sorry!)"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "Kubernetes cluster is running. The master is running at:"
|
|
||||||
echo
|
|
||||||
echo " https://$AZ_CS.cloudapp.net"
|
|
||||||
echo
|
|
||||||
echo "The user name and password to use is located in ~/.kubernetes_auth."
|
|
||||||
echo
|
|
||||||
echo "Security note: The server above uses a self signed certificate. This is"
|
|
||||||
echo " subject to \"Man in the middle\" type attacks."
|
|
||||||
echo
|
|
||||||
}
|
|
||||||
|
|
||||||
# Delete a kubernetes cluster
|
|
||||||
function kube-down {
|
|
||||||
echo "Bringing down cluster"
|
|
||||||
set +e
|
|
||||||
azure vm delete $MASTER_NAME -b -q
|
|
||||||
for (( i=0; i<${#MINION_NAMES[@]}; i++)); do
|
|
||||||
azure vm delete ${MINION_NAMES[$i]} -b -q
|
|
||||||
done
|
|
||||||
}
|
|
||||||
|
|
||||||
# # Update a kubernetes cluster with latest source
|
|
||||||
# function kube-push {
|
|
||||||
|
|
||||||
# # Find the release to use. Generally it will be passed when doing a 'prod'
|
|
||||||
# # install and will default to the release/config.sh version when doing a
|
|
||||||
# # developer up.
|
|
||||||
# find-release $1
|
|
||||||
|
|
||||||
# # Detect the project into $PROJECT
|
|
||||||
# detect-master
|
|
||||||
|
|
||||||
# (
|
|
||||||
# echo MASTER_RELEASE_TAR=$RELEASE_NORMALIZED/master-release.tgz
|
|
||||||
# grep -v "^#" $(dirname $0)/templates/download-release.sh
|
|
||||||
# echo "echo Executing configuration"
|
|
||||||
# echo "sudo salt '*' mine.update"
|
|
||||||
# echo "sudo salt --force-color '*' state.highstate"
|
|
||||||
# ) | gcutil ssh --project ${PROJECT} --zone ${ZONE} $KUBE_MASTER bash
|
|
||||||
|
|
||||||
# get-password
|
|
||||||
|
|
||||||
# echo "Kubernetes cluster is updated. The master is running at:"
|
|
||||||
# echo
|
|
||||||
# echo " https://${KUBE_MASTER_IP}"
|
|
||||||
# echo
|
|
||||||
# echo "The user name and password to use is located in ~/.kubernetes_auth."
|
|
||||||
# echo
|
|
||||||
# echo "Security note: The server above uses a self signed certificate. This is"
|
|
||||||
# echo " subject to \"Man in the middle\" type attacks."
|
|
||||||
# echo
|
|
||||||
# }
|
|
||||||
|
|
||||||
# # Execute prior to running tests to build a release if required for env
|
|
||||||
# function test-build-release {
|
|
||||||
# # Build source
|
|
||||||
# ${KUBE_REPO_ROOT}/hack/build-go.sh
|
|
||||||
# # Make a release
|
|
||||||
# $(dirname $0)/../release/release.sh
|
|
||||||
# }
|
|
||||||
|
|
||||||
# # Execute prior to running tests to initialize required structure
|
|
||||||
# function test-setup {
|
|
||||||
|
|
||||||
# # Detect the project into $PROJECT if it isn't set
|
|
||||||
# # gce specific
|
|
||||||
# detect-project
|
|
||||||
|
|
||||||
# if [[ ${ALREADY_UP} -ne 1 ]]; then
|
|
||||||
# # Open up port 80 & 8080 so common containers on minions can be reached
|
|
||||||
# gcutil addfirewall \
|
|
||||||
# --norespect_terminal_width \
|
|
||||||
# --project ${PROJECT} \
|
|
||||||
# --target_tags ${MINION_TAG} \
|
|
||||||
# --allowed tcp:80,tcp:8080 \
|
|
||||||
# --network ${NETWORK} \
|
|
||||||
# ${MINION_TAG}-${INSTANCE_PREFIX}-http-alt
|
|
||||||
# fi
|
|
||||||
|
|
||||||
# }
|
|
||||||
|
|
||||||
# # Execute after running tests to perform any required clean-up
|
|
||||||
# function test-teardown {
|
|
||||||
# echo "Shutting down test cluster in background."
|
|
||||||
# gcutil deletefirewall \
|
|
||||||
# --project ${PROJECT} \
|
|
||||||
# --norespect_terminal_width \
|
|
||||||
# --force \
|
|
||||||
# ${MINION_TAG}-${INSTANCE_PREFIX}-http-alt || true > /dev/null
|
|
||||||
# $(dirname $0)/../cluster/kube-down.sh > /dev/null
|
|
||||||
# }
|
|
@ -1,40 +0,0 @@
|
|||||||
# Copyright 2014 Google Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
INSTANCE_PREFIX=kubenertes
|
|
||||||
AZ_LOCATION='West US'
|
|
||||||
TAG=testing
|
|
||||||
|
|
||||||
if [ -z "$(which azure)" ]; then
|
|
||||||
echo "Couldn't find azure in PATH"
|
|
||||||
echo " please install with 'npm install azure-cli'"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -z "$(azure account list | grep true)" ]; then
|
|
||||||
echo "Default azure account not set"
|
|
||||||
echo " please set with 'azure account set'"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
account=$(azure account list | grep true | awk '{ print $2 }')
|
|
||||||
if which md5 > /dev/null 2>&1; then
|
|
||||||
AZ_HSH=$(md5 -q -s $account)
|
|
||||||
else
|
|
||||||
AZ_HSH=$(echo -n "$account" | md5sum)
|
|
||||||
fi
|
|
||||||
AZ_HSH=${AZ_HSH:0:7}
|
|
||||||
AZ_STG=kube$AZ_HSH
|
|
||||||
CONTAINER=kube-$TAG
|
|
||||||
FULL_URL="https://${AZ_STG}.blob.core.windows.net/$CONTAINER/master-release.tgz"
|
|
@ -1,63 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Copyright 2014 Google Inc. All rights reserved.
|
|
||||||
#
|
|
||||||
# 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.
|
|
||||||
|
|
||||||
# This script will build and release Kubernetes.
|
|
||||||
|
|
||||||
set -eu
|
|
||||||
set -o pipefail
|
|
||||||
IFS=$'\n\t'
|
|
||||||
SCRIPT_DIR=$(CDPATH="" cd $(dirname $0); pwd)
|
|
||||||
|
|
||||||
function json_val () {
|
|
||||||
python -c 'import json,sys;obj=json.load(sys.stdin);print obj'$1'';
|
|
||||||
}
|
|
||||||
|
|
||||||
source $SCRIPT_DIR/config.sh
|
|
||||||
|
|
||||||
$SCRIPT_DIR/../build-release.sh $INSTANCE_PREFIX
|
|
||||||
|
|
||||||
if [ -z "$(azure storage account show $AZ_STG 2>/dev/null | \
|
|
||||||
grep data)" ]; then
|
|
||||||
azure storage account create -l "$AZ_LOCATION" $AZ_STG
|
|
||||||
fi
|
|
||||||
|
|
||||||
stg_key=$(azure storage account keys list $AZ_STG --json | \
|
|
||||||
json_val '["primaryKey"]')
|
|
||||||
|
|
||||||
if [ -z "$(azure storage container show -a $AZ_STG -k "$stg_key" \
|
|
||||||
$CONTAINER 2>/dev/null | grep data)" ]; then
|
|
||||||
azure storage container create \
|
|
||||||
-a $AZ_STG \
|
|
||||||
-k "$stg_key" \
|
|
||||||
-p Blob \
|
|
||||||
$CONTAINER
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ -n "$(azure storage blob show -a $AZ_STG -k "$stg_key" \
|
|
||||||
$CONTAINER master-release.tgz 2>/dev/null | grep data)" ]; then
|
|
||||||
azure storage blob delete \
|
|
||||||
-a $AZ_STG \
|
|
||||||
-k "$stg_key" \
|
|
||||||
$CONTAINER \
|
|
||||||
master-release.tgz
|
|
||||||
fi
|
|
||||||
|
|
||||||
azure storage blob upload \
|
|
||||||
-a $AZ_STG \
|
|
||||||
-k "$stg_key" \
|
|
||||||
$SCRIPT_DIR/../../_output/release/master-release.tgz \
|
|
||||||
$CONTAINER \
|
|
||||||
master-release.tgz
|
|
Loading…
Reference in New Issue
Block a user