在应用的多集群分发部署中,您可以使用ACK One应用发布的工作流功能,实现应用在集群间分批发布。例如您可以将应用先发布到测试集群,经验证后再发布到生产集群,用来控制发布风险。本文通过示例应用的部署介绍如何在主控实例上实现集群间灰度分发。
操作步骤
- 使用以下内容,创建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
- 执行以下命令,在主控实例上部署应用
demo
。kubectl apply -f app-meta.yaml
- 使用以下内容,创建policy-topology.yaml。定义分发的目标集群是测试集群
cluster-test
和生产集群cluster-prod
。
- 执行以下命令,查看主控实例管理的关联集群,确定应用分发的目标集群。
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>"]
- 执行以下命令,在主控实例上部署多集群应用的分发策略。
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
步骤前需要人工确认。
- 执行以下命令,在主控实例上部署多集群应用工作流。
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部署使用的工作流。 |
- 执行以下命令,在主控实例上部署应用
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