Container Service for Kubernetes (ACK) One allows you to use a master instance to deploy an application across multiple clusters. You can also use different configurations to deploy the application across the clusters. For example, you can specify different numbers of replicated pods, OS images, or environment variables for the application. This topic describes how to use different configurations to deploy an application across multiple clusters.

Prerequisites

  • The kubeconfig file of the master instance is obtained from the ACK One console by using an account with the developer role. A kubectl client is connected to the master instance.

  • Namespaces and resource quotas are configured by the master instance administrator. For more information, see Manage namespaces and resource quotas.

  • Multiple ACK clusters are associated with the master instance. For more information, see Associate clusters with a master instance.
  • The AMC command-line tool is installed. For more information, see Use AMC.

Procedure

  1. Create a file named app-meta.yaml with the following content. The file defines the Kubernetes resources that are required to deploy an application.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: demo
      name: demo
      namespace: demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: demo
      template:
        metadata:
          labels:
            app: demo
        spec:
          containers:
          - image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:red
            name: demo
  2. Run the following command to deploy an application named demo on a master instance:
    kubectl apply -f app-meta.yaml
  3. Create a file named policy-topology.yaml with the following content. The clusters cluster-beijing and cluster-hangzhou are specified as the destination clusters in which the Kubernetes resources are deployed.
    1. Run the following command to query the clusters that are associated with the master instance:
      kubectl get managedclusters

      Expected output:

      NAME                     HUB ACCEPTED   MANAGED CLUSTER URLS   JOINED   AVAILABLE   AGE
      managedcluster-c5***z9   true                                  True     True        12d
      managedcluster-c1***e5   true                                  True     True        12d
    2. Replace <clusterid1> and <clusterid2> with the id of the destination clusters.
      apiVersion: core.oam.dev/v1alpha1
      kind: Policy
      metadata:
        name: cluster-beijing
        namespace: demo
      type: topology
      properties:
        clusters: ["<clusterid1>"]
      ---
      apiVersion: core.oam.dev/v1alpha1
      kind: Policy
      metadata:
        name: cluster-hangzhou
        namespace: demo
      type: topology
      properties:
        clusters: ["<clusterid2>"]
      Parameter Description
      type: topology Set the type of the policy to topology. A topology policy specifies the destinations to which Kubernetes resources are deployed.
      properties. clusters You can specify destinations only by cluster id. Each destination can contain one or more clusters that are associated with the master instance.
  4. Run the following command to apply the configurations in the policy-topology.yaml file:
    kubectl apply -f policy-topology.yaml
  5. Create a file named policy-override.yaml with the following content. The number of replicated pods for the Deployment is changed to a different value.
    apiVersion: core.oam.dev/v1alpha1
    kind: Policy
    metadata:
      name: override-replic-beijing
      namespace: demo
    type: override
    properties:
      components:
      - name: "demo"
        traits:
        - type: scaler
          properties:
            replicas: 3
    ---
    apiVersion: core.oam.dev/v1alpha1
    kind: Policy
    metadata:
      name: override-replic-hangzhou
      namespace: demo
    type: override
    properties:
      components:
      - name: "demo"
        traits:
        - type: scaler
          properties:
            replicas: 5
    Parameter Description
    type: override Set the type of the policy to override. You can use an override policy to override the configurations of an application.
    properties. components. name Specify the application whose configurations you want to override.
    properties. components.traits Specify the configuration item that you want to override. In this example, scaler is used to change the number of replicated pods that are deployed for the Deployment.
  6. Run the following command to deploy the application across multiple clusters by using different configurations:
    kubectl apply -f policy-override.yaml
  7. Create a file named workflow.yaml with the following content. The file defines a workflow.
    apiVersion: core.oam.dev/v1alpha1
    kind: Workflow
    metadata:
      name: deploy-demo
      namespace: demo
    steps:
      - type: deploy
        name: deploy-bejing
        properties:
          policies: ["override-replic-beijing", "cluster-beijing"]
      - type: deploy
        name: deploy-hangzhou
        properties:
          policies: ["override-replic-hangzhou", "cluster-hangzhou"]
    Parameter Description
    type: deploy Define the Deploy step in the workflow.
    steps. properties. policies The policy that is used in the Deploy step. The policy specifies the overridden configurations and the clusters in which the overridden configurations are deployed.
  8. Run the following command to deploy the workflow on the master instance. The workflow is used to deploy the application across multiple clusters.
    kubectl apply -f workflow.yaml
  9. Create a file named app.yaml with the following content. The file defines the application.
    apiVersion: core.oam.dev/v1beta1
    kind: Application
    metadata:
      name: demo
      namespace: demo
      annotations:
        app.oam.dev/publishVersion: version1
    spec:
      components:
        - name: demo
          type: ref-objects
          properties:
            objects:
              - apiVersion: apps/v1
                kind: Deployment
                name: demo
      workflow:
        ref: deploy-demo
    Parameter Description
    annotations: app.oam.dev/publishVersion The version of the application. If an application or the Kubernetes resources that are used by an application are updated, you must change the value of this parameter to trigger the master instance to synchronize the updates to the clusters.
    components. type: ref-objects The apiVersion, kind, and name parameters are used to reference Kubernetes resources in the same namespace. The master instance deploys these resources in the specified clusters.
    • ACK One supports the following Kubernetes resources: Deployment/apps/v1, Secret/v1, ConfigMap/v1, and Ingress/networking.k8s.io/v1.
    • If you require other resources, Submit a ticket to contact the ACK One team.
    workflow. ref Specify the workflow that is used to deploy the application.
  10. Run the following command to deploy the application demo on the master instance:
    kubectl apply -f app.yaml
  11. Query the status of the application.
    • Run the following command to query the deployment progress of the application:
      kubectl get app demo -n demo

      Expected output:

      NAME   COMPONENT   TYPE          PHASE     HEALTHY   STATUS   AGE
      demo   demo        ref-objects   running   true               24m
    • Run the following command to query the numbers of replicated pods that are deployed for the Deployment in different destination clusters.

      Replace <clusterid1> with the cluster id in which you want to query. The output shows that the replicated pods are deployed as expected in the clusters.

      kubectl amc get deployment demo -n demo -m <clusterid1>

      Expected output:

      Run on ManagedCluster <clusterid1>
      NAME   READY   UP-TO-DATE   AVAILABLE   AGE
      demo   3/3     3            3           28m
      kubectl amc get deployment demo -n demo -m <clusterid2>

      Expected output:

      Run on ManagedCluster <clusterid1>
      NAME   READY   UP-TO-DATE   AVAILABLE   AGE
      demo   5/5     5            5           28m