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

前提条件

  • 开发者用户从ACK One控制台获取主控实例的KubeConfig,通过Kubectl连接至主控实例。

  • 主控实例管理员(实例创建者)已配置命名空间和配额。具体操作,请参见管理命名空间与配额

  • 主控实例已添加多个关联集群。具体操作,请参见添加关联集群
  • 安装AMC命令行工具。具体操作,请参见AMC命令行帮助

创建应用

  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. 执行以下命令,在主控实例上部署应用demo
    kubectl apply -f app-meta.yaml
  4. 使用以下内容,创建app.yaml,定义开源KubeVela Application demo,实现多集群分发。
    1. 执行以下命令,查看主控实例管理的关联集群,确定应用分发的目标集群。
      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. 执行以下命令,在主控实例上部署应用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