在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
如果要使用本地的helm charts,你需要在应用程序. yaml中指定一个部分来定义它。有关更多详细信息,请参见下一节“定义本地chart库”。
定义IBM多云管理器应用程序
多集群应用程序使用Kubernetes SIG应用程序的CRD社区规范,但是对单个集群的资源部署和生命周期管理需要额外的自动化。在本教程中,我们将使用一个作为IBM多云管理器hub集群的IBM Cloud Private集群,并通过它管理多个其它集群。
从创建应用程序. yaml文件开始
在你喜欢的任意一个编辑器中,创建一个名为application.yaml的文件。我们将下面这5个用于在IBM多云管理器中定义应用程序所需的组件来填充它 - Application, Deployable, PlacementPolicy, ApplicationRelationship和PlacementBinding.
有关应用程序组件的更多详细信息,请参见链接:创建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(应用程序)菜单:
单击Create Application(创建应用程序)按钮
将application.yaml文件的全部内容复制并粘贴到打开的编辑器窗口中,并点击Create Application(创建应用程序)。
就这样简单!至此,你已经完成了在IBM多云管理器上定义和部署你的第一个应用程序!
让我们看看从我们的应用程序定义中创建的所有资源。
编辑PlacementPolicy放置策略并确保其生效
例如,我们可以选择编辑placementPolicy,将其中一个可部署对象移动到不同的集群,或者更改集群副本clusterReplicas的数量。
在以下示例中,我们将集群标签clusterLabels更改为{matchLabels: [{name: icp}]}:
点击提交,你将看到更改生效:
如你所见,modernpets可部署对象现在被移动到了名为icp的集群。如果在yaml中指定,IBM多云管理器也可以使用其它值,比如resourceHint(资源提示)或compliance(规则遵从性),来决定将工作负载移动到哪个群集。
IBM多云管理器使用Weavescope来显示所创建的应用程序的拓扑结构:
结论
在本教程中,你看到了如何通过一个简单的application.yaml来创建一个IBM Multicloud Manager 3.1.2应用程序,并告诉IBM Multicloud Manager从哪里获取Helm chart以及在哪里部署它们。