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

在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多云管理器上创建和部署应用)