《OpenShift / RHEL / DevSecOps 汇总目录》
本文在 OpenShift 4.15 + RHACM 2.10 环境中进行验证。
RHACM 是如何部署应用的
RHACM 使用如下一些概念来统一管理应用生命周期。
- Application:组成一个应用的所有 Kubernetes 资源。
- Channel:获取应用部署资源的渠道,RHACM 支持 Git,Helm 和对象存储。
- PlacementRule:定义应用部署的目标集群。
- Subscription:绑定 Channel 和 PlacementRule。
向被管集群部署应用
我们可以使用 RHACM 中的 Applications 在多云环境统一部署应用。RHACM 除了本身支持应用生命周期管理外,还支持通过集成 ArgoCD 和 Ansible 部署应用和管理应用生命周期。
- 先在 RHACM 控制台中为一个被管 OpenShift 集群(例如 ocp-cluster-1)添加 “environment=dev” 的标签。
- 执行命令,创建 Channel 指向应用 Git 源。注意:上游 Git Repo 中的 04.Application-Lifecycle/exercise-application/application-resources/configmap.yaml 中对象名称和 deployment.yaml 中使用的名称不同,导致错误。
$ oc new-project webserver-acm
$ cat << EOF | oc apply -f -
---
apiVersion: apps.open-cluster-management.io/v1
kind: Channel
metadata:
name: webserver-app
namespace: webserver-acm
spec:
type: Git
pathname: https://github.com/liuxiaoyu-git/rhacm-workshop-1
EOF
- 创建 PlacementRule,它基于 environment=dev 的标签选择部部署的目标集群。
$ cat << EOF | oc apply -f -
---
apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
name: dev-clusters
namespace: webserver-acm
spec:
clusterConditions:
- type: ManagedClusterConditionAvailable
status: "True"
clusterSelector:
matchLabels:
environment: dev
EOF
- 创建 Subscription,它绑定 PlacementRule 和 Channel。
$ cat << EOF | oc apply -f -
apiVersion: apps.open-cluster-management.io/v1
kind: Subscription
metadata:
name: webserver-app-dev
namespace: webserver-acm
labels:
app: webserver-app
annotations:
apps.open-cluster-management.io/github-path: 04.Application-Lifecycle/exercise-application/application-resources
apps.open-cluster-management.io/git-branch: dev
spec:
channel: webserver-acm/webserver-app
placement:
placementRef:
kind: PlacementRule
name: dev-clusters
EOF
- 创建 Application,并通过 “app: webserver-app” 标签和 Subscription 关联起来。
$ cat << EOF | oc apply -f -
apiVersion: app.k8s.io/v1beta1
kind: Application
metadata:
name: webserver-app
namespace: webserver-acm
spec:
componentKinds:
- group: apps.open-cluster-management.io
kind: Subscription
descriptor: {}
selector:
matchExpressions:
- key: app
operator: In
values:
- webserver-app
EOF
在创建完可以在 RHACS 控制台的 “应用程序” 中通过过滤器看到 webserver-app 应用。
- (可选)以上 Application、Channel、Subscription 等对象也可在 RHACM 界面上进行配置。
- 进入名为 webserver-app 的应用,可以在 “拓扑” 中看到 Application、Subscription、Placement 和 OpenShift 集群的关系。由于在 Placement 中使用 environment: dev 的标签,并且由于 ocp-cluster-1 集群有 environment: dev 的标签,因此可以看到应用运行在 ocp-cluster-1 集群上。
- 在 ocp-cluster-1 被管集群中可以看到部署的应用资源。
$ oc get all -n webserver-acm
NAME READY STATUS RESTARTS AGE
pod/webserver-86447cb946-d4kg7 1/1 Running 0 15m
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/webserver ClusterIP 172.30.162.216 <none> 8080/TCP 15m
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webserver 1/1 1 1 15m
NAME DESIRED CURRENT READY AGE
replicaset.apps/webserver-86447cb946 1 1 1 15m
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
route.route.openshift.io/webserver webserver-webserver-acm.apps.cluster-jh4rb.jh4rb.sandbox1343.opentlc.com /application.html webserver 8080-tcp edge None
- 执行以下命令创建新的 PlacementRule 和 Subscription。新的 PlacementRule 部署集群目标是 “environment: production” 标签。
$ cat << EOF | oc apply -f -
apiVersion: apps.open-cluster-management.io/v1
kind: PlacementRule
metadata:
name: prod-clusters
namespace: webserver-acm
spec:
clusterConditions:
- type: ManagedClusterConditionAvailable
status: "True"
clusterSelector:
matchLabels:
environment: production
EOF
$ cat << EOF | oc apply -f -
apiVersion: apps.open-cluster-management.io/v1
kind: Subscription
metadata:
name: webserver-app-prod
namespace: webserver-acm
labels:
app: webserver-app
annotations:
apps.open-cluster-management.io/github-path: 04.Application-Lifecycle/exercise-application/application-resources
spec:
channel: webserver-acm/webserver-app
placement:
placementRef:
kind: PlacementRule
name: prod-clusters
EOF
- 再次查看这个应用的部署拓扑,可以看到 Placements 图标有错误,提示没有找到带有 environment=production 标签的集群。
- 导入一个新的集群,例如名为 ocp-cluster-2 的被管集群,并为止添加 environment=production 标签。
- 在 Application 的 Resource topology 中确认应用已经通过 PlacementRule 找到并部署到名为 ocp-cluster-2 的集群了。
- 最后确认在名为 ocp-cluster-2 的集群中 webserver-acm 的项目中已经有部署好的应用了。
$ oc get all -n webserver-acm
NAME READY STATUS RESTARTS AGE
pod/webserver-5b94b86d86-t65kg 1/1 Running 0 3m40s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/webserver ClusterIP 172.30.189.119 <none> 8080/TCP 3m40s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/webserver 1/1 1 1 3m40s
NAME DESIRED CURRENT READY AGE
replicaset.apps/webserver-5b94b86d86 1 1 1 3m40s
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD
route.route.openshift.io/webserver webserver-webserver-acm.apps.cluster-gwdv8.gwdv8.sandbox518.opentlc.com /application.html webserver 8080-tcp edge None
NAME TYPE VERSION OWNER READY AGE
application.app.k8s.io/webserver-app 72m
演示视频
参考
https://access.redhat.com/documentation/zh-cn/red_hat_advanced_cluster_management_for_kubernetes/2.10/html-single/applications/index