karmada/hack/deploy-karmada.sh

110 lines
3.9 KiB
Bash
Executable File

#!/usr/bin/env bash
set -o errexit
set -o nounset
SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/..
CERT_DIR=${CERT_DIR:-"/var/run/karmada"}
KARMADA_APISERVER_CONFIG="${CERT_DIR}/karmada-apiserver.config"
KUBECONFIG_PATH=${KUBECONFIG_PATH:-"${HOME}/.kube"}
KARMADA_KUBECONFIG="${KUBECONFIG_PATH}/karmada.config"
etcd_replicas=1
etcd_pod_label="etcd"
apiserver_replicas=1
apiserver_pod_label="karmada-apiserver"
controller_replicas=1
controller_pod_label="kube-controller-manager"
function usage() {
echo "This script will deploy karmada control plane to a cluster."
echo "Usage: hack/deploy-karmada.sh"
echo "Example: hack/deploy-karmada.sh"
}
function waitPodReady() {
local pod_label=$1
local pod_namespaces=$2
local pod_replicas=$3
timeout=200
while [[ $timeout -gt 0 ]]; do
echo "Waiting for $pod_label pods to become Ready"
statuses=$(kubectl get pods -n $pod_namespaces -l app=$pod_label \
-o jsonpath='{.items[*].status.conditions[?(@.type=="Ready")].status}' \
| grep "True" | wc -w)
if [[ $statuses -eq $pod_replicas ]]; then
break
else
sleep 1
(( timeout=timeout-1 ))
fi
done
if [[ $timeout -gt 0 ]]; then
echo "All $pod_label pods became Ready"
else
echo "ERROR: Not all $pod_label pods became Ready"
echo "kubectl get pods -l app=$pod_label"
kubectl get pods -l app=$pod_label
exit 1
fi
}
function installCRDs() {
if [ ! -f ${KARMADA_APISERVER_CONFIG} ]; then
echo "Please provide kubeconfig to connect karmada apiserver"
return 1
fi
# install APIs
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/namespace.yaml"
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/membercluster.karmada.io_memberclusters.yaml"
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/propagationstrategy.karmada.io_propagationpolicies.yaml"
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/propagationstrategy.karmada.io_propagationbindings.yaml"
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/propagationstrategy.karmada.io_propagationworks.yaml"
}
# create namespace for control plane components
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/namespace.yaml"
# create service account, cluster role for controller-manager
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/serviceaccount.yaml"
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/clusterrole.yaml"
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/clusterrolebinding.yaml"
#generate cert
"${SCRIPT_ROOT}"/hack/generate-cert.sh
# deploy karmada etcd
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/karmada-etcd.yaml"
# Wait for karmada-etcd to come up before launching the rest of the components.
waitPodReady $etcd_pod_label "karmada-system" $etcd_replicas
# deploy karmada apiserver
KARMADA_API_IP=$(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "karmada-control-plane")
cp -rf ${SCRIPT_ROOT}/artifacts/deploy/karmada-apiserver.yaml ${SCRIPT_ROOT}/artifacts/deploy/karmada-apiserver-tmp.yaml
sed -i "s/{{api_addr}}/${KARMADA_API_IP}/g" ${SCRIPT_ROOT}/artifacts/deploy/karmada-apiserver-tmp.yaml
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/karmada-apiserver-tmp.yaml"
# Wait for karmada-apiserver to come up before launching the rest of the components.
waitPodReady $apiserver_pod_label "karmada-system" $apiserver_replicas
# deploy kube controller manager
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/kube-controller-manager.yaml"
# Wait for karmada kube controller manager to come up before launching the rest of the components.
waitPodReady $controller_pod_label "karmada-system" $controller_replicas
export KUBECONFIG=${KARMADA_APISERVER_CONFIG}
# install CRD APIs
installCRDs
export KUBECONFIG=${KARMADA_KUBECONFIG}
# deploy controller-manager
kubectl create -f "${SCRIPT_ROOT}/artifacts/deploy/controller-manager.yaml"