2023-10-25 13:56:56 +02:00
|
|
|
#!/usr/bin/env bash
|
|
|
|
|
|
2023-11-20 17:48:26 +01:00
|
|
|
DEFAULT_NS="rook-ceph"
|
|
|
|
|
CLUSTER_FILES="common.yaml operator.yaml cluster-test.yaml cluster-on-pvc-minikube.yaml dashboard-external-http.yaml toolbox.yaml"
|
2023-11-23 13:48:39 +01:00
|
|
|
MONITORING_FILES="monitoring/prometheus.yaml monitoring/service-monitor.yaml monitoring/exporter-service-monitor.yaml monitoring/prometheus-service.yaml monitoring/rbac.yaml"
|
2023-11-03 18:21:51 +01:00
|
|
|
SCRIPT_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)
|
2024-01-08 15:01:57 +01:00
|
|
|
|
|
|
|
|
# Script arguments: new arguments must be added here (following the same format)
|
2024-01-24 13:39:45 +01:00
|
|
|
export MINIKUBE_NODES="${MINIKUBE_NODES:=1}" ## Specify the minikube number of nodes to create
|
|
|
|
|
export MINIKUBE_DISK_SIZE="${MINIKUBE_DISK_SIZE:=40g}" ## Specify the minikube disk size
|
|
|
|
|
export MINIKUBE_EXTRA_DISKS="${MINIKUBE_EXTRA_DISKS:=3}" ## Specify the minikube number of extra disks
|
2024-01-08 15:01:57 +01:00
|
|
|
export ROOK_PROFILE_NAME="${ROOK_PROFILE_NAME:=rook}" ## Specify the minikube profile name
|
|
|
|
|
export ROOK_CLUSTER_NS="${ROOK_CLUSTER_NS:=$DEFAULT_NS}" ## CephCluster namespace
|
|
|
|
|
export ROOK_OPERATOR_NS="${ROOK_OPERATOR_NS:=$DEFAULT_NS}" ## Rook operator namespace (if different from CephCluster namespace)
|
2024-01-12 11:52:40 +01:00
|
|
|
export ROOK_EXAMPLES_DIR="${ROOK_EXAMPLES_DIR:="$SCRIPT_ROOT"/../../deploy/examples}" ## Path to Rook examples directory (i.e github.com/rook/rook/deploy/examples)
|
2024-01-08 15:01:57 +01:00
|
|
|
export ROOK_CLUSTER_SPEC_FILE="${ROOK_CLUSTER_SPEC_FILE:=cluster-test.yaml}" ## CephCluster manifest file
|
2023-11-07 17:58:47 +01:00
|
|
|
|
|
|
|
|
init_vars(){
|
2023-11-30 16:03:57 +01:00
|
|
|
MINIKUBE="minikube --profile $ROOK_PROFILE_NAME"
|
2023-11-07 17:58:47 +01:00
|
|
|
KUBECTL="$MINIKUBE kubectl --"
|
2023-11-30 16:03:57 +01:00
|
|
|
|
2024-01-08 15:01:57 +01:00
|
|
|
echo "Using '$(realpath "$ROOK_EXAMPLES_DIR")' as examples directory.."
|
2023-11-30 16:03:57 +01:00
|
|
|
echo "Using '$ROOK_CLUSTER_SPEC_FILE' as cluster spec file.."
|
|
|
|
|
echo "Using '$ROOK_PROFILE_NAME' as minikube profile.."
|
|
|
|
|
echo "Using '$ROOK_CLUSTER_NS' as cluster namespace.."
|
|
|
|
|
echo "Using '$ROOK_OPERATOR_NS' as operator namespace.."
|
2023-11-20 17:48:26 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
update_namespaces() {
|
2024-01-08 15:01:57 +01:00
|
|
|
if [ "$ROOK_CLUSTER_NS" != "$DEFAULT_NS" ] || [ "$ROOK_OPERATOR_NS" != "$DEFAULT_NS" ]; then
|
|
|
|
|
for file in $CLUSTER_FILES $MONITORING_FILES; do
|
|
|
|
|
echo "Updating namespace on $file"
|
|
|
|
|
sed -i.bak \
|
|
|
|
|
-e "s/\(.*\):.*# namespace:operator/\1: $ROOK_OPERATOR_NS # namespace:operator/g" \
|
|
|
|
|
-e "s/\(.*\):.*# namespace:cluster/\1: $ROOK_CLUSTER_NS # namespace:cluster/g" \
|
|
|
|
|
-e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:operator/\1:$ROOK_OPERATOR_NS:\2 # serviceaccount:namespace:operator/g" \
|
|
|
|
|
-e "s/\(.*serviceaccount\):.*:\(.*\) # serviceaccount:namespace:cluster/\1:$ROOK_CLUSTER_NS:\2 # serviceaccount:namespace:cluster/g" \
|
2024-01-25 12:51:28 +01:00
|
|
|
-e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # csi-provisioner-name/\1: $ROOK_OPERATOR_NS.\2 # csi-provisioner-name/g" \
|
2024-01-08 15:01:57 +01:00
|
|
|
-e "s/\(.*\): [-_A-Za-z0-9]*\.\(.*\) # driver:namespace:cluster/\1: $ROOK_CLUSTER_NS.\2 # driver:namespace:cluster/g" \
|
|
|
|
|
"$file"
|
|
|
|
|
done
|
|
|
|
|
fi
|
2023-11-07 17:58:47 +01:00
|
|
|
}
|
2023-10-25 13:56:56 +02:00
|
|
|
|
|
|
|
|
wait_for_ceph_cluster() {
|
2023-11-20 17:48:26 +01:00
|
|
|
echo "Waiting for ceph cluster to enter HEALTH_OK"
|
2023-10-25 13:56:56 +02:00
|
|
|
WAIT_CEPH_CLUSTER_RUNNING=20
|
2023-11-20 17:48:26 +01:00
|
|
|
while ! $KUBECTL get cephclusters.ceph.rook.io -n "$ROOK_CLUSTER_NS" -o jsonpath='{.items[?(@.kind == "CephCluster")].status.ceph.health}' | grep -q "HEALTH_OK"; do
|
|
|
|
|
echo "Waiting for Ceph cluster to enter HEALTH_OK"
|
2023-10-25 13:56:56 +02:00
|
|
|
sleep ${WAIT_CEPH_CLUSTER_RUNNING}
|
|
|
|
|
done
|
|
|
|
|
echo "Ceph cluster installed and running"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
get_minikube_driver() {
|
|
|
|
|
os=$(uname)
|
|
|
|
|
architecture=$(uname -m)
|
|
|
|
|
if [[ "$os" == "Darwin" ]]; then
|
|
|
|
|
if [[ "$architecture" == "x86_64" ]]; then
|
|
|
|
|
echo "hyperkit"
|
|
|
|
|
elif [[ "$architecture" == "arm64" ]]; then
|
|
|
|
|
echo "qemu"
|
|
|
|
|
else
|
|
|
|
|
echo "Unknown Architecture on Apple OS"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
elif [[ "$os" == "Linux" ]]; then
|
|
|
|
|
echo "kvm2"
|
|
|
|
|
else
|
|
|
|
|
echo "Unknown/Unsupported OS"
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-06 20:58:06 +01:00
|
|
|
show_info() {
|
2023-11-03 14:54:19 +01:00
|
|
|
local monitoring_enabled=$1
|
2023-11-20 17:48:26 +01:00
|
|
|
DASHBOARD_PASSWORD=$($KUBECTL -n "$ROOK_CLUSTER_NS" get secret rook-ceph-dashboard-password -o jsonpath="{['data']['password']}" | base64 --decode && echo)
|
2023-11-30 17:29:34 +01:00
|
|
|
DASHBOARD_END_POINT=$($MINIKUBE service rook-ceph-mgr-dashboard-external-http -n "$ROOK_CLUSTER_NS" --url)
|
2023-11-30 11:26:48 +01:00
|
|
|
BASE_URL="$DASHBOARD_END_POINT"
|
2023-10-25 13:56:56 +02:00
|
|
|
echo "==========================="
|
2023-11-20 17:48:26 +01:00
|
|
|
echo "Ceph Dashboard:"
|
|
|
|
|
echo " IP_ADDR : $BASE_URL"
|
|
|
|
|
echo " USER : admin"
|
|
|
|
|
echo " PASSWORD : $DASHBOARD_PASSWORD"
|
2023-11-03 14:54:19 +01:00
|
|
|
if [ "$monitoring_enabled" = true ]; then
|
2023-11-20 17:48:26 +01:00
|
|
|
PROMETHEUS_API_HOST="http://$(kubectl -n "$ROOK_CLUSTER_NS" -o jsonpath='{.status.hostIP}' get pod prometheus-rook-prometheus-0):30900"
|
2023-11-03 14:54:19 +01:00
|
|
|
echo "Prometheus Dashboard: "
|
|
|
|
|
echo " API_HOST: $PROMETHEUS_API_HOST"
|
|
|
|
|
fi
|
2023-10-25 13:56:56 +02:00
|
|
|
echo "==========================="
|
2023-11-06 20:58:06 +01:00
|
|
|
echo " "
|
2023-11-07 17:58:47 +01:00
|
|
|
echo " *** To start using your rook cluster please set the following env: "
|
|
|
|
|
echo " "
|
|
|
|
|
echo " > eval \$($MINIKUBE docker-env)"
|
|
|
|
|
echo " > alias kubectl=\"$KUBECTL"\"
|
|
|
|
|
echo " "
|
|
|
|
|
echo " *** To access the new cluster with k9s: "
|
|
|
|
|
echo " "
|
|
|
|
|
echo " > k9s --context $ROOK_PROFILE_NAME"
|
2023-11-06 20:58:06 +01:00
|
|
|
echo " "
|
2023-10-25 13:56:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
check_minikube_exists() {
|
2023-11-07 17:58:47 +01:00
|
|
|
echo "Checking minikube profile '$ROOK_PROFILE_NAME'..."
|
|
|
|
|
if minikube profile list -l 2> /dev/null | grep -qE "\s$ROOK_PROFILE_NAME\s"; then
|
2023-11-06 20:58:06 +01:00
|
|
|
echo "A minikube profile '$ROOK_PROFILE_NAME' already exists, please use -f to force the cluster creation."
|
2023-10-25 13:56:56 +02:00
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setup_minikube_env() {
|
|
|
|
|
minikube_driver="$(get_minikube_driver)"
|
2023-11-07 17:58:47 +01:00
|
|
|
echo "Setting up minikube env for profile '$ROOK_PROFILE_NAME' (using $minikube_driver driver)"
|
2023-11-07 12:54:36 +01:00
|
|
|
$MINIKUBE delete
|
2022-02-07 17:43:24 +01:00
|
|
|
$MINIKUBE start --disk-size="$MINIKUBE_DISK_SIZE" --extra-disks="$MINIKUBE_EXTRA_DISKS" --driver "$minikube_driver" -n "$MINIKUBE_NODES" $ROOK_MINIKUBE_EXTRA_ARGS
|
2023-11-07 12:54:36 +01:00
|
|
|
eval "$($MINIKUBE docker-env)"
|
2023-10-25 13:56:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
create_rook_cluster() {
|
|
|
|
|
echo "Creating cluster"
|
2023-11-20 17:48:26 +01:00
|
|
|
# create operator namespace if it doesn't exist
|
|
|
|
|
if ! kubectl get namespace "$ROOK_OPERATOR_NS" &> /dev/null; then
|
|
|
|
|
kubectl create namespace "$ROOK_OPERATOR_NS"
|
|
|
|
|
fi
|
2023-10-25 13:56:56 +02:00
|
|
|
$KUBECTL apply -f crds.yaml -f common.yaml -f operator.yaml
|
2023-11-30 16:05:26 +01:00
|
|
|
$KUBECTL apply -f "$ROOK_CLUSTER_SPEC_FILE" -f toolbox.yaml
|
2023-10-25 13:56:56 +02:00
|
|
|
$KUBECTL apply -f dashboard-external-http.yaml
|
|
|
|
|
}
|
|
|
|
|
|
2023-11-30 15:59:42 +01:00
|
|
|
change_to_examples_dir() {
|
|
|
|
|
if [ ! -e "$ROOK_EXAMPLES_DIR" ]; then
|
|
|
|
|
echo "Examples directory '$ROOK_EXAMPLES_DIR' does not exist. Please, provide a valid rook examples directory."
|
2023-10-25 13:56:56 +02:00
|
|
|
exit 1
|
|
|
|
|
fi
|
2023-11-30 15:59:42 +01:00
|
|
|
|
|
|
|
|
CRDS_FILE_PATH=$(realpath "$ROOK_EXAMPLES_DIR/crds.yaml")
|
|
|
|
|
if [ ! -e "$CRDS_FILE_PATH" ]; then
|
|
|
|
|
echo "File '$CRDS_FILE_PATH' does not exist. Please, provide a valid rook examples directory."
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
ROOK_CLUSTER_SPEC_PATH=$(realpath "$ROOK_EXAMPLES_DIR/$ROOK_CLUSTER_SPEC_FILE")
|
|
|
|
|
if [ ! -e "$ROOK_CLUSTER_SPEC_PATH" ]; then
|
|
|
|
|
echo "File '$ROOK_CLUSTER_SPEC_PATH' does not exist. Please, provide a valid cluster spec file."
|
|
|
|
|
exit 1
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
cd "$ROOK_EXAMPLES_DIR" || exit
|
2023-10-25 13:56:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
wait_for_rook_operator() {
|
2023-11-20 17:48:26 +01:00
|
|
|
echo "Waiting for rook operator..."
|
|
|
|
|
$KUBECTL rollout status deployment rook-ceph-operator -n "$ROOK_OPERATOR_NS" --timeout=180s
|
|
|
|
|
while ! $KUBECTL get cephclusters.ceph.rook.io -n "$ROOK_CLUSTER_NS" -o jsonpath='{.items[?(@.kind == "CephCluster")].status.phase}' | grep -q "Ready"; do
|
|
|
|
|
echo "Waiting for ceph cluster to become ready..."
|
2023-10-25 13:56:56 +02:00
|
|
|
sleep 20
|
|
|
|
|
done
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enable_rook_orchestrator() {
|
|
|
|
|
echo "Enabling rook orchestrator"
|
2023-11-23 13:49:10 +01:00
|
|
|
$KUBECTL rollout status deployment rook-ceph-tools -n "$ROOK_CLUSTER_NS" --timeout=90s
|
2023-11-20 17:48:26 +01:00
|
|
|
$KUBECTL -n "$ROOK_CLUSTER_NS" exec -it deploy/rook-ceph-tools -- ceph mgr module enable rook
|
|
|
|
|
$KUBECTL -n "$ROOK_CLUSTER_NS" exec -it deploy/rook-ceph-tools -- ceph orch set backend rook
|
|
|
|
|
$KUBECTL -n "$ROOK_CLUSTER_NS" exec -it deploy/rook-ceph-tools -- ceph orch status
|
2023-11-03 14:54:19 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
enable_monitoring() {
|
|
|
|
|
echo "Enabling monitoring"
|
2024-01-24 15:38:25 +02:00
|
|
|
$KUBECTL create -f https://raw.githubusercontent.com/coreos/prometheus-operator/v0.71.1/bundle.yaml
|
2023-11-03 14:54:19 +01:00
|
|
|
$KUBECTL wait --for=condition=ready pod -l app.kubernetes.io/name=prometheus-operator --timeout=30s
|
2023-11-23 13:48:39 +01:00
|
|
|
$KUBECTL apply -f monitoring/rbac.yaml
|
2023-11-03 14:54:19 +01:00
|
|
|
$KUBECTL apply -f monitoring/service-monitor.yaml
|
|
|
|
|
$KUBECTL apply -f monitoring/exporter-service-monitor.yaml
|
|
|
|
|
$KUBECTL apply -f monitoring/prometheus.yaml
|
|
|
|
|
$KUBECTL apply -f monitoring/prometheus-service.yaml
|
2023-11-20 17:48:26 +01:00
|
|
|
PROMETHEUS_API_HOST="http://$(kubectl -n "$ROOK_CLUSTER_NS" -o jsonpath='{.status.hostIP}' get pod prometheus-rook-prometheus-0):30900"
|
|
|
|
|
$KUBECTL -n "$ROOK_CLUSTER_NS" exec -it deploy/rook-ceph-tools -- ceph dashboard set-prometheus-api-host "$PROMETHEUS_API_HOST"
|
2023-10-25 13:56:56 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
show_usage() {
|
|
|
|
|
echo ""
|
2024-01-08 15:01:57 +01:00
|
|
|
echo "Usage: [ARG=VALUE]... $(basename "$0") [-f] [-r] [-m]"
|
|
|
|
|
echo " -f Force cluster creation by deleting minikube profile"
|
|
|
|
|
echo " -r Enable rook orchestrator"
|
|
|
|
|
echo " -m Enable monitoring"
|
|
|
|
|
echo " Args:"
|
|
|
|
|
sed -n -E "s/^export (.*)=\".*:=.*\" ## (.*)/ \1 (\\$\1): \2/p;" "$SCRIPT_ROOT"/"$(basename "$0")" | envsubst
|
|
|
|
|
echo ""
|
2023-10-25 13:56:56 +02:00
|
|
|
}
|
|
|
|
|
|
2023-11-08 20:08:55 +01:00
|
|
|
invocation_error() {
|
|
|
|
|
printf "%s\n" "$*" > /dev/stderr
|
|
|
|
|
show_usage
|
|
|
|
|
exit 1
|
|
|
|
|
}
|
|
|
|
|
|
2023-10-25 13:56:56 +02:00
|
|
|
####################################################################
|
|
|
|
|
################# MAIN #############################################
|
|
|
|
|
|
2024-01-08 15:01:57 +01:00
|
|
|
while getopts ":hrmf" opt; do
|
2023-10-25 13:56:56 +02:00
|
|
|
case $opt in
|
|
|
|
|
h)
|
|
|
|
|
show_usage
|
|
|
|
|
exit 0
|
|
|
|
|
;;
|
|
|
|
|
r)
|
|
|
|
|
enable_rook=true
|
|
|
|
|
;;
|
2023-11-03 14:54:19 +01:00
|
|
|
m)
|
|
|
|
|
enable_monitoring=true
|
|
|
|
|
;;
|
2023-10-25 13:56:56 +02:00
|
|
|
f)
|
|
|
|
|
force_minikube=true
|
|
|
|
|
;;
|
|
|
|
|
\?)
|
2023-11-08 20:08:55 +01:00
|
|
|
invocation_error "Invalid option: -$OPTARG"
|
2023-10-25 13:56:56 +02:00
|
|
|
;;
|
|
|
|
|
:)
|
2023-11-08 20:08:55 +01:00
|
|
|
invocation_error "Option -$OPTARG requires an argument."
|
2023-10-25 13:56:56 +02:00
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
2024-01-08 15:01:57 +01:00
|
|
|
# initialization zone
|
|
|
|
|
init_vars
|
2023-11-30 15:59:42 +01:00
|
|
|
change_to_examples_dir
|
2024-01-08 15:01:57 +01:00
|
|
|
[ -z "$force_minikube" ] && check_minikube_exists
|
|
|
|
|
update_namespaces
|
2023-10-25 13:56:56 +02:00
|
|
|
|
2024-01-08 15:01:57 +01:00
|
|
|
# cluster creation zone
|
2023-10-25 13:56:56 +02:00
|
|
|
setup_minikube_env
|
|
|
|
|
create_rook_cluster
|
|
|
|
|
wait_for_rook_operator
|
|
|
|
|
wait_for_ceph_cluster
|
|
|
|
|
|
2024-01-08 15:01:57 +01:00
|
|
|
# final tweaks and ceph cluster tuning
|
|
|
|
|
[ "$enable_rook" = true ] && enable_rook_orchestrator
|
|
|
|
|
[ "$enable_monitoring" = true ] && enable_monitoring
|
2023-11-06 20:58:06 +01:00
|
|
|
show_info "$enable_monitoring"
|
2023-10-25 13:56:56 +02:00
|
|
|
|
|
|
|
|
####################################################################
|
|
|
|
|
####################################################################
|