在应用的多集群分发部署中,您可以使用ACK One应用发布的工作流功能,实现应用在集群间分批发布。例如,您可以将应用先发布到测试集群,经验证后再发布到生产集群,用来控制发布风险。本文通过示例应用的部署介绍如何在Fleet实例中实现集群间灰度分发。
前提条件
已开启舰队管理功能。具体操作,请参见开启舰队管理功能。
舰队的Fleet实例已添加多个关联集群。具体操作,请参见添加关联集群。
已从ACK One控制台获取Fleet实例的KubeConfig,并通过kubectl连接至Fleet实例。
已安装AMC命令行工具。具体操作,请参见AMC命令行帮助。
操作步骤
使用以下内容,创建app-meta.yaml文件,包含应用相关的Kubernetes原生资源。
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
执行以下命令,在Fleet实例上部署应用
demo
。kubectl apply -f app-meta.yaml
使用以下内容,创建policy-topology.yaml。定义分发的目标集群是测试集群
cluster-test
和生产集群cluster-prod
。执行以下命令,查看Fleet实例管理的关联集群,确定应用分发的目标集群。
kubectl get managedclusters
预期输出:
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE managedcluster-c5***z9 true True True 12d managedcluster-c1***e5 true True True 12d
选择对应目标集群,替换如下示例中的
<clusterid1>
和<clusterid2>
为待发布的目标集群ID。
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>"]
执行以下命令,在Fleet实例上部署多集群应用的分发策略。
kubectl apply -f policy-topology.yaml
使用以下内容,创建workflow.yaml,定义工作流。
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"]
说明在workflow的
deploy-prod
中增加auto: false
,表示执行deploy-pod
步骤前需要人工确认。执行以下命令,在Fleet实例上部署多集群应用工作流。
kubectl apply -f workflow.yaml
使用以下内容,创建app.yaml,定义应用。
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
参数
说明
annotations: app.oam.dev/publishVersion
应用的版本控制,当应用或应用引用的Kubernetes资源发生变化时,必须更新此字段,才能触发向目标集群的分发。
components. type: ref-objects
通过
apiVersion
、kind
和name
引用同命名空间下的Kubernetes资源,应用将下发这些资源到目标关联集群中。目前ACK One支持的应用Kubernetes资源包括
Deployment/apps/v1
、Secret/v1
、ConfigMap/v1
、Ingress/networking.k8s.io/v1
。如需分发其他资源的需求,请提交工单联系ACK One团队。
workflow. ref
定义Application部署使用的工作流。
执行以下命令,在Fleet实例上部署应用
demo
。kubectl apply -f app.yaml
执行以下命令查看应用部署状态。
可以看到应用
demo
处于workflowSuspending
状态。kubectl get app demo -n demo
预期输出:
NAME COMPONENT TYPE PHASE HEALTHY STATUS AGE demo demo ref-objects workflowSuspending true 38s
执行以下命令,查看Deployment资源在各集群上的部署状态。
替换其中
<clusterid1>
和<clusterid2>
为待查看的目标集群ID。可以看到测试集群已部署,但生产集群没有部署。执行以下命令,查看测试集群cluster-test部署状态。
kubectl amc get deployment demo -n demo -m <clusterid1>
预期输出:
Run on ManagedCluster <clusterid1> NAME READY UP-TO-DATE AVAILABLE AGE demo 1/1 1 1 2m
执行以下命令,查看生产集群cluster-prod部署状态。
kubectl amc get deployment demo -n demo -m <clusterid2>
预期输出:
Run on ManagedCluster <clusterid2> Error from server (NotFound): deployments.apps "demo" not found
执行以下命令,继续运行workflow将其部署到生产集群。
kubectl amc workflow resume demo -n demo
预期输出:
Successfully resume workflow: demo
查看Deployment资源在生产集群的部署状态。
可以看到生产集群已部署。
kubectl amc get deployment demo -n demo -m <clusterid2>
预期输出:
Run on ManagedCluster <clusterid2> NAME READY UP-TO-DATE AVAILABLE AGE demo 1/1 1 1 8m