diff --git a/.github/workflows/operator-e2e.yaml b/.github/workflows/operator-e2e.yaml new file mode 100644 index 000000000000..0e4ea129c7fc --- /dev/null +++ b/.github/workflows/operator-e2e.yaml @@ -0,0 +1,69 @@ +name: Operator Installation Test +on: + # Run this workflow every time a new commit pushed to upstream/fork repository. + # Run workflow on fork repository will help contributors find and resolve issues before sending a PR. + push: + # Exclude branches created by Dependabot to avoid triggering current workflow + # for PRs initiated by Dependabot. + branches-ignore: + - 'dependabot/**' + pull_request: +# https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#concurrency +concurrency: + group: ${{ github.workflow }}-${{ github.actor }}-${{ github.head_ref || github.run_id }} + cancel-in-progress: true +permissions: + contents: read # for actions/checkout to fetch code +jobs: + set-up-e2e-environment: + name: Set up operator e2e environment + runs-on: ubuntu-22.04 + strategy: + fail-fast: false + matrix: + # Here support the latest three minor releases of Kubernetes, this can be considered to be roughly + # the same as the End of Life of the Kubernetes release: https://kubernetes.io/releases/ + # Please remember to update the CI Schedule Workflow when we add a new version. + k8s: [ v1.29.0, v1.30.0, v1.31.0 ] + # prevent job running from forked repository + if: ${{ github.repository == 'karmada-io/karmada' }} + steps: + # Free up disk space on Ubuntu + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + # this might remove tools that are actually needed, if set to "true" but frees about 6 GB + tool-cache: false + # all of these default to true, but feel free to set to "false" if necessary for your workflow + android: true + dotnet: true + haskell: true + large-packages: false + docker-images: false + swap-storage: false + - name: checkout code + uses: actions/checkout@v4 + - name: install Go + uses: actions/setup-go@v5 + with: + go-version-file: go.mod + - name: setup e2e test environment + run: | + export CLUSTER_VERSION=kindest/node:${{ matrix.k8s }} + hack/local-up-karmada-by-operator.sh + - name: run e2e + run: | + export ARTIFACTS_PATH=${{ github.workspace }}/karmada-operator-e2e-logs/${{ matrix.k8s }}/ + hack/run-e2e.sh + - name: upload logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: karmada_operator_e2e_log_${{ matrix.k8s }} + path: ${{ github.workspace }}/karmada-operator-e2e-logs/${{ matrix.k8s }}/ + - name: upload kind logs + if: always() + uses: actions/upload-artifact@v4 + with: + name: karmada_kind_log_${{ matrix.k8s }} + path: /tmp/karmada/ diff --git a/hack/deploy-karmada-by-operator.sh b/hack/deploy-karmada-by-operator.sh index fa150411c1c1..6f0f70566ec3 100755 --- a/hack/deploy-karmada-by-operator.sh +++ b/hack/deploy-karmada-by-operator.sh @@ -28,8 +28,6 @@ KARMADA_INSTANCE_NAME=${KARMADA_INSTANCE_NAME:-"karmada-demo"} KARMADA_INSTANCE_NAMESPACE=${KARMADA_INSTANCE_NAMESPACE:-"test"} CERT_DIR=${CERT_DIR:-"${HOME}/.karmada"} -GIT_VERSION=$(util::get_version) -KARMADA_VERSION=$(echo $GIT_VERSION| awk -F '-' '{print $1}'| tr -d 'v"') mkdir -p "${CERT_DIR}" &>/dev/null || mkdir -p "${CERT_DIR}" rm -f "${CERT_DIR}/*" &>/dev/null || rm -f "${CERT_DIR}/*" diff --git a/hack/local-up-karmada-by-operator.sh b/hack/local-up-karmada-by-operator.sh index d4c8c5e86944..45579d27ab34 100755 --- a/hack/local-up-karmada-by-operator.sh +++ b/hack/local-up-karmada-by-operator.sh @@ -140,7 +140,6 @@ kind load docker-image "${REGISTRY}/karmada-controller-manager:${VERSION}" --nam kind load docker-image "${REGISTRY}/karmada-scheduler:${VERSION}" --name="${HOST_CLUSTER_NAME}" kind load docker-image "${REGISTRY}/karmada-descheduler:${VERSION}" --name="${HOST_CLUSTER_NAME}" kind load docker-image "${REGISTRY}/karmada-webhook:${VERSION}" --name="${HOST_CLUSTER_NAME}" -kind load docker-image "${REGISTRY}/karmada-scheduler-estimator:${VERSION}" --name="${HOST_CLUSTER_NAME}" kind load docker-image "${REGISTRY}/karmada-aggregated-apiserver:${VERSION}" --name="${HOST_CLUSTER_NAME}" kind load docker-image "${REGISTRY}/karmada-search:${VERSION}" --name="${HOST_CLUSTER_NAME}" kind load docker-image "${REGISTRY}/karmada-metrics-adapter:${VERSION}" --name="${HOST_CLUSTER_NAME}" @@ -186,16 +185,14 @@ echo "cluster networks connected" #join push mode member clusters export KUBECONFIG="${MAIN_KUBECONFIG}" ${KARMADACTL_BIN} join --karmada-context="${KARMADA_APISERVER_CLUSTER_NAME}" ${MEMBER_CLUSTER_1_NAME} --cluster-kubeconfig="${MEMBER_CLUSTER_1_TMP_CONFIG}" --cluster-context="${MEMBER_CLUSTER_1_NAME}" -"${REPO_ROOT}"/hack/deploy-scheduler-estimator.sh "${MAIN_KUBECONFIG}" "${HOST_CLUSTER_NAME}" "${MEMBER_CLUSTER_1_TMP_CONFIG}" "${MEMBER_CLUSTER_1_NAME}" ${KARMADACTL_BIN} join --karmada-context="${KARMADA_APISERVER_CLUSTER_NAME}" ${MEMBER_CLUSTER_2_NAME} --cluster-kubeconfig="${MEMBER_CLUSTER_2_TMP_CONFIG}" --cluster-context="${MEMBER_CLUSTER_2_NAME}" -"${REPO_ROOT}"/hack/deploy-scheduler-estimator.sh "${MAIN_KUBECONFIG}" "${HOST_CLUSTER_NAME}" "${MEMBER_CLUSTER_2_TMP_CONFIG}" "${MEMBER_CLUSTER_2_NAME}" # wait until the pull mode cluster ready util::check_clusters_ready "${PULL_MODE_CLUSTER_TMP_CONFIG}" "${PULL_MODE_CLUSTER_NAME}" kind load docker-image "${REGISTRY}/karmada-agent:${VERSION}" --name="${PULL_MODE_CLUSTER_NAME}" #step7. deploy karmada agent in pull mode member clusters -"${REPO_ROOT}"/hack/deploy-agent-and-estimator.sh "${MAIN_KUBECONFIG}" "${HOST_CLUSTER_NAME}" "${MAIN_KUBECONFIG}" "${KARMADA_APISERVER_CLUSTER_NAME}" "${PULL_MODE_CLUSTER_TMP_CONFIG}" "${PULL_MODE_CLUSTER_NAME}" +"${REPO_ROOT}"/hack/deploy-karmada-agent.sh "${MAIN_KUBECONFIG}" "${KARMADA_APISERVER_CLUSTER_NAME}" "${PULL_MODE_CLUSTER_TMP_CONFIG}" "${PULL_MODE_CLUSTER_NAME}" #step8. deploy metrics-server in member clusters "${REPO_ROOT}"/hack/deploy-k8s-metrics-server.sh "${MEMBER_CLUSTER_1_TMP_CONFIG}" "${MEMBER_CLUSTER_1_NAME}" diff --git a/operator/config/samples/karmada-sample.yaml b/operator/config/samples/karmada-sample.yaml new file mode 100644 index 000000000000..899a88ee071f --- /dev/null +++ b/operator/config/samples/karmada-sample.yaml @@ -0,0 +1,59 @@ +apiVersion: operator.karmada.io/v1alpha1 +kind: Karmada +metadata: + name: {{karmada_instance_name}} + namespace: {{karmada_instance_namespace}} +spec: + hostCluster: + networking: + dnsDomain: cluster.local + crdTarball: {{crd_tarball}} + components: + etcd: + local: + imageRepository: registry.k8s.io/etcd + imageTag: 3.5.13-0 + replicas: 1 + volumeData: + # hostPath: + # type: DirectoryOrCreate + # path: /var/lib/karmada/etcd/karmada-demo + volumeClaim: + metadata: + name: etcd-data + spec: + accessModes: + - ReadWriteOnce + resources: + requests: + storage: 3Gi + karmadaAPIServer: + imageRepository: registry.k8s.io/kube-apiserver + imageTag: v1.30.4 + replicas: 1 + serviceType: NodePort + serviceSubnet: 10.96.0.0/12 + karmadaAggregatedAPIServer: + imageRepository: docker.io/karmada/karmada-aggregated-apiserver + imageTag: {{image_tag}} + replicas: 1 + karmadaControllerManager: + imageRepository: docker.io/karmada/karmada-controller-manager + imageTag: {{image_tag}} + replicas: 1 + karmadaScheduler: + imageRepository: docker.io/karmada/karmada-scheduler + imageTag: {{image_tag}} + replicas: 1 + karmadaWebhook: + imageRepository: docker.io/karmada/karmada-webhook + imageTag: {{image_tag}} + replicas: 1 + kubeControllerManager: + imageRepository: registry.k8s.io/kube-controller-manager + imageTag: v1.30.4 + replicas: 1 + karmadaMetricsAdapter: + imageRepository: docker.io/karmada/karmada-metrics-adapter + imageTag: {{image_tag}} + replicas: 2