《OpenShift / RHEL / DevSecOps 汇总目录》
文本已在 OpenShift 4.8 - OpenShift 4.11 环境中进行验证。
文章目录
什么是 Operator
Operator 是 RedHat 收购的 CoreOS 公司最早发起的一项有助于 Kubernetes 运维的技术框架体系。它可以将一套复杂系统环境(例如:主备或 HA 数据库、包含多个微服务+数据库的应用环境)所涉及到的所有资源、配置、最佳实践整体打包,并基于 CRD 提供对相关资源提供针对性运维管理操作(创建、备份、恢复、自愈等),从而帮助 Kubernetes 运维管理员简化对这些系统的运维操作、降低运维难度。
OpenShift 提供并运行了大量的 Operator。根据重要程度,我们可以将这些 Operator 分为“集群 Operator ”和“常规 Operator” 两类。
集群 Operator
OpenShift 底层依赖的系统级服务都是以 Opertor 的方式运行的,例如 DNS、 Etcd。这些服务不是直接运行在 OpenShift 依赖的 Linux 操作系统上,而是以 ClusterOpertor (co) 的方式运行在 OpenShift 中。因为这些系统服务对于运行 OpenShift 非常重要,因此在安装 OpenShift 的阶段就会将 ClusterOpertor 安装好。ClusterOpertor 对象在整个集群中都有效,可在所有 NameSpace 中都问到到。
在 OpenShift 控制台的 “集群设置” 中查看集群中所包含的 “集群 Operator” 环境。
也可执行以下命令查看 OpenShift 中包含的所有集群 Operator。
$ oc get clusteroperator
注意:在 OpenShift 中 ClusterOperaor 是由 Cluster Version Operator (CVO) 管理的。
常规 Operator
在 OpenShift 运行阶段根据需要安装的 Operator。有些常规 Operator 对象可所有 NameSpace 都有效,而有些则只能在特定 NameSpace 才能访问到,这取决于 Operator 自身特性以及在安装它们的时候选择的 NameSpace 范围。
在 OperatorHub 中找到 “Hello World Operator”,然后按照下图的缺省配置安装。注意:它虽然是安装在 “openshift-operators” 的 NameSpace 中,但是可以在所有 NameSpace 中被访问到。
可以执行以下命令查看在 default 的 NameSpace 中可以使用的 Operator。注意:其名称中包含了 Operator 安装的 NameSpace。
$ oc get operator -n default
NAME AGE
hello-world-operator.openshift-operators 18m
注意:常规 Operator 是由 Lifecycle Manager (OLM) 管理的。OLM 实际上是由以下 3 个 ClusterOperator 组成的。
$ oc get clusteroperator | grep operator-lifecycle-manager
operator-lifecycle-manager 4.8.12 True False False 372d
operator-lifecycle-manager-catalog 4.8.12 True False False 372d
operator-lifecycle-manager-packageserver 4.8.12 True False False 2d6h
OpenShift 的 Operator 相关概念和关系
在 OpenShift 中和 Operator 有关的对象比较多,本文主要从以下 2 个领域介绍相关概念和他们之间的关系:
- OperatorHub 相关对象:下图中 Catalog Operator 以及 4 类 Catalog Source。
- Operator 生命周期的相关对象:下图中 Subscription,InstalllPlan、ClusterServiceVersion 等资源。
OperatorHub 应用市场的相关对象
OpenShift 通过 OperatorHub 向用户提供了应用市场功能。OperatorHub 能够集中组织和展现来自 RedHat、社区、红帽官方 Market Place 以及其他第三方 ISV 的 Operator。
OperatorHub
在 OpenShift 的 openshift-marketplace 项目中使用了名为 marketplace 的 clusteroperator 运行了一个名为 cluster 的 OperatorHub 自定义资源(CR)实例,该 OperatorHub CR 实例提供了 OperatorHub 的界面展现。在 openshift-marketplace 项目中,除了 marketplace-operator-xxx 外,其他 Pod 都是由对应的 CatalogSource CRD 创建的。
$ oc get operatorhub
NAME AGE
cluster 374d
$ oc get co marketplace
NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE
marketplace 4.8.12 True False False 374d
$ oc get pod -n openshift-marketplace
NAME READY STATUS RESTARTS AGE
certified-operators-9fksf 1/1 Running 0 22m
community-operators-fw8wx 1/1 Running 1 19h
marketplace-operator-7c6cb8c7b5-c2wn7 1/1 Running 4 371d
redhat-marketplace-8zhnc 1/1 Running 1 25h
redhat-operators-zjkxd 1/1 Running 0 150m
CatalogSource 和 PackageManifest
在 OperatorHub 中展现的 Operator 列表是由 OperatorHub 关联的 CatalogSource 对象提供的。CatalogSource CRD 是用来定义一个 Operator 供应源提供的 Operator 列表,而一个 PackageManifest 则是对一个 Operator 的详细描述 。通常会将含有多个 Package Manifest 的 CatalogSource 整体打包成 Image,以方便分发。
OperShift 内置了以下 4 个不同类型的 CatalogSource 供应源,每个 CatalogSource 供应源将 Operator 供应信息打包到各自的 Image 中。
也可以用以下命令查看到这 4 个 CatalogSource CRD 实例:
$ oc get catalogsource -n openshift-marketplace
NAME DISPLAY TYPE PUBLISHER AGE
certified-operators Certified Operators grpc Red Hat 372d
community-operators Community Operators grpc Red Hat 372d
redhat-marketplace Red Hat Marketplace grpc Red Hat 372d
redhat-operators Red Hat Operators grpc Red Hat 372d
这 4 个 CatalogSource 分别是以下 4 种不同供应类型的 Operator 集合:
CatalogSource | 索引镜像 | 描述 |
---|---|---|
redhat-operators | registry.redhat.io/redhat/redhat-operator-index:v4.X | 已由红帽打包并提供的红帽产品。受红帽支持。 |
certified-operators | registry.redhat.io/redhat/certified-operator-index:4.X | 来自主要独立软件供应商 (ISV) 的产品。受 ISV 支持。 |
redhat-marketplace | registry.redhat.io/redhat/redhat-marketplace-index:v4.X | 可通过 Red Hat Marketplace 购买认证的软件。 |
community-operators | registry.redhat.io/redhat/community-operator-index:v4.X | 软件由社区相关方来维护,无官方支持。 |
这 4 个 CatalogSource CRD 是通过名为 operator-lifecycle-manager-catalog 的 ClusterOperator 运行的。
$ oc get clusteroperator | grep operator-lifecycle-manager
operator-lifecycle-manager-catalog 4.8.12 True False False 372d
可以查看每个 CatalogSource 包含的 Operator 列表,其中每个 Operator 的所有详细信息都被打包在 Package Manifest 中。
OpenShift 缺省自带的 4 个 CatalogSource CRD 实例的配置是只读的,无法进行修改。只能通过 “禁用” 关闭,这样就不会在 OperatorHub 界面中显示了。用户可以创建自己的 CatalogSource 实例,以在 OperatorHub 中显示客户定制的 Operator。
可以进入控制台的“集群设置”菜单,然后在页面中的“全局设置”栏中找到 OperatorHub 后进入,最后在 “源” 栏中可看到 OperatorHub 中包含的 CatalogSource CRD 实例列表 。可以对每一项使用 “禁用” 和 “启动” 功能,“禁用” 后, CatalogSource CRD 实例中包含的 Operator 将不显再示到 OperatorHub 界面中。
除了以上操作方法外,还在可以直接修改 OperatorHub 的配置实现“禁用”或“启动” CatalogSource。
$ oc edit operatorhub cluster
。。。
spec:
sources:
- disabled: false
name: redhat-operators
。。。
PackageManifest 是描述特定 Operator 的元数据信息(例如图标、功能说明、缺省安装参数、相关的 CSV、CRD 和软件包存储库等),它被打包存放在指定 Image 中。 OpenShift 使用 CatalogSource CDR 来定义如何从 Registry 获取并更新这些 Image。
$ oc get catalogsource redhat-operators -n openshift-marketplace -oyaml
。。。
spec:
displayName: Red Hat Operators
image: registry.redhat.io/redhat/redhat-operator-index:v4.8
publisher: ""
sourceType: grpc
status:
connectionState:
address: redhat-operators.openshift-marketplace.svc:50051
lastConnect: "2022-10-01T00:29:25Z"
lastObservedState: READY
registryService:
createdAt: "2022-09-30T09:02:23Z"
port: "50051"
protocol: grpc
serviceName: redhat-operators
serviceNamespace: openshift-marketplace
OpenShift 通过 Pod 运行 CatalogSource CRD 使用到的 Image。
$ oc get pod -n openshift-marketplace
NAME READY STATUS RESTARTS AGE
certified-operators-9fksf 1/1 Running 0 22m
community-operators-fw8wx 1/1 Running 1 19h
marketplace-operator-7c6cb8c7b5-c2wn7 1/1 Running 4 371d
redhat-marketplace-8zhnc 1/1 Running 1 25h
redhat-operators-zjkxd 1/1 Running 0 150m
确认上面展示的名为 redhat-operators 的 CatalogSource 实例 YAML 中有 “address: redhat-operators.openshift-marketplace.svc:50051” 的内容,说明 CatalogSource 是通过运行在 50051 端口的服务获取 Package Manifest 数据。
$ oc get svc -n openshift-marketplace
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
certified-operators ClusterIP 10.217.5.146 <none> 50051/TCP 372d
community-operators ClusterIP 10.217.5.144 <none> 50051/TCP 372d
marketplace-operator-metrics ClusterIP 10.217.4.119 <none> 8383/TCP,8081/TCP 372d
redhat-marketplace ClusterIP 10.217.5.123 <none> 50051/TCP 372d
redhat-operators ClusterIP 10.217.4.130 <none> 50051/TCP 17h
OpenShift 更新 CatalogSource 的 Image 并更新 PackageManifest 信息的过程是通过 operator-lifecycle-manager-catalog 和 operator-lifecycle-manager-packageserver 这两个 Cluster 级别的 Operator 定期执行的。这两个 ClusterOperator 都通过对应的 Deployment 在各自的 Pod 中实现上述操作。
执行命令分别查看 operator-lifecycle-manager-catalog 和 operator-lifecycle-manager-packageserver 对应的 Pod 执行日志,确认其中包含 “catalog update required” 和 “updating PackageManifest” 日志。
$ oc get clusteroperator | grep operator-lifecycle-manager
operator-lifecycle-manager 4.8.12 True False False 372d
operator-lifecycle-manager-catalog 4.8.12 True False False 372d
operator-lifecycle-manager-packageserver 4.8.12 True False False 2d6h
$ oc get deployment -n openshift-operator-lifecycle-manager
NAME READY UP-TO-DATE AVAILABLE AGE
catalog-operator 1/1 1 1 352d
olm-operator 1/1 1 1 352d
package-server-manager 1/1 1 1 352d
packageserver 1/1 1 1 352d
$ oc logs deploy/catalog-operator -n openshift-operator-lifecycle-manager | grep "catalog update required"
$ oc logs deploy/catalog-operator -n openshift-operator-lifecycle-manager | grep "level=error"
$ oc logs deploy/packageserver -n openshift-operator-lifecycle-manager | grep "updating PackageManifest"
。。。
I1001 12:46:16.890865 1 reflector.go:381] github.com/operator-framework/operator-lifecycle-manager/pkg/lib/queueinformer/queueinformer_operator.go:153: forcing resync
time="2022-10-01T12:46:16Z" level=info msg="updating PackageManifest based on CatalogSource changes: {redhat-operators openshift-marketplace}" action="sync catalogsource" address="redhat-operators.openshift-marketplace.svc:50051" name=redhat-operators namespace=openshift-marketplace
time="2022-10-01T12:46:16Z" level=info msg="updating PackageManifest based on CatalogSource changes: {certified-operators openshift-marketplace}" action="sync catalogsource" address="certified-operators.openshift-marketplace.svc:50051" name=certified-operators namespace=openshift-marketplace
time="2022-10-01T12:46:17Z" level=info msg="updating PackageManifest based on CatalogSource changes: {community-operators openshift-marketplace}" action="sync catalogsource" address="community-operators.openshift-marketplace.svc:50051" name=community-operators namespace=openshift-marketplace
time="2022-10-01T12:46:17Z" level=info msg="updating PackageManifest based on CatalogSource changes: {redhat-marketplace openshift-marketplace}" action="sync catalogsource" address="redhat-marketplace.openshift-marketplace.svc:50051" name=redhat-marketplace namespace=openshift-marketplace
。。。
在获取到 Package Manifest 数据后就可以将与之对应的 Operator 列表展示到 OpenShift 的 OperatorHub 界面中了。由于 Package Manifest 就代表一个可以使用的 Opertor,所以以下命令是列出 OperatorHub 中所有集群可用的 Operator。
$ oc get packagemanifest -n openshift-marketplace
NAME CATALOG AGE
cortex-hub-operator Certified Operators 371d
cortex-healthcare-hub-operator Certified Operators 371d
orca Certified Operators 371d
verticadb-operator Community Operators 371d
as400rpc-operator-rhmp Red Hat Marketplace 371d
openshiftpipeline-operator Certified Operators 371d
netobserv-operator Community Operators 371d
instana-agent-operator-rhmp Red Hat Marketplace 371d
bamoe-businessautomation-operator Red Hat Operators 371d
skupper-operator Red Hat Operators 371d
falco-certified Certified Operators 371d
varnish-operator Community Operators 371d
cloud-native-postgresql Certified Operators 371d
snapscheduler Community Operators 371d
cic-operator-with-crds-rhmp Red Hat Marketplace 371d
service-telemetry-operator Red Hat Operators 371d
esindex-operator Community Operators 371d
...
也可以在 openshift-operator-lifecycle-manager 项目中进入名为 “Package Server” 的 Operator,在 PackageManifest 栏目中可以看到从不同 CatalogSource 导入的 Operator。
Operator 生命周期的相关概念
用户在使用 Operator 的时候,OpenShift 是通过集群中 Opertor Lifecycle Manager (OLM) Operator 完成 Operator 的展现、安装、更新、升级、运维等生命周期相关操作的。
Subscription (sub) 订阅 CRD
管理员通过 Operator 安装或升级一个软件的基础运行环境(不是实例运行环境)是通过 Subscription 实现的。Subscription 用于通过跟踪软件包中的频道来保持 CSV 最新。在 Subscription 中使用了 Channel 定义了该软件可用的安装或升级的版本。Subscription 还定义了是自动化升级软件版本、还是需要审批才可升级。
$ oc get sub -A
NAMESPACE NAME PACKAGE SOURCE CHANNEL
openshift-operators hello-world-operator hello-world-operator certified-operators stable
$ oc get sub hello-world-operator -n openshift-operators -oyaml
。。。
spec:
channel: stable
installPlanApproval: Automatic
name: hello-world-operator
source: certified-operators
sourceNamespace: openshift-marketplace
startingCSV: hello-world-operator.0.0.1
。。。
InstallPlan (ip) 安装计划 CRD
要安装 Operator,集群管理员或被授予 Operator 安装权限的用户,必须首先创建一个 Subscription 对象。随后 OpenShift 的 OLM 会根据 Subscription 创建一个 InstallPlan 对象来安装 Operator 资源。InstallPlan 被 Subscription 用来执行安装 CVS,并记录安装结果。
$ oc get installplan install-fv9q9 -n openshift-operators
NAME CSV APPROVAL APPROVED
install-fv9q9 hello-world-operator.0.0.1 Automatic true
$ oc get installplan install-fv9q9 -n openshift-operators -oyaml
。。。
spec:
approval: Automatic
approved: true
clusterServiceVersionNames:
- hello-world-operator.0.0.1
generation: 1
。。。
ClusterServiceVersion (csv) CRD
ClusterServiceVersion (csv) 对象描述一个 Operator 所有 metadata,包括所有在 OperatorHub 页面中看到的 operator 说明信息、安装界面、所包含CRD说明、安装后的操作界面等。csv 对象在整个集群中都有效。
$ oc get csv
NAME DISPLAY VERSION REPLACES PHASE
hello-world-operator.0.0.1 Hello World Operator 0.0.1 Succeeded
$ oc get csv hello-world-operator.0.0.1 -oyaml
当 CSV 的状态为 Succeeded 的时候,说明 Operator 已经安装好好了。
支持离线安装的 Operator 列表
部分 Red Hat 提供的 Operator 支持离线安装,可参见 https://access.redhat.com/articles/4740011 说明。
https://two-oes.medium.com/deploying-a-single-operator-on-openshift-disconnected-22e01b44a5d1
演示视频
用 Operator 部署和管理用户应用
用 Operator 管理 PaaS 软件生命周期
参考
https://olm.operatorframework.io/docs/concepts/olm-architecture/
Operator 相关概念
https://indico.cern.ch/event/829468/attachments/1936132/3208502/005-Operator-Workshop-Operator-Lifeycle-Manager.pdf
Operator troubleshooting
https://medium.com/@imsrv01/how-olm-helps-to-install-and-upgrade-operators-e81704c093fd
https://medium.com/@vbudidarmawan/demystifying-operator-deployment-in-openshift-2ac7f24ad487
https://techbloc.net/archives/4372
https://www.redhat.com/en/technologies/cloud-computing/openshift/what-are-openshift-operators
https://www.redhat.com/rhdc/managed-files/cl-oreilly-kubernetes-operators-ebook-f21452-202001-en_2.pdf
https://www.youtube.com/watch?v=5PorcMTYZTo