Container Service for Kubernetes (ACK) One provides the workflows feature. This feature allows you to use canary release to deploy an application. For example, you can first deploy an application in a testing cluster. If the application passes the test, you can deploy the application in production clusters. This helps minimize potential risks. This topic describes how to use canary release on a master instance to deploy an application.

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: Specify the testing cluster cluster-test and the production cluster cluster-prod as the destination clusters.
    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 testing cluster and the production cluster.
    apiVersion: core.oam.dev/v1alpha1
    kind: Policy
    metadata:
      name: cluster-test
      namespace: demo
    type: topology
    properties:
      clusters: ["<clusterid1>"]
    ---
    apiVersion: core.oam.dev/v1alpha1
    kind: Policy
    metadata:
      name: cluster-prod
      namespace: demo
    type: topology
    properties:
      clusters: ["<clusterid2>"]
  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 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-test
        properties:
          policies: ["cluster-test"]
      - type: deploy
        name: deploy-prod
        properties:
          auto: false
          policies: ["cluster-prod"]
    Note Add auto: false under deploy-prod in the workflow file. After you add this setting, the system requires a confirmation before it can perform the deploy-pod step.
  6. Run the following command to deploy the workflow on the master instance:
    kubectl apply -f workflow.yaml
  7. 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.
  8. Run the following command to deploy the application demo on the master instance:
    kubectl apply -f app.yaml
  9. Run the following command to query the deployment progress of the application.
    The output shows that the application demo is in the workflowSuspending state.
    kubectl get app demo -n demo

    Expected output:

    NAME   COMPONENT   TYPE          PHASE                HEALTHY   STATUS   AGE
    demo   demo        ref-objects   workflowSuspending   true               38s
  10. Run the following command to query the status of the Deployment in both clusters.
    Replace <clusterid1> and <clusterid2>with the cluster id in which you want to query. The output shows that the Deployment is deployed in the testing cluster but is not deployed in the production cluster.
    • Run the following command to query the status of the Deployment in the cluster cluster-test:
      kubectl amc get deployment demo -n demo -m <clusterid1>

      Expected output:

      Run on ManagedCluster <clusterid1>
      NAME   READY   UP-TO-DATE   AVAILABLE   AGE
      demo   1/1     1            1           2m
    • Run the following command to query the status of the Deployment in the cluster cluster-prod:
      kubectl amc get deployment demo -n demo -m <clusterid2>

      Expected output:

      Run on ManagedCluster <clusterid2>
      Error from server (NotFound): deployments.apps "demo" not found
  11. Run the following command to deploy the Deployment in the production cluster:
    kubectl amc workflow resume demo -n demo

    Expected output:

    Successfully resume workflow: demo
  12. Query the status of the Deployment in the production cluster.
    The output shows that the Deployment is deployed in the production cluster.
    kubectl amc get deployment demo -n demo -m <clusterid2>

    Expected output:

    Run on ManagedCluster <clusterid2>
    NAME   READY   UP-TO-DATE   AVAILABLE   AGE
    demo   1/1     1            1           8m