红帽高级集群管理和应用程序管理,第1部分:在多种环境中的部署

我们将展开一系列文章,其中将向您展示高级集群管理(ACM)如何提供丰富的功能来管理需要同时存在于多个环境(无论是在云中还是在企业数据中心中)的应用程序的生命周期。



今天,我们将重点介绍ACM的GitOps方面,并使用以下模型配置对其进行细分:







因此,这里有三个OpenShift集群。ACM使用集线器管理的模型来管理集群,其中hub是运行ACM的集群,被管理是ACM管理的集群。该中心使用以下Red Hat软件:



通过
红帽OpenShift容器平台 4.5.7
红帽高级集群管理 2.0修订包2.0.2


请注意,托管群集具有不同的标签,将应用程序放置在不同环境中时,我们将积极使用它们。



如图所示,我们在欧盟区域的AWS云中部署了一个称为Managed-Cluster1-dev的托管开发集群。在美国地区,还有一个托管生产集群,称为Managed-Cluster2-prod,该集群也已部署到AWS。



应用程序生命周期



ACM为应用程序生命周期管理提供了广泛的功能。在这里,我们将研究属于GitOps类别的类别,它们将在以下情况下派上用场:



  • 将您的应用程序部署到多个环境。
  • 部署蓝色/绿色。
  • 应用程序迁移。
  • 灾难恢复


首先,让我们定义我们将在本文中使用的术语和概念。



通道



通道指向存储要部署的资源的物理位置。在这里,我们将使用Git类型的管道,尽管还有其他类型的管道(Helm,命名空间等)。



了解更多



PlacementRules



通过创建和管理放置规则,您可以定义Kubernetes资源订阅和Helm版本的部署位置。通过应用这些规则,可以大大简化跨多个环境的Kubernetes资源部署。



了解更多



订阅



订阅是用于使用注释,标签和版本在渠道中选择Kubernetes资源的一组定义。订阅资源在集线器上设置,并推送到托管群集。订阅控制器监视源位置(通道)是否有新资源或更新资源。发生这种情况时,他可以直接从源位置(通道)将相应的资源下载到托管群集,而无需先检查集线器群集(因为已发送订阅)。



该订阅可以过滤Helm版本以选择图表的正确版本。在这种情况下,订阅控制器将查看version参数,以了解应采用哪个版本的Helm发布(图表)进行部署。



更多



应用



可以将Application对象视为一种将订阅聚合到一个组中的方法。为此,有相应的工具和控制台来执行聚合并查看应用程序的所有组件。



更多细节



Git仓库



我们的应用程序将根据GitOps模板进行部署,对于不同的环境,您将需要不同的清单,这些清单将存储在Git存储库中,其结构如下表所示:



描述
设定档 存储在所有环境中使用的应用程序的基本文件
产品 存储生产环境中使用的应用程序的覆盖文件
阶段 存储测试环境中使用的应用程序的覆盖文件


注意。红帽ACM限制了您构建Git存储库的方式。它不仅可以按此表中所示进行组织,还可以通过其他方便的方式进行组织。



将应用程序部署到多个环境



现在,让我们看一下ACM如何使用一个简单的Web服务将字词转换为跨多个环境来部署您的应用程序。该服务有两个版本:阶段(这是开发人员当前正在测试的版本)和生产(这是客户正在使用的版本)。



ACM支持Kustomize,这使得为目标部署环境自定义应用程序非常容易。



如前所述,在两种环境中,我们使用相同的应用程序,但仅在不同的发行版中使用。



要部署该应用程序,我们将使用oc工具和一组yaml清单,以及ACM的必要配置,这些配置设置Channel,Subscription和PlacementRule。我们从命令行执行的所有操作都可以从Web控制台完成。



在oc工具中,我们将配置三个上下文,每个环境一个:



语境 描述
枢纽 HUB集群(已部署ACM的)的CLI配置文件
开发人员 托管开发集群(managed-cluster1-dev)的CLI配置文件
专业版 托管生产集群的CLI配置文件(managed-cluster2-prod)


您可以在此处阅读有关CLI配置文件的更多信息



现在让我们看一下将在示例中使用的资源:



Channel



apiVersion: apps.open-cluster-management.io/v1
kind: Channel
metadata:
  name: acm-app-lifecycle-blog
  namespace: open-cluster-management
spec:
  type: Git
  pathname: https://github.com/RHsyseng/acm-app-lifecycle-blog.git


我们将Channel设置为一个Git Channel,我们的订阅将使用它来获取Kubernetes资源来部署我们的应用程序。



在我们的例子中,该通道配置为从git存储库github.com/RHsyseng/acm-app-lifecycle-blog.git接收Kubernetes资源。



命名空间



apiVersion: v1
kind: Namespace
metadata:
  name: reverse-words-stage


当我们使用订阅时,包含该订阅的名称空间将传递到目标部署集群。因此,我们在这里创建了一个名为反向单词阶段的名称空间,该名称空间将通过此订阅推送到我们的开发集群中。



刊登位置规则



apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
  name: development-clusters
  namespace: reverse-words-stage
spec:
  clusterConditions:
    - type: "ManagedClusterConditionAvailable"
      status: "True"
  clusterSelector:
    matchExpressions: []
    matchLabels:
      environment: "dev"


从PlacementRule返回的内容中获取传递订阅的群集列表。换句话说,我们需要以某种方式从我们的环境,选择特定的集群,并将它们转移到不同的订阅,这正是PlacementRules solve.In任务



我们的例子中,PlacementRule命名发展集群返回标记为可用的所有集群,并且采用符合环境条件的标签:开发人员。也就是说,在我们的例子中,输出将是一个名为deved-cluster1-dev的托管dev-cluster。



订阅



apiVersion: apps.open-cluster-management.io/v1
kind: Subscription
metadata:
  name: reversewords-dev-app-subscription
  namespace: reverse-words-stage
  labels:
    app: reversewords-dev-app
  annotations:
    apps.open-cluster-management.io/git-path: apps/reversewords/
    apps.open-cluster-management.io/git-branch: stage
spec:
  channel: open-cluster-management/acm-app-lifecycle-blog
  placement:
    placementRef:
      kind: PlacementRule
      name: development-clusters


在上面的示例中,Subscription负责将Kubernetes资源列表(从Channel获取)部署到列表中的集群(从PlacementRule获取)。但是除此之外,您还可以指定这些Kubernetes资源在Git存储库(通道)中的确切位置。



我们的订阅使用上面定义的Channel并从stage分支中获取Kubernetes资源,该资源会在apps / reversewords /文件夹中查找它们。



应用



apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
  name: reversewords-dev-app
  namespace: reverse-words-stage
spec:
  componentKinds:
  - group: apps.open-cluster-management.io
    kind: Subscription
  descriptor: {}
  selector:
    matchExpressions:
    - key: app
      operator: In
      values:
      - reversewords-dev-app


应用程序有助于在ACM管理的群集上创建我们的应用程序的拓扑。为此,应用程序选择一个或多个订阅,这些订阅最终将在各个群集上创建资源,因此我们可以跟踪谁创建了什么以及创建的位置。



注意。在这里,我们仅介绍了在开发环境中部署应用程序时将使用的那些资源。可以在GitHub存储库中找到其他环境的资源,这些资源很容易解释,并且与我们介绍的资源类似。



在开发环境中部署应用程序





1.第一步是创建一个通道定义。



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/base/00_channel.yaml


2.接下来,我们创建一个命名空间来存储我们的应用程序清单。



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/00_namespace.yaml


3.现在,我们创建一个PlacementRule,它将选择我们的托管开发集群。



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/01_placement_rule.yaml


查看PlacementRule的状态。请注意,此规则选择了managed-cluster1-dev dev-cluster:



oc --context hub -n reverse-words-stage get placementrule development-clusters -o yaml

<OMITTED_OUTPUT>
status:
  decisions:
  - clusterName: managed-cluster1-dev
    clusterNamespace: managed-cluster1-dev


4.现在,您可以使用PlacementRule创建一个以开发集群为目标的订阅和应用程序。



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/02_subscription-dev.yaml
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-stage/03_application-dev.yaml


请参阅订阅状态。注意“传播”一词,这意味着订阅已发送到目标集群:



oc --context hub -n reverse-words-stage get subscription reversewords-dev-app-subscription -o yaml
<OMITTED_OUTPUT>
status:
  message: Active
  phase: Propagated


5.最后,我们看一下dev-cluster,发现该应用程序已经部署并且正在运行。



oc --context dev -n reverse-words-stage get deployments,services,pods
NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/reverse-words   1/1     1            1           73s

NAME                    TYPE           CLUSTER-IP       EXTERNAL-IP                                                              PORT(S)          AGE
service/reverse-words   LoadBalancer   172.30.217.208   a84668cb23acf4d109a78b119dfddbef-750551.eu-central-1.elb.amazonaws.com   8080:30053/TCP   73s

NAME                                 READY   STATUS    RESTARTS   AGE
pod/reverse-words-68b9b894dd-jfgpf   1/1     Running   0          73s


如果尝试执行对生产集群的请求,我们将看到该应用程序未在其中运行。



oc --context pro -n reverse-words-stage get deployments,services,pods
No resources found in reverse-words-stage namespace.


6.现在,我们对应用程序执行一个请求,并确保我们已经部署了所需的发行版,即登台:



curl http://$(oc --context dev -n reverse-words-stage get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
Reverse Words Release: Stage Release v0.0.3. App version: v0.0.3


在生产环境中部署应用程序





1.无需创建新的Channel,因为我们将使用相同的Git存储库作为源,但仅使用不同的分支。



2.创建一个命名空间来存储我们的应用程序清单。



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/00_namespace.yaml


3.现在,我们创建一个PlacementRule来选择生产集群:



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/01_placement_rule.yaml


查看PlacementRule的状态。请注意,此规则选择了Managed-Cluster2-Prod生产集群。



oc --context hub -n reverse-words-prod get placementrule production-clusters -o yaml

<OMITTED_OUTPUT>
status:
  decisions:
  - clusterName: managed-cluster2-prod
    clusterNamespace: managed-cluster2-prod


4.现在,您可以使用PlacementRule创建一个Subscription and Application,将生产集群设置为目标。



oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/02_subscription-pro.yaml
oc --context hub create -f https://raw.githubusercontent.com/RHsyseng/acm-app-lifecycle-blog/master/acm-manifests/reversewords-prod/03_application-pro.yaml


请参阅订阅状态。注意“传播”一词,这意味着订阅已发送到目标集群:



oc --context hub -n reverse-words-prod get subscription reversewords-pro-app-subscription -o yaml

<OMITTED_OUTPUT>
status:
  message: Active
  phase: Propagated


5.最后,我们查看生产集群,看看该应用程序已经部署并且正在运行。



oc --context pro -n reverse-words-prod get deployments,services,pods
NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.extensions/reverse-words   1/1     1            1           93s

NAME                    TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
service/reverse-words   LoadBalancer   172.30.100.0   a6067d9a2cd904003a1b53b65f9e1cb3-450574743.us-west-2.elb.amazonaws.com   8080:30293/TCP   96s

NAME                                READY   STATUS    RESTARTS   AGE
pod/reverse-words-7dd94446c-vkzr8   1/1     Running   0          94s


6.现在,我们对应用程序运行一个请求,并确保我们已经部署了所需的发行版,即生产版:



curl http://$(oc --context pro -n reverse-words-prod get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
Reverse Words Release: Production release v0.0.2. App version: v0.0.2


7.现在,我们为不同的部署环境提供了不同版本的应用程序:



# Query development environment
curl http://$(oc --context dev -n reverse-words-stage get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
# Query production environment
curl http://$(oc --context pro -n reverse-words-prod get service reverse-words -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'):8080
# Dev Query
Reverse Words Release: Stage Release v0.0.3. App version: v0.0.3
# Pro Query
Reverse Words Release: Production release v0.0.2. App version: v0.0.2


最后,让我们看看它在Web控制台中的外观:



ACM应用程序常规视图







ACM开发应用程序视图







未完待续



在下一篇文章中,我们将向您展示如何使用ACM进行蓝色/绿色部署,应用程序迁移和灾难恢复。



All Articles