|
| 1 | +#!/bin/bash |
| 2 | +set -ex |
| 3 | + |
| 4 | +## This script deploy karmada control plane to a Kind cluster using helm chart, and then deploy three member clusters. |
| 5 | +## Two member clusters are joined in Push mode, using karmadactl join command. |
| 6 | +## Another member cluster is joined in Pull mode, using helm chart of karmada-agent. |
| 7 | +## After installation, you can access to each cluster by following kubeconfig: |
| 8 | +## - karmada-host ~/.kube/karmada-host.config |
| 9 | +## - karmada-apiserver ~/.kube/karmada-apiserver.config |
| 10 | +## - member1/member2/member3 ~/.kube/members.config |
| 11 | + |
| 12 | +# 1. clean old Kind clusters |
| 13 | +kind delete clusters --all; rm -rf ~/.karmada/; rm -rf ~/.kube/*config; rm -rf /etc/karmada |
| 14 | +# 2. create karmada-host cluster by Kind |
| 15 | +hack/create-cluster.sh karmada-host ~/.kube/karmada-host.config |
| 16 | + |
| 17 | +# (optional) pull images in advance for karmada-host |
| 18 | +for img in $(cat charts/karmada/values.yaml | grep -C 1 'repository:' | sed 's/*karmadaImageVersion/latest/g' | awk -F ':' '{print $2}' | sed 's/\"//g' | xargs -n3 | awk '{print $1"/"$2":"$3}'); do docker pull "$img"; kind load docker-image "$img" --name karmada-host; done |
| 19 | + |
| 20 | +# 3. get host network ip (node ip) from kube-apiserver, and then add this ip to values.yaml as SAN of certificate |
| 21 | +export KUBECONFIG=~/.kube/karmada-host.config |
| 22 | +HOST_IP=$(kubectl get ep kubernetes -o jsonpath='{.subsets[0].addresses[0].ip}') |
| 23 | +sed -i'' -e "/localhost/{n;s/ \"127.0.0.1/ \"${HOST_IP}\",\n&/g}" charts/karmada/values.yaml |
| 24 | + |
| 25 | +# 4. install karmada in host cluster by helm |
| 26 | +helm install karmada -n karmada-system \ |
| 27 | + --kubeconfig ~/.kube/karmada-host.config \ |
| 28 | + --create-namespace \ |
| 29 | + --dependency-update \ |
| 30 | + --set apiServer.hostNetwork=true,components={"search,descheduler"} \ |
| 31 | + ./charts/karmada |
| 32 | + |
| 33 | +# 5. export kubeconfig of karmada-apiserver to local path |
| 34 | +kubectl get secret -n karmada-system karmada-kubeconfig -o jsonpath={.data.kubeconfig} | base64 -d > ~/.kube/karmada-apiserver.config |
| 35 | +KARMADA_APISERVER_ADDR=$(kubectl get ep karmada-apiserver -n karmada-system | tail -n 1 | awk '{print $2}') |
| 36 | +sed -i'' -e "s/karmada-apiserver.karmada-system.svc.cluster.local:5443/${KARMADA_APISERVER_ADDR}/g" ~/.kube/karmada-apiserver.config |
| 37 | + |
| 38 | +# 6. create member clusters by Kind |
| 39 | +hack/create-cluster.sh member1 ~/.kube/members.config |
| 40 | +hack/create-cluster.sh member2 ~/.kube/members.config |
| 41 | +hack/create-cluster.sh member3 ~/.kube/members.config |
| 42 | + |
| 43 | +# 7. download karmadactl if not exist |
| 44 | +if ! which karmadactl >/dev/null 2>&1; then curl -s https://raw.githubusercontent.com/karmada-io/karmada/master/hack/install-cli.sh | sudo bash; fi |
| 45 | + |
| 46 | +# 8. join member1、member3 to karmada with push mode |
| 47 | +karmadactl join member1 --kubeconfig ~/.kube/karmada-apiserver.config --karmada-context karmada-apiserver --cluster-kubeconfig ~/.kube/members.config --cluster-context member1 |
| 48 | +karmadactl join member3 --kubeconfig ~/.kube/karmada-apiserver.config --karmada-context karmada-apiserver --cluster-kubeconfig ~/.kube/members.config --cluster-context member3 |
| 49 | + |
| 50 | +# (optional) pull agent image in advance for member2 |
| 51 | +docker pull docker.io/karmada/karmada-agent:latest; kind load docker-image docker.io/karmada/karmada-agent:latest --name member2 |
| 52 | + |
| 53 | +# 9. get cert from karmada config for agent |
| 54 | +set +x |
| 55 | +CA_CRT=$(cat ~/.kube/karmada-apiserver.config | grep certificate-authority-data | awk -F ': ' '{print $2}' | base64 -d) |
| 56 | +AGENT_CRT=$(cat ~/.kube/karmada-apiserver.config | grep client-certificate-data | awk -F ': ' '{print $2}' | base64 -d) |
| 57 | +AGENT_KEY=$(cat ~/.kube/karmada-apiserver.config | grep client-key-data | awk -F ': ' '{print $2}' | base64 -d) |
| 58 | + |
| 59 | +# 10. install karmada-agent in member2 cluster, and then join member2 to karmada with pull mode |
| 60 | +helm install karmada-agent -n karmada-system \ |
| 61 | + --kubeconfig ~/.kube/members.config \ |
| 62 | + --kube-context member2 \ |
| 63 | + --create-namespace \ |
| 64 | + --dependency-update \ |
| 65 | + --set installMode=agent,agent.clusterName=member2,agent.kubeconfig.server=https://"${KARMADA_APISERVER_ADDR}",agent.kubeconfig.caCrt="${CA_CRT}",agent.kubeconfig.crt="${AGENT_CRT}",agent.kubeconfig.key="${AGENT_KEY}" \ |
| 66 | + ./charts/karmada |
| 67 | + |
| 68 | +# verify: wait for member cluster ready and then print member clusters |
| 69 | +while [[ "$(kubectl --kubeconfig ~/.kube/karmada-apiserver.config get cluster -o wide | wc -l)" -ne 4 ]]; do |
| 70 | + echo "waiting for member clusters ready..."; sleep 2; |
| 71 | +done |
| 72 | +kubectl --kubeconfig ~/.kube/karmada-apiserver.config get cluster -o wide |
0 commit comments