应用复制分发

您可以通过访问ACK One Fleet实例,向多个集群下发Deployment、Service和Ingress等Kubernetes原生资源,包括创建应用相关的Kubernetes原生资源、创建应用部署目标、创建应用等,实现多集群复制部署和查看应用状态。本文通过示例应用的部署介绍ACK One Fleet实例如何分发应用。

前提条件

创建应用

  1. 执行以下命令创建命名空间。
    替换<your-namespace>为待创建的命名空间名称。
    kubectl create namespace <your-namespace>
  2. 使用以下内容,创建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
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: demo
      namespace: demo
      labels:
        app: demo
    type: Opaque
    data:
      version: MQ==
    ---
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: demo-1
      namespace: demo
      labels:
        app: demo
    data:
      version: "1"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: demo
      namespace: demo
      labels:
        app: demo
    spec:
      selector:
        app: demo
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    ---
    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: demo
      namespace: demo
      labels:
        app: demo
    spec:
      rules:
        - host: app.demo.example.com
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: demo
                  port:
                    number: 80
  3. 执行以下命令,在Fleet实例上部署应用demo

    kubectl apply -f app-meta.yaml
  4. 使用以下内容,创建app.yaml,定义开源KubeVela Application demo,实现多集群分发。

    1. 执行以下命令,查看Fleet实例管理的关联集群,确定应用分发的目标集群。

      kubectl get managedclusters

      预期输出:

      NAME                     HUB ACCEPTED   MANAGED CLUSTER URLS   JOINED   AVAILABLE   AGE
      managedcluster-c5****    true                                  True     True        12d
      managedcluster-c1****    true                                  True     True        12d
    2. 选择对应目标集群,替换如下示例中的<clusterid1><clusterid2>为待发布的目标集群ID。

      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
                - apiVersion: v1
                  kind: ConfigMap
                  selector:
                    app: demo
                - apiVersion: v1
                  kind: Secret
                  name: demo
                - apiVersion: v1
                  kind: Service
                  name: demo
                - apiVersion: networking.k8s.io/v1
                  kind: Ingress
                  name: demo
        policies:
          - type: topology
            name: beijing-clusters
            properties:
              clusters: ["<clusterid1>", "<clusterid2>"]  # 定义下发的目标集群,如需更新目标集群,可在此字段新增或修改。
                              

      参数

      说明

      annotations. app.oam.dev/publishVersion

      应用的版本控制,当应用或应用引用的Kubernetes资源发生变化时,必须更新此字段,才能触发向目标集群的分发。

      components. type: ref-objects

      通过apiVersionkindname引用同命名空间下的Kubernetes资源,应用将下发这些资源到目标关联集群中。

      • 目前ACK One支持的应用Kubernetes资源包括Deployment/apps/v1Secret/v1ConfigMap/v1Ingress/networking.k8s.io/v1

      • 如有分发其他资源的需求,请提交工单联系ACK One团队。

      policies. type: topology

      定义应用资源的下发目标。

      policies. properties. clusters

      目前支持通过关联集群ID定义下发目标,一个下发目标可以包含一个或多个集群。

  5. 执行以下命令,在Fleet实例上部署应用demo

    kubectl apply -f app.yaml
  6. 查看应用部署状态。

    kubectl get app demo -n demo

    预期输出:

    NAME   COMPONENT   TYPE          PHASE     HEALTHY   STATUS   AGE
    demo   demo        ref-objects   running   true               24m
  7. 查看应用的多集群部署详情,获取各Kubernetes资源在每个目标集群的部署状态。

    kubectl get app demo -n demo -o yaml
    ......
    status:
      appliedResources:
      - apiVersion: apps/v1
        cluster: <clusterid1>
        creator: workflow
        kind: Deployment
        name: demo
        namespace: demo
      - apiVersion: v1
        cluster: <clusterid1>
        creator: workflow
        kind: ConfigMap
        name: demo-1
        namespace: demo
      - apiVersion: v1
        cluster: <clusterid1>
        creator: workflow
        kind: Secret
        name: demo
        namespace: demo
      - apiVersion: networking.k8s.io/v1
        cluster: <clusterid1>
        creator: workflow
        kind: Ingress
        name: demo
        namespace: demo
      - apiVersion: apps/v1
        cluster: <clusterid2>
        creator: workflow
        kind: Deployment
        name: demo
        namespace: demo
      - apiVersion: v1
        cluster: <clusterid2>
        creator: workflow
        kind: ConfigMap
        name: demo-1
        namespace: demo
      - apiVersion: v1
        cluster: <clusterid2>
        creator: workflow
        kind: Secret
        name: demo
        namespace: demo
      - apiVersion: networking.k8s.io/v1
        cluster: <clusterid2>
        creator: workflow
        kind: Ingress
        name: demo
        namespace: demo
  8. 查看Kubernetes资源在某个集群上的运行状态。

    替换其中<clusterid1>为待查看的目标集群ID。

    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           28m
    kubectl amc get pod -n demo -m <clusterid1>

    预期输出:

    Run on ManagedCluster <clusterid1>
    NAME                    READY   STATUS      RESTARTS   AGE
    demo-7c96b5bffd-****   1/1     Running     0          30m

更新应用引用的Kubernetes资源

如需更新应用引用的Kubernetes资源,请参考如下步骤操作。

  1. 通过kubectl apply命令,修改创建应用步骤2中的Kubernetes资源。

    您可以对Kubernetes资源做任意的修改,例如Deployment的image、Service的Port,ConfigMap. Secret中配置数据的修改,任何修改都会被同步到目标集群中。

  2. 通过kubectl apply命令,修改创建应用步骤4中的Application资源。需要修改annotations: app.oam.dev/publishVersion: version1以触发所引用的Kubernetes资源向目标集群的下发。

    例如可以修改app.oam.dev/publishVersionversion2

  3. 参考步骤6、步骤7和步骤8查看应用状态。

删除应用

执行以下命令删除应用。删除后对应目标集群上的Kubernetes资源将被删除。

kubectl delete app demo -n demo