Deploying Applications to Multiple Clusters with Replication Scheduling

Scheduling applications to multiple clusters

This tutorial will walk you through how to deploy applications to multiple clusters with replication scheduling, which is the default scheduling strategy. Replication scheduling means every matching cluster will run a replicated and completed instance of an application. For example, if you want to deploy a Deployment with 5 replicas to 2 clusters, then every cluster will run such a Deployment with 5 replicas respectively.

Defining Your Applications

First, let’s see an example application. Below Subscription “app-demo” defines the target child clusters to be distributed to, and the resources to be deployed with.

# examples/replication-scheduling/subscription.yaml
kind: Subscription
  name: app-demo
  namespace: default
  subscribers: # defines the clusters to be distributed to
    - clusterAffinity:
 dc91021d-2361-4f6d-a404-7c33b9e01118 # PLEASE UPDATE THIS CLUSTER-ID TO YOURS!!!
  feeds: # defines all the resources to be deployed with
    - apiVersion:
      kind: HelmChart
      name: mysql
      namespace: default
    - apiVersion: v1
      kind: Namespace
      name: foo
    - apiVersion: v1
      kind: Service
      name: my-nginx-svc
      namespace: foo
    - apiVersion: apps/v1
      kind: Deployment
      name: my-nginx
      namespace: foo

Before applying this Subscription, please modify examples/replication-scheduling/subscription.yaml with your clusterID.

Clusternet also supports using OCI-based registries for Helm charts. Please refer this oci-based helm chart.

If you want to apply overrides per cluster, please follow How to Set Overrides in Clusternet. Before applying these Localization(s), please modify examples/replication-scheduling/localization.yaml with your ManagedCluster namespace, such as clusternet-5l82l.

Applying Your Applications

After installing kubectl plugin kubectl-clusternet, you could run below commands to distribute this application to child clusters.

$ kubectl clusternet apply -f examples/replication-scheduling/ created
namespace/foo created
deployment.apps/my-nginx created
service/my-nginx-svc created created
$ # or
$ # kubectl-clusternet apply -f examples/replication-scheduling/

You can check aggregated status of feeds/resources running in each child clusters.

Checking Subscription Status

Then you can view the resources just created,

$ # list Subscription
$ kubectl clusternet get subs -A
default     app-demo   6m4s
$ kubectl clusternet get chart
NAME             CHART   VERSION   REPO                                 STATUS   AGE
mysql            mysql   8.6.2   Found    71s
$ kubectl clusternet get ns
foo    2021-08-07T08:50:55Z
$ kubectl clusternet get svc -n foo
my-nginx-svc   2021-08-07T08:50:57Z
$ kubectl clusternet get deploy -n foo
my-nginx   2021-08-07T08:50:56Z

Clusternet will help deploy and coordinate applications to multiple clusters. You can check the status by following commands,

$ kubectl clusternet get mcls -A
NAMESPACE          NAME                       CLUSTER ID                             SYNC MODE   KUBERNETES   READYZ   AGE
clusternet-5l82l   clusternet-cluster-hx455   dc91021d-2361-4f6d-a404-7c33b9e01118   Dual        v1.21.0      true     5d22h
$ # list Descriptions
$ kubectl clusternet get desc -A
NAMESPACE          NAME               DEPLOYER   STATUS    AGE
clusternet-5l82l   app-demo-generic   Generic    Success   2m55s
clusternet-5l82l   app-demo-helm      Helm       Success   2m55s
$ kubectl describe desc -n clusternet-5l82l   app-demo-generic
  Phase:  Success
  Type    Reason                Age    From            Message
  ----    ------                ----   ----            -------
  Normal  SuccessfullyDeployed  2m55s  clusternet-hub  Description clusternet-5l82l/app-demo-generic is deployed successfully
$ # list Helm Release
$ # hr is an alias for HelmRelease
$ kubectl clusternet get hr -n clusternet-5l82l
NAME                  CHART       VERSION   REPO                                 STATUS     AGE
helm-demo-mysql       mysql       8.6.2   deployed   2m55s

You can also verify the installation with Helm command line in your child cluster,

$ helm ls -n abc
NAME               	NAMESPACE	REVISION	UPDATED                             	STATUS  	CHART            	APP VERSION
helm-demo-mysql    	abc      	1       	2021-07-06 14:34:44.188938 +0800 CST	deployed	mysql-8.6.2      	8.0.25