美文网首页工作生活
在IBM多云管理器上创建和部署应用

在IBM多云管理器上创建和部署应用

作者: 老刀IBM | 来源:发表于2019-07-02 17:34 被阅读0次

    在IBM多云管理器上创建和部署应用

    原文标题:Creating and deploying applications to IBM Multicloud Manager
    原文地址:https://medium.com/ibm-cloud/creating-and-deploying-applications-to-ibm-multicloud-manager-410e71604c9b
    作者:Gayatri Renganathan
    发布日期:2019年6月12日

    本文将讨论使用IBM多云管理器(版本3.1.2)创建应用程序并将其部署到多个云的详细过程。

    先决条件: 本教程假设你已经安装了以下命令行工具,并指向安装了IBM多云管理器Hub资源的IBM Cloud Private集群:

       · docker
       · kubectl
       · helm
       · cloudctl

    如果你需要安装这些工具的帮助,请参考命令行界面工具指南链接。

    从一个现有的应用程序开始

    让我们从Github上的一个示例应用程序开始:

    git clone https://github.com/ibm-cloud/jpetstore-kubernetes

    cd jpetstore-kubernetes

    这个petstore示例应用由三个部分组成  —  modernpets、mssearch和一个数据库组成。我们希望将这个应程序打包,以便它可以在云上运行。

    为此,为该应用程序的所有组件构建一个Docker镜像,然后将其推送到你的容器注册表中的命名空间下。在我们的示例中,我们将它推到IBM Cloud Private的私有镜像注册表中的default默认名字空间(namespace)下。

    export REGISTRY=mycluster.icp:8500

    export NAMESPACE=default

    cd jpetstore

    docker build . -t $REGISTRY/$NAMESPACE/jpetstoreweb

    docker push $REGISTRY/$NAMESPACE/jpetstoreweb

    cd jpetstore/db && docker build . -t $REGISTRY/$NAMESPACE/jpetstoredb

    docker push $REGISTRY/$NAMESPACE/jpetstoredb

    cd mmssearch && docker build . -t $REGISTRY/$NAMESPACE/mmssearch

    docker push $REGISTRY/$NAMESPACE/mmssearch

    下一步,为该应用程序的组件创建Helm charts:

    cd helm

    helm package ./modernpets

    helm package ./mmssearch

    这将创建两个.tgz格式的文件。我们现在将这些charts推送到远程集群可以访问的存储库中。这个位置将在我们稍后定义的application.yaml文件的chartURL参数中引用。我们将把我们的charts推向github.com。

    请注意: 你也可以将这些charts上传到本地的Helm库,以便它们显示在ICP集群中名为local-charts的目录中。请参见以下示例:

    cd helm && cloudctl catalog load-chart -a modernpets-0.1.5.tgz -r local-charts

    cd helm && cloudctl catalog load-chart -a mmssearch-0.1.0.tgz -r local-charts

    出现在目录中以“pet”开头的Helm Charts

    如果要使用本地的helm charts,你需要在应用程序. yaml中指定一个部分来定义它。有关更多详细信息,请参见下一节“定义本地chart库”。

    定义IBM多云管理器应用程序

    多集群应用程序使用Kubernetes SIG应用程序的CRD社区规范,但是对单个集群的资源部署和生命周期管理需要额外的自动化。在本教程中,我们将使用一个作为IBM多云管理器hub集群的IBM Cloud Private集群,并通过它管理多个其它集群。

    管理控制台中“集群”列表

    从创建应用程序. yaml文件开始

    在你喜欢的任意一个编辑器中,创建一个名为application.yaml的文件。我们将下面这5个用于在IBM多云管理器中定义应用程序所需的组件来填充它 - ApplicationDeployablePlacementPolicyApplicationRelationshipPlacementBinding.

    有关应用程序组件的更多详细信息,请参见链接:创建IBM多云管理器应用程序资源

    我们从如下所示的空模板开始,并开始填充每个部分:

    apiVersion: app.k8s.io/v1beta1
    kind: Application
    metadata:
    spec:
    ---
    apiVersion: mcm.ibm.com/v1alpha1
    kind: Deployable
    metadata:
    spec:
    ---
    apiVersion: mcm.ibm.com/v1alpha1
    kind: PlacementPolicy
    metadata:
    spec:
    ---
    apiVersion: mcm.ibm.com/v1alpha1
    kind: ApplicationRelationship
    metadata:
    spec:
    ---
    apiVersion: mcm.ibm.com/v1alpha1
    kind: PlacementBinding
    metadata:
    placementRef:
    subjects:
    ---

    现在我们为我们的应用填充这个application.yaml文件的每个部分。首先,我们将yaml文件中的顶层application部分定义如下:

    apiVersion: app.k8s.io/v1beta1
    kind: Application
    metadata:
        namespace: default
        name: jpetstore
        labels:
            name: jpetstore
            app: jpetstore
    spec:
        componentKinds:
            - group: mcm.ibm.com/v1alpha1
                kind: PlacementPolicy
        descriptor: {}
        selector:
            matchLabels:
                app: jpetstore
    ---

    Labels: 选择器用于匹配属于应用程序的资源。所有的应用程序资源都应该有标签,这样它们才能匹配这个选择器。用户应该在应用程序的所有组件上使用app.kubernetes.io/name标签,并设置选择器以匹配该标签。

    例如,我们在这个应用程序中使用了以下选择器,每个组件都应该包含一个与这个名称匹配的标签:

    {"matchLabels": [{"name": "jpetstore"}]}

    ComponentKinds: 该组类型数组用于指示组成应用程序的资源类型。我们的示例应用程序有一个放置策略(PlacementPolicy),因此我们将该字段定义如下:

    [{"group":"mcm.ibm.com/v1alpha1","kind": "PlacementPolicy"}]

    可选:定义本地chart库

    如果应用程序的Helm charts被上传到本地的仓库,那么我们需要在application.yaml文件中包含如下的一个部分:

    apiVersion: mcm.ibm.com/v1alpha1
    kind: HelmRepo
    metadata:
        namespace: default
        name: local-charts
        annotations:
            mcm.ibm.com/hub-cluster-repo: "true"
        spec:
        url: >-
            https://mycluster.icp:8443/helm-repo/charts
    ---

    定义Deployable(可部署资源)

    使用Deployable资源实际部署你的Helm chart。我们的应用程序有两个叫做mssearch和modernpets的chart。这将创建两个独立的Deployable资源,以此IBM多云管理器将基于在chartURL参数中指定的位置,部署这两个Helm Charts。

    apiVersion: mcm.ibm.com/v1alpha1
    kind: Deployable
    metadata:
        name: mmssearch
        namespace: default
        labels:
            name: mmssearch
            app: jpetstore
            serviceKind: ApplicationService
    spec:
        deployer:
            kind: helm
            helm:
                chartURL: >-
                    https://raw.githubusercontent.com/cae-ibm/jpetstore-kubernetes/master/helm/mmssearch-0.1.0.tgz
                namespace: default
                version: 0.1.0
    ---
    apiVersion: mcm.ibm.com/v1alpha1
    kind: Deployable
    metadata:
        name: modernpets
        namespace: default
        labels:
            name: modernpets
            app: jpetstore
            serviceKind: ApplicationService
    spec:
        deployer:
            kind: helm
            helm:
                chartURL: >-
                    https://raw.githubusercontent.com/cae-ibm/jpetstore-kubernetes/master/helm/modernpets-0.1.5.tgz
                namespace: default
                version: 0.1.5
    ---

    可选: 如果charts位于上一节定义的本地chart库中,则可以替换spec.deployer.chartURL来指向本地chart。例如,如果你想使用本地chart库中的mmssearch,那么可部署的资源将定义如下:

    apiVersion: mcm.ibm.com/v1alpha1
    kind: Deployable
    metadata:
        name: mmssearch
        namespace: default
        labels:
            name: mmssearch
            app: jpetstore
            serviceKind: ApplicationService
    spec:
        deployer:
            kind: helm
            helm:
                repository: local-charts
                chartName: mmssearch
                chartVersion: 0.1.0
    ---

    定义PlacementPolicy(放置策略)

    PlacementPolicy定义了IBM多云管理器用来查找群集以放置或部署工作负载的标准。我们还可以定义要部署多少副本。例如,在下面的简单示例中,我们希望将两个可部署对象的一个实例部署到public集群,因此我们将PlacementPolicy定义如下。如果需要,我们可以稍后编辑。

    apiVersion: mcm.ibm.com/v1alpha1
    kind: PlacementPolicy
    metadata:
        name: mmssearch
        labels:
            name: jpetstore
            app: jpetstore
        namespace: default
    spec:
        clusterLabels:
            matchLabels:
                name: iks
        clusterReplicas: 2
    ---
    apiVersion: mcm.ibm.com/v1alpha1
    kind: PlacementPolicy
    metadata:
        name: modernpets
        labels:
            name: jpetstore
            app: jpetstore
        namespace: default
    spec:
        clusterLabels:
            matchLabels:
                name: iks
        clusterReplicas: 1
    ---

    定义ApplicationRelationship(应用程序关系)

    ApplicationRelationship定义应用程序内部组件之间的关系。对于我们的应用程序,应用程序jpetstore包含两个可部署资源。因此,我们将ApplicationRelationship定义为:type: contains,如下所示:

    apiVersion: mcm.ibm.com/v1alpha1
    kind: ApplicationRelationship
    metadata:
        name: mmssearch-apprelation
        labels:
            app: jpetstore
            destinationKind: Deployable
            destinationName: mmssearch
            sourceKind: Application
            sourceName: jpetstore
    namespace: default
    spec:
    destination:
        name: mmssearch
        kind: Deployable
    source:
        name: jpetstore
        kind: Application
    type: contains
    ---
    apiVersion: mcm.ibm.com/v1alpha1
    kind: ApplicationRelationship
    metadata:
    name: modernpets-apprelation
    labels:
        app: jpetstore
        destinationKind: Deployable
        destinationName: modernpets
        sourceKind: Application
        sourceName: jpetstore
    namespace: default
    spec:
    destination:
        name: modernpets
        kind: Deployable
    source:
        name: jpetstore
        kind: Application
    type: contains
    ---

    定义PlacementBinding

    PlacementBinding定义了如何将PlacementPolicy(放置策略规则)绑定到特定的可部署对象。因此,我们为每个可部署的资源定义PlacementBinding资源,并将其与相应的PlacementPolicy绑定,如下所示:

    apiVersion: mcm.ibm.com/v1alpha1
    kind: PlacementBinding
    metadata:
        labels:
            app: jpetstore
            name: jpetstore
            placementPolicy: jpetstore
        name: mmssearch-placementbinding
    placementRef:
        apiGroup: mcm.ibm.com
        kind: PlacementPolicy
        name: mmssearch
    subjects:
    - apiGroup: mcm.ibm.com
        kind: Deployable
        name: mmssearch
    ---
    apiVersion: mcm.ibm.com/v1alpha1
    kind: PlacementBinding
    metadata:
        labels:
            app: jpetstore
            name: jpetstore
            placementPolicy: jpetstore
        name: modernpets-placementbinding
    placementRef:
        apiGroup: mcm.ibm.com
        kind: PlacementPolicy
        name: modernpets
    subjects:
    - apiGroup: mcm.ibm.com
        kind: Deployable
        name: modernpets
    ---

    保存此application.yaml文件。

    在IBM多云管理器中创建应用程序

    我们可以使用命令行界面或控制台在IBM多云管理器中创建应用程序。

    使用命令行界面,你只需执行以下操作:

    kubectl create -f application.yaml

    使用IBM多云管理器的控制台,我们转到左侧主菜单上的Applications(应用程序)菜单:

    IBM Multicloud Manager菜单

    单击Create Application(创建应用程序)按钮

    点击创建应用程序按钮

    将application.yaml文件的全部内容复制并粘贴到打开的编辑器窗口中,并点击Create Application(创建应用程序)。

    创建应用程序窗口

    就这样简单!至此,你已经完成了在IBM多云管理器上定义和部署你的第一个应用程序!

    让我们看看从我们的应用程序定义中创建的所有资源。

    Applications列表 应用程序的细节 应用程序部署的细节信息

    编辑PlacementPolicy放置策略并确保其生效

    例如,我们可以选择编辑placementPolicy,将其中一个可部署对象移动到不同的集群,或者更改集群副本clusterReplicas的数量。

    放置策略

    在以下示例中,我们将集群标签clusterLabels更改为{matchLabels: [{name: icp}]}:

    管理控制台中的编辑器,clusterLabels有所更改

    点击提交,你将看到更改生效:

    放置策略变更生效

    如你所见,modernpets可部署对象现在被移动到了名为icp的集群。如果在yaml中指定,IBM多云管理器也可以使用其它值,比如resourceHint(资源提示)或compliance(规则遵从性),来决定将工作负载移动到哪个群集。

    IBM多云管理器使用Weavescope来显示所创建的应用程序的拓扑结构:

    应用拓扑图

    结论

    在本教程中,你看到了如何通过一个简单的application.yaml来创建一个IBM Multicloud Manager 3.1.2应用程序,并告诉IBM Multicloud Manager从哪里获取Helm chart以及在哪里部署它们。

    相关文章

      网友评论

        本文标题:在IBM多云管理器上创建和部署应用

        本文链接:https://www.haomeiwen.com/subject/dwkzcctx.html