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
- 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
- Run the following command to deploy an application named
demo
on a master instance: kubectl apply -f app-meta.yaml
- 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.
- 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
- 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>"]
- Run the following command to apply the configurations in the policy-topology.yaml
file:
kubectl apply -f policy-topology.yaml
- 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.
- Run the following command to deploy the workflow on the master instance:
kubectl apply -f workflow.yaml
- 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. |
- Run the following command to deploy the application
demo
on the master instance: kubectl apply -f app.yaml
- 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
- 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
- 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
- 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