|
| 1 | +#!/usr/bin/env bash |
| 2 | +# Copyright 2025 The Karmada Authors. |
| 3 | +# |
| 4 | +# Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | +# you may not use this file except in compliance with the License. |
| 6 | +# You may obtain a copy of the License at |
| 7 | +# |
| 8 | +# http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | +# |
| 10 | +# Unless required by applicable law or agreed to in writing, software |
| 11 | +# distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | +# See the License for the specific language governing permissions and |
| 14 | +# limitations under the License. |
| 15 | + |
| 16 | +set -o errexit |
| 17 | +set -o nounset |
| 18 | +set -o pipefail |
| 19 | + |
| 20 | +# This script starts a local karmada control plane with karmadactl and with a certain number of clusters joined, |
| 21 | +# identical to hack/cli-testing-environment.sh except adding '--secret-layout=split' for init. |
| 22 | +# This script depends on utils in: ${REPO_ROOT}/hack/util.sh |
| 23 | +# 1. used by developer to setup develop environment quickly. |
| 24 | +# 2. used by e2e testing to setup test environment automatically. |
| 25 | + |
| 26 | +REPO_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. |
| 27 | +source "${REPO_ROOT}"/hack/util.sh |
| 28 | + |
| 29 | +# variable define |
| 30 | +KUBECONFIG_PATH=${KUBECONFIG_PATH:-"${HOME}/.kube"} |
| 31 | +HOST_CLUSTER_NAME=${HOST_CLUSTER_NAME:-"karmada-host"} |
| 32 | +MEMBER_CLUSTER_1_NAME=${MEMBER_CLUSTER_1_NAME:-"split-secret-member1"} |
| 33 | +MEMBER_CLUSTER_2_NAME=${MEMBER_CLUSTER_2_NAME:-"split-secret-member2"} |
| 34 | +CLUSTER_VERSION=${CLUSTER_VERSION:-"${DEFAULT_CLUSTER_VERSION}"} |
| 35 | +BUILD_PATH=${BUILD_PATH:-"_output/bin/linux/amd64"} |
| 36 | + |
| 37 | +# install kind and kubectl |
| 38 | +echo -n "Preparing: 'kind' existence check - " |
| 39 | +if util::cmd_exist kind; then |
| 40 | + echo "passed" |
| 41 | +else |
| 42 | + echo "not pass" |
| 43 | + # Install kind using the version defined in util.sh |
| 44 | + util::install_tools "sigs.k8s.io/kind" "${KIND_VERSION}" |
| 45 | +fi |
| 46 | +# get arch name and os name in bootstrap |
| 47 | +BS_ARCH=$(go env GOARCH) |
| 48 | +BS_OS=$(go env GOOS) |
| 49 | +# check arch and os name before installing |
| 50 | +util::install_environment_check "${BS_ARCH}" "${BS_OS}" |
| 51 | +echo -n "Preparing: 'kubectl' existence check - " |
| 52 | +if util::cmd_exist kubectl; then |
| 53 | + echo "passed" |
| 54 | +else |
| 55 | + echo "not pass" |
| 56 | + util::install_kubectl "" "${BS_ARCH}" "${BS_OS}" |
| 57 | +fi |
| 58 | + |
| 59 | +# prepare the newest crds |
| 60 | +echo "Prepare the newest crds" |
| 61 | +cd charts/karmada/ |
| 62 | +cp -r _crds crds |
| 63 | +tar -zcvf ../../crds.tar.gz crds |
| 64 | +cd - |
| 65 | + |
| 66 | +# make images |
| 67 | +export VERSION="latest" |
| 68 | +export REGISTRY="docker.io/karmada" |
| 69 | +make images GOOS="linux" --directory="${REPO_ROOT}" |
| 70 | + |
| 71 | +# make karmadactl binary |
| 72 | +make karmadactl |
| 73 | + |
| 74 | +# create host/member1/member2 cluster |
| 75 | +echo "Start create clusters..." |
| 76 | +hack/create-cluster.sh ${HOST_CLUSTER_NAME} ${KUBECONFIG_PATH}/${HOST_CLUSTER_NAME}.config > /dev/null 2>&1 & |
| 77 | +hack/create-cluster.sh ${MEMBER_CLUSTER_1_NAME} ${KUBECONFIG_PATH}/${MEMBER_CLUSTER_1_NAME}.config > /dev/null 2>&1 & |
| 78 | +hack/create-cluster.sh ${MEMBER_CLUSTER_2_NAME} ${KUBECONFIG_PATH}/${MEMBER_CLUSTER_2_NAME}.config > /dev/null 2>&1 & |
| 79 | + |
| 80 | +# wait cluster ready |
| 81 | +echo "Wait clusters ready..." |
| 82 | +util::wait_file_exist ${KUBECONFIG_PATH}/${HOST_CLUSTER_NAME}.config 300 |
| 83 | +util::wait_context_exist ${HOST_CLUSTER_NAME} ${KUBECONFIG_PATH}/${HOST_CLUSTER_NAME}.config 300 |
| 84 | +kubectl wait --for=condition=Ready nodes --all --timeout=800s --kubeconfig=${KUBECONFIG_PATH}/${HOST_CLUSTER_NAME}.config |
| 85 | +util::wait_nodes_taint_disappear 800 ${KUBECONFIG_PATH}/${HOST_CLUSTER_NAME}.config |
| 86 | + |
| 87 | +util::wait_file_exist ${KUBECONFIG_PATH}/${MEMBER_CLUSTER_1_NAME}.config 300 |
| 88 | +util::wait_context_exist "${MEMBER_CLUSTER_1_NAME}" ${KUBECONFIG_PATH}/${MEMBER_CLUSTER_1_NAME}.config 300 |
| 89 | +kubectl wait --for=condition=Ready nodes --all --timeout=800s --kubeconfig=${KUBECONFIG_PATH}/${MEMBER_CLUSTER_1_NAME}.config |
| 90 | +util::wait_nodes_taint_disappear 800 ${KUBECONFIG_PATH}/${MEMBER_CLUSTER_1_NAME}.config |
| 91 | + |
| 92 | +util::wait_file_exist ${KUBECONFIG_PATH}/${MEMBER_CLUSTER_2_NAME}.config 300 |
| 93 | +util::wait_context_exist "${MEMBER_CLUSTER_2_NAME}" ${KUBECONFIG_PATH}/${MEMBER_CLUSTER_2_NAME}.config 300 |
| 94 | +kubectl wait --for=condition=Ready nodes --all --timeout=800s --kubeconfig=${KUBECONFIG_PATH}/${MEMBER_CLUSTER_2_NAME}.config |
| 95 | +util::wait_nodes_taint_disappear 800 ${KUBECONFIG_PATH}/${MEMBER_CLUSTER_2_NAME}.config |
| 96 | + |
| 97 | +# load components images to kind cluster |
| 98 | +kind load docker-image "${REGISTRY}/karmada-controller-manager:${VERSION}" --name="${HOST_CLUSTER_NAME}" |
| 99 | +kind load docker-image "${REGISTRY}/karmada-scheduler:${VERSION}" --name="${HOST_CLUSTER_NAME}" |
| 100 | +kind load docker-image "${REGISTRY}/karmada-webhook:${VERSION}" --name="${HOST_CLUSTER_NAME}" |
| 101 | +kind load docker-image "${REGISTRY}/karmada-aggregated-apiserver:${VERSION}" --name="${HOST_CLUSTER_NAME}" |
| 102 | +kind load docker-image "${REGISTRY}/karmada-agent:${VERSION}" --name="${MEMBER_CLUSTER_1_NAME}" |
| 103 | + |
| 104 | +# init Karmada control plane |
| 105 | +echo "Start init karmada control plane..." |
| 106 | +${BUILD_PATH}/karmadactl init --kubeconfig=${KUBECONFIG_PATH}/${HOST_CLUSTER_NAME}.config \ |
| 107 | + --karmada-controller-manager-image="${REGISTRY}/karmada-controller-manager:${VERSION}" \ |
| 108 | + --karmada-scheduler-image="${REGISTRY}/karmada-scheduler:${VERSION}" \ |
| 109 | + --karmada-webhook-image="${REGISTRY}/karmada-webhook:${VERSION}" \ |
| 110 | + --karmada-aggregated-apiserver-image="${REGISTRY}/karmada-aggregated-apiserver:${VERSION}" \ |
| 111 | + --karmada-data=${HOME}/karmada \ |
| 112 | + --karmada-pki=${HOME}/karmada/pki \ |
| 113 | + --crds=./crds.tar.gz \ |
| 114 | + --secret-layout='split' |
| 115 | + |
| 116 | +# join cluster |
| 117 | +echo "Join member clusters..." |
| 118 | +TOKEN_CMD=$(${BUILD_PATH}/karmadactl --kubeconfig ${HOME}/karmada/karmada-apiserver.config token create --print-register-command) |
| 119 | +TOKEN=$(echo "$TOKEN_CMD" | grep -o '\--token [^ ]*' | cut -d' ' -f2) |
| 120 | +HASH=$(echo "$TOKEN_CMD" | grep -o '\--discovery-token-ca-cert-hash [^ ]*' | cut -d' ' -f2) |
| 121 | +ENDPOINT=$(kubectl --kubeconfig ${HOME}/karmada/karmada-apiserver.config config view --minify -o jsonpath='{.clusters[0].cluster.server}' | sed 's|^https://||') |
| 122 | + |
| 123 | +${BUILD_PATH}/karmadactl register ${ENDPOINT} \ |
| 124 | + --token ${TOKEN} \ |
| 125 | + --discovery-token-ca-cert-hash ${HASH} \ |
| 126 | + --kubeconfig=${KUBECONFIG_PATH}/${MEMBER_CLUSTER_1_NAME}.config \ |
| 127 | + --cluster-name=${MEMBER_CLUSTER_1_NAME} \ |
| 128 | + --karmada-agent-image "${REGISTRY}/karmada-agent:${VERSION}" \ |
| 129 | + --v=4 |
| 130 | + |
| 131 | +${BUILD_PATH}/karmadactl --kubeconfig ${HOME}/karmada/karmada-apiserver.config join ${MEMBER_CLUSTER_2_NAME} --cluster-kubeconfig=${KUBECONFIG_PATH}/${MEMBER_CLUSTER_2_NAME}.config |
| 132 | + |
| 133 | +kubectl wait --for=condition=Ready clusters --all --timeout=800s --kubeconfig=${HOME}/karmada/karmada-apiserver.config |
0 commit comments