mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-20 09:05:26 +00:00
OpenStack provider
- Create Kubernetes cluster on the top of OpenStack
This commit is contained in:
parent
c7b447b9fc
commit
840aa9c186
54
cluster/openstack/config-default.sh
Normal file
54
cluster/openstack/config-default.sh
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2015 The Kubernetes Authors 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.
|
||||||
|
|
||||||
|
## Contains configuration values for the Openstack cluster
|
||||||
|
|
||||||
|
# Stack name
|
||||||
|
STACK_NAME="KubernetesStack"
|
||||||
|
|
||||||
|
# Keypair for kubernetes stack
|
||||||
|
KUBERNETES_KEYPAIR_NAME="kubernetes_keypair"
|
||||||
|
|
||||||
|
# Kubernetes release tar file
|
||||||
|
KUBERNETES_RELEASE_TAR="kubernetes-server-linux-amd64.tar.gz"
|
||||||
|
|
||||||
|
NUMBER_OF_MINIONS="1"
|
||||||
|
|
||||||
|
MAX_NUMBER_OF_MINIONS="1"
|
||||||
|
|
||||||
|
MASTER_FLAVOR="m1.small"
|
||||||
|
|
||||||
|
MINION_FLAVOR="m1.small"
|
||||||
|
|
||||||
|
EXTERNAL_NETWORK="public"
|
||||||
|
|
||||||
|
SWIFT_SERVER_URL="http://192.168.123.100:8080"
|
||||||
|
|
||||||
|
# Flag indicates if new image must be created. If 'false' then image with IMAGE_ID will be used.
|
||||||
|
# If 'true' then new image will be created from file config-image.sh
|
||||||
|
CREATE_IMAGE="true" # use "true" for devstack
|
||||||
|
|
||||||
|
# Image id which will be used for kubernetes stack
|
||||||
|
IMAGE_ID="f0f394b1-5546-4b68-b2bc-8abe8a7e6b8b"
|
||||||
|
|
||||||
|
# DNS server address
|
||||||
|
DNS_SERVER="8.8.8.8"
|
||||||
|
|
||||||
|
# Public RSA key path
|
||||||
|
CLIENT_PUBLIC_KEY_PATH="~/.ssh/id_rsa.pub"
|
||||||
|
|
||||||
|
# Max time period for stack provisioning. Time in minutes.
|
||||||
|
STACK_CREATE_TIMEOUT=60
|
32
cluster/openstack/config-image.sh
Normal file
32
cluster/openstack/config-image.sh
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2015 The Kubernetes Authors 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.
|
||||||
|
|
||||||
|
## Contains configuration values for new image. It is skip when CREATE_IMAGE=false
|
||||||
|
|
||||||
|
# Image name which will be displayed in OpenStack
|
||||||
|
OPENSTACK_IMAGE_NAME="CentOS7"
|
||||||
|
|
||||||
|
# Downloaded image name for Openstack project
|
||||||
|
IMAGE_FILE="CentOS-7-x86_64-GenericCloud-1510.qcow2"
|
||||||
|
|
||||||
|
# Absolute path where image file is stored.
|
||||||
|
IMAGE_PATH="/home/openstack/openstack_temp"
|
||||||
|
|
||||||
|
# The disk format of the image. Acceptable formats are ami, ari, aki, vhd, vmdk, raw, qcow2, vdi, and iso.
|
||||||
|
IMAGE_FORMAT="qcow2"
|
||||||
|
|
||||||
|
# The container format of the image. Acceptable formats are ami, ari, aki, bare, docker, and ovf.
|
||||||
|
CONTAINER_FORMAT="bare"
|
24
cluster/openstack/openrc-default.sh
Normal file
24
cluster/openstack/openrc-default.sh
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2015 The Kubernetes Authors 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.
|
||||||
|
|
||||||
|
## Enviroment variables for the OpenStack command-line client
|
||||||
|
|
||||||
|
export OS_IDENTITY_API_VERSION=2.0
|
||||||
|
export OS_USERNAME=admin
|
||||||
|
export OS_PASSWORD=secretsecret
|
||||||
|
export OS_AUTH_URL=http://192.168.123.100:5000/v2.0
|
||||||
|
export OS_TENANT_NAME=admin
|
||||||
|
export OS_TENANT_ID=ed51b98b40944d89a449592eb67431eb
|
26
cluster/openstack/openrc-swift.sh
Normal file
26
cluster/openstack/openrc-swift.sh
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
# Copyright 2015 The Kubernetes Authors 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.
|
||||||
|
|
||||||
|
## Enviroment variables for the OpenStack Swift command-line client. This is required for CityCloud
|
||||||
|
## provider where Swift has different credentials. When Swift is part of your OpenStack use the same
|
||||||
|
## settings as in openrc-default.sh
|
||||||
|
|
||||||
|
export OS_IDENTITY_API_VERSION=2.0
|
||||||
|
export OS_USERNAME=admin
|
||||||
|
export OS_PASSWORD=secretsecret
|
||||||
|
export OS_AUTH_URL=http://192.168.123.100:5000/v2.0
|
||||||
|
export OS_TENANT_NAME=admin
|
||||||
|
export OS_TENANT_ID=ed51b98b40944d89a449592eb67431eb
|
232
cluster/openstack/util.sh
Normal file
232
cluster/openstack/util.sh
Normal file
@ -0,0 +1,232 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Copyright 2015 The Kubernetes Authors 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 that each provider hosting Kubernetes must implement to use cluster/kube-*.sh scripts.
|
||||||
|
|
||||||
|
# exit on any error
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Use the config file specified in $KUBE_CONFIG_FILE, or default to
|
||||||
|
# config-default.sh.
|
||||||
|
KUBE_ROOT=$(dirname "${BASH_SOURCE}")/../..
|
||||||
|
readonly ROOT=$(dirname "${BASH_SOURCE}")
|
||||||
|
source "${ROOT}/${KUBE_CONFIG_FILE:-"config-default.sh"}"
|
||||||
|
source "$KUBE_ROOT/cluster/common.sh"
|
||||||
|
if [ $CREATE_IMAGE = true ]; then
|
||||||
|
source "${ROOT}/config-image.sh"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Verify prereqs on host machine
|
||||||
|
function verify-prereqs() {
|
||||||
|
# Check the OpenStack command-line clients
|
||||||
|
for client in swift glance nova heat;
|
||||||
|
do
|
||||||
|
if which $client >/dev/null 2>&1; then
|
||||||
|
echo "$client client installed"
|
||||||
|
else
|
||||||
|
echo "$client client does not exist"
|
||||||
|
echo "Please install $client client, and retry."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Instantiate a kubernetes cluster
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# KUBERNETES_PROVIDER
|
||||||
|
function kube-up() {
|
||||||
|
echo "kube-up for provider $KUBERNETES_PROVIDER"
|
||||||
|
create-stack
|
||||||
|
}
|
||||||
|
|
||||||
|
# Periodically checks if cluster is created
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# STACK_CREATE_TIMEOUT
|
||||||
|
# STACK_NAME
|
||||||
|
function validate-cluster() {
|
||||||
|
|
||||||
|
while (( --$STACK_CREATE_TIMEOUT >= 0)) ;do
|
||||||
|
local status=$(heat stack-show "${STACK_NAME}" | awk '$2=="stack_status" {print $4}')
|
||||||
|
if [[ $status ]]; then
|
||||||
|
echo "Cluster status ${status}"
|
||||||
|
if [ $status = "CREATE_COMPLETE" ]; then
|
||||||
|
configure-kubectl
|
||||||
|
break
|
||||||
|
elif [ $status = "CREATE_FAILED" ]; then
|
||||||
|
echo "Cluster not created. Please check stack logs to find the problem"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Cluster not created. Please verify if process started correctly"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
sleep 60
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create stack
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# OPENSTACK
|
||||||
|
# OPENSTACK_TEMP
|
||||||
|
# DNS_SERVER
|
||||||
|
# OPENSTACK_IP
|
||||||
|
# OPENRC_FILE
|
||||||
|
function create-stack() {
|
||||||
|
echo "[INFO] Execute commands to create Kubernetes cluster"
|
||||||
|
# It is required for some cloud provider like CityCloud where swift client has different credentials
|
||||||
|
source "${ROOT}/openrc-swift.sh"
|
||||||
|
if [[ ! -v OS_PROJECT_ID ]]; then
|
||||||
|
SWIFT_PROJECT_ID="${OS_TENANT_ID}"
|
||||||
|
else
|
||||||
|
SWIFT_PROJECT_ID="${OS_PROJECT_ID}"
|
||||||
|
fi
|
||||||
|
upload-resources
|
||||||
|
source "${ROOT}/openrc-default.sh"
|
||||||
|
|
||||||
|
create-glance-image
|
||||||
|
|
||||||
|
add-keypair
|
||||||
|
run-heat-script
|
||||||
|
}
|
||||||
|
|
||||||
|
# Upload kubernetes release tars and heat templates.
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# ROOT
|
||||||
|
# KUBERNETES_RELEASE_TAR
|
||||||
|
function upload-resources() {
|
||||||
|
swift post kubernetes --read-acl '.r:*,.rlistings'
|
||||||
|
|
||||||
|
echo "[INFO] Upload ${KUBERNETES_RELEASE_TAR}"
|
||||||
|
swift upload kubernetes ${ROOT}/../../_output/release-tars/${KUBERNETES_RELEASE_TAR} \
|
||||||
|
--object-name kubernetes-server.tar.gz
|
||||||
|
|
||||||
|
echo "[INFO] Upload kubernetes-salt.tar.gz"
|
||||||
|
swift upload kubernetes ${ROOT}/../../_output/release-tars/kubernetes-salt.tar.gz \
|
||||||
|
--object-name kubernetes-salt.tar.gz
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a new key pair for use with servers.
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# KUBERNETES_KEYPAIR_NAME
|
||||||
|
# CLIENT_PUBLIC_KEY_PATH
|
||||||
|
function add-keypair() {
|
||||||
|
local status=$(nova keypair-show ${KUBERNETES_KEYPAIR_NAME})
|
||||||
|
if [[ ! $status ]]; then
|
||||||
|
nova keypair-add ${KUBERNETES_KEYPAIR_NAME} --pub-key ${CLIENT_PUBLIC_KEY_PATH}
|
||||||
|
echo "[INFO] Key pair created"
|
||||||
|
else
|
||||||
|
echo "[INFO] Key pair already exists"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a new glance image.
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# IMAGE_FILE
|
||||||
|
# IMAGE_PATH
|
||||||
|
# OPENSTACK_IMAGE_NAME
|
||||||
|
function create-glance-image() {
|
||||||
|
if [ $CREATE_IMAGE = true ]; then
|
||||||
|
local image_status=$(nova image-show ${OPENSTACK_IMAGE_NAME} | awk '$2=="id" {print $4}')
|
||||||
|
|
||||||
|
if [[ ! $image_status ]]; then
|
||||||
|
echo "[INFO] Create image ${OPENSTACK_IMAGE_NAME}"
|
||||||
|
glance image-create --name ${OPENSTACK_IMAGE_NAME} --disk-format ${IMAGE_FORMAT} \
|
||||||
|
--container-format ${CONTAINER_FORMAT} --file ${IMAGE_PATH}/${IMAGE_FILE}
|
||||||
|
else
|
||||||
|
echo "[INFO] Image ${OPENSTACK_IMAGE_NAME} already exists"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Create a new kubernetes stack.
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# STACK_NAME
|
||||||
|
# KUBERNETES_KEYPAIR_NAME
|
||||||
|
# DNS_SERVER
|
||||||
|
# SWIFT_SERVER_URL
|
||||||
|
# SWIFT_TENANT_ID
|
||||||
|
# OPENSTACK_IMAGE_NAME
|
||||||
|
# EXTERNAL_NETWORK
|
||||||
|
# IMAGE_ID
|
||||||
|
# MASTER_FLAVOR
|
||||||
|
# MINION_FLAVOR
|
||||||
|
# NUMBER_OF_MINIONS
|
||||||
|
# MAX_NUMBER_OF_MINIONS
|
||||||
|
# DNS_SERVER
|
||||||
|
# STACK_NAME
|
||||||
|
function run-heat-script() {
|
||||||
|
|
||||||
|
local stack_status=$(heat stack-show ${STACK_NAME})
|
||||||
|
local swift_repo_url="${SWIFT_SERVER_URL}/v1/AUTH_${SWIFT_PROJECT_ID}/kubernetes"
|
||||||
|
|
||||||
|
if [ $CREATE_IMAGE = true ]; then
|
||||||
|
echo "[INFO] Retrieve new image ID"
|
||||||
|
IMAGE_ID=$(nova image-show ${OPENSTACK_IMAGE_NAME} | awk '$2=="id" {print $4}')
|
||||||
|
echo "[INFO] Image Id $IMAGE_ID"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ! $stack_status ]]; then
|
||||||
|
echo "[INFO] Create stack ${STACK_NAME}"
|
||||||
|
(
|
||||||
|
cd ${ROOT}/kubernetes-heat
|
||||||
|
heat --api-timeout 60 stack-create \
|
||||||
|
-P external_network=${EXTERNAL_NETWORK} \
|
||||||
|
-P ssh_key_name=${KUBERNETES_KEYPAIR_NAME} \
|
||||||
|
-P server_image=${IMAGE_ID} \
|
||||||
|
-P master_flavor=${MASTER_FLAVOR} \
|
||||||
|
-P minion_flavor=${MINION_FLAVOR} \
|
||||||
|
-P number_of_minions=${NUMBER_OF_MINIONS} \
|
||||||
|
-P max_number_of_minions=${MAX_NUMBER_OF_MINIONS} \
|
||||||
|
-P dns_nameserver=${DNS_SERVER} \
|
||||||
|
-P kubernetes_salt_url=${swift_repo_url}/kubernetes-salt.tar.gz \
|
||||||
|
-P kubernetes_server_url=${swift_repo_url}/kubernetes-server.tar.gz \
|
||||||
|
--template-file kubecluster.yaml \
|
||||||
|
${STACK_NAME}
|
||||||
|
)
|
||||||
|
else
|
||||||
|
echo "[INFO] Stack ${STACK_NAME} already exists"
|
||||||
|
heat stack-show ${STACK_NAME}
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Configure kubectl.
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# STACK_NAME
|
||||||
|
function configure-kubectl() {
|
||||||
|
|
||||||
|
export KUBE_MASTER_IP=$(nova show "${STACK_NAME}"-master | awk '$3=="network" {print $6}')
|
||||||
|
export CONTEXT="openstack"
|
||||||
|
export KUBE_BEARER_TOKEN="TokenKubelet"
|
||||||
|
create-kubeconfig
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Delete a kubernetes cluster
|
||||||
|
#
|
||||||
|
# Assumed vars:
|
||||||
|
# STACK_NAME
|
||||||
|
function kube-down {
|
||||||
|
source "${ROOT}/openrc-default.sh"
|
||||||
|
heat stack-delete ${STACK_NAME}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user