《OpenShift / RHEL / DevSecOps 汇总目录》
本文在 OpenShift 4.10 + RHACM 环境中进行验证。
RHACM 是如何部署应用的
RHACM 使用如下一些概念来统一管理应用生命周期。
- Application:组成一个应用的所有 Kubernetes 资源。
- Channel:获取应用部署资源的渠道,RHACM 支持 Git,Helm 和对象存储。
- PlacementRule:定义应用部署的目标集群。
- Subscription:绑定 Channel 和 PlacementRule。

向被管集群部署应用
我们可以使用 RHACM 中的 Applications 在多云环境统一部署应用。RHACM 除了本身支持应用生命周期管理外,还支持通过集成 ArgoCD 和 Ansible 部署应用和管理应用生命周期。
- 先在 RHACM 控制台中为一个被管 OpenShift 集群(ocp4perf1)添加 “environment=dev” 的标签。

- 执行命令,创建 Channel 指向应用 Git 源。
$ 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/michaelkotelnikov/rhacm-workshop
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 控制台的 Applications 中看到 webserver-app 应用。
(可选)以上 Application、Channel、Subscription 等对象也可在 RHACM 界面上进行配置。



进入名为 webserver-app 的 Application,可以在下方的 Resource Topology 中看到 Application、Subscription、Placement 和 OpenShift 集群的关系。由于在 Placement 中使用 environment: dev 的标签,并且 ocp4perf1 集群有 environment: dev 的标签,因此可以看到应用运行在 ocp4perf1 集群上。

在 ocp4perf1 被管集群中可以看到部署的应用资源。
$ 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
- 再次查看这个 Application 的部署拓扑,可以看到 Subscription 图标有错误。其中 Cluster deploy status 错误提示没有找到名为 prod-clusters 的 PlacementRule 对应的集群。

- 为一个被管集群添加 environment=production 标签。

- 然后在 Application 中选择 “Deploy application resources only on clusters matching specified labels”,并按照下图添加 environment=production 的标签。

- 在 Application 的 Resource topology 中确认应用已经通过 PlacementRule 找到并部署到名为 local-cluster 的集群了。

- 最后确认在名为 local-cluster 的集群中 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.4/html-single/applications/index
版权声明:本文为weixin_43902588原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。