×

了解身份提供程序配置

OpenShift Container Platform控制平面包含一个内置的OAuth服务器。开发人员和管理员获取OAuth访问令牌以向API进行身份验证。

作为管理员,您可以在安装集群后配置OAuth以指定身份提供程序。

关于OpenShift Container Platform中的身份提供程序

默认情况下,集群中只存在kubeadmin用户。要指定身份提供程序,您必须创建一个描述该身份提供程序的自定义资源(CR),并将其添加到集群。

OpenShift Container Platform用户名中包含/:%不受支持。

支持的身份提供程序

您可以配置以下类型的身份提供程序

身份提供程序 描述

配置htpasswd身份提供程序以针对使用htpasswd生成的平面文件验证用户名和密码。

配置keystone身份提供程序以将您的OpenShift Container Platform集群与Keystone集成,以启用与配置为在内部数据库中存储用户的OpenStack Keystone v3服务器的共享身份验证。

配置ldap身份提供程序以使用简单绑定身份验证针对LDAPv3服务器验证用户名和密码。

为用户配置basic-authentication身份提供程序,以便他们可以使用针对远程身份提供程序验证的凭据登录OpenShift Container Platform。基本身份验证是一种通用的后端集成机制。

配置request-header身份提供程序以从请求头值(例如X-Remote-User)识别用户。它通常与设置请求头值的认证代理结合使用。

配置github身份提供程序以针对GitHub或GitHub Enterprise的OAuth身份验证服务器验证用户名和密码。

配置gitlab身份提供程序以使用GitLab.com或任何其他GitLab实例作为身份提供程序。

使用Google的OpenID Connect集成配置google身份提供程序。

配置oidc身份提供程序以使用授权码流程与OpenID Connect身份提供程序集成。

定义身份提供程序后,您可以使用RBAC定义和应用权限

身份提供者参数

以下参数对所有身份提供者通用

参数 描述

name

提供者名称作为前缀添加到提供者用户名,以形成身份名称。

mappingMethod

定义新身份在登录时如何映射到用户。输入以下值之一:

claim

默认值。使用身份的首选用户名为用户配置身份。如果具有该用户名的用户已映射到另一个身份,则会失败。

lookup

查找现有身份、用户身份映射和用户,但不自动配置用户或身份。这允许集群管理员手动设置身份和用户,或使用外部流程。使用此方法需要您手动配置用户。

add

使用身份的首选用户名为用户配置身份。如果已存在具有该用户名的用户,则将身份映射到现有用户,添加到用户的任何现有身份映射中。当配置多个识别同一组用户并映射到相同用户名的身份提供者时,这是必需的。

添加或更改身份提供者时,您可以通过将mappingMethod参数设置为add来将新提供者的身份映射到现有用户。

身份提供者 CR 示例

以下自定义资源 (CR) 显示了用于配置身份提供者的参数和默认值。此示例使用 htpasswd 身份提供者。

身份提供程序CR示例
apiVersion: config.openshift.io/v1
kind: OAuth
metadata:
  name: cluster
spec:
  identityProviders:
  - name: my_identity_provider (1)
    mappingMethod: claim (2)
    type: HTPasswd
    htpasswd:
      fileData:
        name: htpass-secret (3)
1 此提供者名称作为前缀添加到提供者用户名,以形成身份名称。
2 控制在此提供者的身份和User对象之间如何建立映射。
3 包含使用htpasswd生成的现有秘密文件。

使用 RBAC 定义和应用权限

了解并应用基于角色的访问控制。

RBAC 概述

基于角色的访问控制 (RBAC) 对象决定用户是否允许在项目中执行给定操作。

集群管理员可以使用集群角色和绑定来控制谁拥有对 OpenShift Container Platform 平台本身和所有项目的不同访问级别。

开发人员可以使用本地角色和绑定来控制谁可以访问他们的项目。请注意,授权与身份验证是分开的步骤,身份验证更多的是确定执行操作者的身份。

授权使用以下方式管理:

授权对象 描述

规则

对一组对象的一组允许的动词集。例如,用户或服务帐户是否可以创建 Pod。

角色

规则集合。您可以将用户和组关联或绑定到多个角色。

绑定

用户和/或组与角色之间的关联。

RBAC 角色和绑定有两个级别来控制授权

RBAC 级别 描述

集群 RBAC

适用于所有项目的规则和绑定。集群角色存在于集群范围内,而集群角色绑定只能引用集群角色。

本地 RBAC

作用域为给定项目的规则和绑定。虽然本地角色仅存在于单个项目中,但本地角色绑定可以同时引用集群和本地角色。

集群角色绑定是在集群级别存在的绑定。角色绑定存在于项目级别。要让用户查看项目,必须使用本地角色绑定将集群角色查看绑定到用户。只有在集群角色不提供特定情况所需的权限集时,才创建本地角色。

这种两级层次结构允许通过集群角色在多个项目中重用,同时允许通过本地角色在单个项目内进行自定义。

在评估期间,将同时使用集群角色绑定和本地角色绑定。例如:

  1. 检查集群范围的“允许”规则。

  2. 检查本地绑定的“允许”规则。

  3. 默认情况下拒绝。

默认集群角色

OpenShift Container Platform 包含一组默认集群角色,您可以将其绑定到集群范围或本地范围的用户和组。

不建议手动修改默认集群角色。对这些系统角色的修改可能会阻止集群正常运行。

默认集群角色 描述

admin

项目管理员。如果在本地绑定中使用,则admin具有查看项目中任何资源和修改项目中除配额之外的任何资源的权限。

basic-user

可以获取有关项目和用户的基本信息的使用者。

cluster-admin

超级用户,可以在任何项目中执行任何操作。当与本地绑定中的用户绑定时,他们对配额和项目中每个资源上的每个操作都具有完全控制权。

cluster-status

可以获取基本集群状态信息的使用者。

cluster-reader

可以获取或查看大多数对象但不能修改它们的使用者。

edit

可以修改项目中的大多数对象,但没有查看或修改角色或绑定的权限的使用者。

self-provisioner

可以创建自己项目的使用者。

view

不能进行任何修改,但可以查看项目中大多数对象的使用者。他们无法查看或修改角色或绑定。

注意本地绑定和集群绑定之间的区别。例如,如果您使用本地角色绑定将cluster-admin角色绑定到用户,则该用户似乎具有集群管理员的权限。情况并非如此。将cluster-admin绑定到项目中的用户仅向该用户授予该项目的超级管理员权限。该用户拥有集群角色admin的权限,以及一些其他权限,例如能够编辑该项目的速率限制。此绑定在 Web 控制台 UI 中可能会令人困惑,它不会列出绑定到真实集群管理员的集群角色绑定。但是,它确实列出了您可以用来在本地绑定cluster-admin的本地角色绑定。

下图说明了集群角色、本地角色、集群角色绑定、本地角色绑定、用户、组和服务帐户之间的关系。

OpenShift Container Platform RBAC

get pods/execget pods/*get *规则在应用于角色时授予执行权限。应用最小权限原则,只为用户和代理分配所需的最小 RBAC 权限。有关更多信息,请参阅RBAC 规则允许执行权限

评估授权

OpenShift Container Platform 使用以下方法评估授权:

身份

用户名和用户所属的组列表。

操作

您执行的操作。在大多数情况下,这包括:

  • 项目:您访问的项目。项目是 Kubernetes 命名空间,带有附加注释,允许用户社区在与其他社区隔离的情况下组织和管理其内容。

  • 动词:操作本身:getlistcreateupdatedeletedeletecollectionwatch

  • 资源名称:您访问的 API 端点。

绑定

完整的绑定列表,用户或组与角色之间的关联。

OpenShift Container Platform 使用以下步骤评估授权:

  1. 使用身份和项目范围的操作查找适用于用户或其组的所有绑定。

  2. 使用绑定来查找所有适用的角色。

  3. 使用角色查找所有适用的规则。

  4. 将操作与每个规则进行检查以查找匹配项。

  5. 如果找不到匹配的规则,则默认拒绝操作。

请记住,用户和组可以同时关联或绑定到多个角色。

项目管理员可以使用 CLI 查看本地角色和绑定,包括每个角色关联的动词和资源矩阵。

绑定到项目管理员的集群角色通过本地绑定在项目中受到限制。它不像授予**cluster-admin**或**system:admin**的集群角色那样在集群范围内绑定。

集群角色是在集群级别定义的角色,但可以在集群级别或项目级别绑定。

集群角色聚合

默认的 admin、edit、view 和 cluster-reader 集群角色支持集群角色聚合,其中每个角色的集群规则会在创建新规则时动态更新。此功能仅在您通过创建自定义资源扩展 Kubernetes API 时才相关。

项目和命名空间

Kubernetes *命名空间*提供了一种在集群中限定资源范围的机制。Kubernetes 文档包含有关命名空间的更多信息。

命名空间为以下方面提供了唯一的范围:

  • 命名资源,以避免基本的命名冲突。

  • 向受信任用户委派管理权限。

  • 限制社区资源消耗的能力。

系统中的大多数对象都由命名空间限定范围,但有些对象除外,并且没有命名空间,包括节点和用户。

一个*项目*是一个带有附加注释的 Kubernetes 命名空间,它是管理常规用户访问资源的中心工具。项目允许用户社区隔离其他社区来组织和管理其内容。用户必须由管理员授予对项目的访问权限,或者如果允许创建项目,则自动访问他们自己的项目。

项目可以具有单独的namedisplayNamedescription

  • 强制性的name是项目的唯一标识符,在使用 CLI 工具或 API 时最显眼。最大名称长度为 63 个字符。

  • 可选的displayName是项目在 Web 控制台中显示的方式(默认为name)。

  • 可选的description可以是对项目的更详细描述,也显示在 Web 控制台中。

每个项目都限定其自身的一组:

对象 描述

对象

Pod、服务、复制控制器等。

策略

用户可以或不可以对对象执行操作的规则。

约束

可以限制的每种对象类型的配额。

服务账户

服务账户会自动使用指定的访问权限来访问项目中的对象。

集群管理员可以创建项目并将项目的管理权限委派给用户社区的任何成员。集群管理员还可以允许开发人员创建他们自己的项目。

开发人员和管理员可以使用 CLI 或 Web 控制台与项目交互。

默认项目

OpenShift Container Platform 带有一些默认项目,以openshift-开头的项目对用户至关重要。这些项目托管作为 Pod 运行的主控组件和其他基础设施组件。在这些命名空间中创建的具有关键 Pod 批注的 Pod 被视为关键 Pod,并且 kubelet 会保证其准入。为这些命名空间中的主控组件创建的 Pod 已被标记为关键 Pod。

不要在默认项目中运行工作负载或共享对默认项目的访问权限。默认项目保留用于运行核心集群组件。

以下默认项目被认为是高度特权的:defaultkube-publickube-systemopenshiftopenshift-infraopenshift-node以及其他系统创建的且openshift.io/run-level标签设置为01的项目。依赖于准入插件的功能(例如 Pod 安全准入、安全上下文约束、集群资源配额和镜像引用解析)在高度特权的项目中不起作用。

查看集群角色和绑定

您可以使用oc CLI 和oc describe命令查看集群角色和绑定。

先决条件
  • 安装oc CLI。

  • 获得查看集群角色和绑定的权限。

在集群范围内绑定了cluster-admin默认集群角色的用户可以对任何资源执行任何操作,包括查看集群角色和绑定。

步骤
  1. 要查看集群角色及其关联的规则集

    $ oc describe clusterrole.rbac
    示例输出
    Name:         admin
    Labels:       kubernetes.io/bootstrapping=rbac-defaults
    Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
    PolicyRule:
      Resources                                                  Non-Resource URLs  Resource Names  Verbs
      ---------                                                  -----------------  --------------  -----
      .packages.apps.redhat.com                                  []                 []              [* create update patch delete get list watch]
      imagestreams                                               []                 []              [create delete deletecollection get list patch update watch create get list watch]
      imagestreams.image.openshift.io                            []                 []              [create delete deletecollection get list patch update watch create get list watch]
      secrets                                                    []                 []              [create delete deletecollection get list patch update watch get list watch create delete deletecollection patch update]
      buildconfigs/webhooks                                      []                 []              [create delete deletecollection get list patch update watch get list watch]
      buildconfigs                                               []                 []              [create delete deletecollection get list patch update watch get list watch]
      buildlogs                                                  []                 []              [create delete deletecollection get list patch update watch get list watch]
      deploymentconfigs/scale                                    []                 []              [create delete deletecollection get list patch update watch get list watch]
      deploymentconfigs                                          []                 []              [create delete deletecollection get list patch update watch get list watch]
      imagestreamimages                                          []                 []              [create delete deletecollection get list patch update watch get list watch]
      imagestreammappings                                        []                 []              [create delete deletecollection get list patch update watch get list watch]
      imagestreamtags                                            []                 []              [create delete deletecollection get list patch update watch get list watch]
      processedtemplates                                         []                 []              [create delete deletecollection get list patch update watch get list watch]
      routes                                                     []                 []              [create delete deletecollection get list patch update watch get list watch]
      templateconfigs                                            []                 []              [create delete deletecollection get list patch update watch get list watch]
      templateinstances                                          []                 []              [create delete deletecollection get list patch update watch get list watch]
      templates                                                  []                 []              [create delete deletecollection get list patch update watch get list watch]
      deploymentconfigs.apps.openshift.io/scale                  []                 []              [create delete deletecollection get list patch update watch get list watch]
      deploymentconfigs.apps.openshift.io                        []                 []              [create delete deletecollection get list patch update watch get list watch]
      buildconfigs.build.openshift.io/webhooks                   []                 []              [create delete deletecollection get list patch update watch get list watch]
      buildconfigs.build.openshift.io                            []                 []              [create delete deletecollection get list patch update watch get list watch]
      buildlogs.build.openshift.io                               []                 []              [create delete deletecollection get list patch update watch get list watch]
      imagestreamimages.image.openshift.io                       []                 []              [create delete deletecollection get list patch update watch get list watch]
      imagestreammappings.image.openshift.io                     []                 []              [create delete deletecollection get list patch update watch get list watch]
      imagestreamtags.image.openshift.io                         []                 []              [create delete deletecollection get list patch update watch get list watch]
      routes.route.openshift.io                                  []                 []              [create delete deletecollection get list patch update watch get list watch]
      processedtemplates.template.openshift.io                   []                 []              [create delete deletecollection get list patch update watch get list watch]
      templateconfigs.template.openshift.io                      []                 []              [create delete deletecollection get list patch update watch get list watch]
      templateinstances.template.openshift.io                    []                 []              [create delete deletecollection get list patch update watch get list watch]
      templates.template.openshift.io                            []                 []              [create delete deletecollection get list patch update watch get list watch]
      serviceaccounts                                            []                 []              [create delete deletecollection get list patch update watch impersonate create delete deletecollection patch update get list watch]
      imagestreams/secrets                                       []                 []              [create delete deletecollection get list patch update watch]
      rolebindings                                               []                 []              [create delete deletecollection get list patch update watch]
      roles                                                      []                 []              [create delete deletecollection get list patch update watch]
      rolebindings.authorization.openshift.io                    []                 []              [create delete deletecollection get list patch update watch]
      roles.authorization.openshift.io                           []                 []              [create delete deletecollection get list patch update watch]
      imagestreams.image.openshift.io/secrets                    []                 []              [create delete deletecollection get list patch update watch]
      rolebindings.rbac.authorization.k8s.io                     []                 []              [create delete deletecollection get list patch update watch]
      roles.rbac.authorization.k8s.io                            []                 []              [create delete deletecollection get list patch update watch]
      networkpolicies.extensions                                 []                 []              [create delete deletecollection patch update create delete deletecollection get list patch update watch get list watch]
      networkpolicies.networking.k8s.io                          []                 []              [create delete deletecollection patch update create delete deletecollection get list patch update watch get list watch]
      configmaps                                                 []                 []              [create delete deletecollection patch update get list watch]
      endpoints                                                  []                 []              [create delete deletecollection patch update get list watch]
      persistentvolumeclaims                                     []                 []              [create delete deletecollection patch update get list watch]
      pods                                                       []                 []              [create delete deletecollection patch update get list watch]
      replicationcontrollers/scale                               []                 []              [create delete deletecollection patch update get list watch]
      replicationcontrollers                                     []                 []              [create delete deletecollection patch update get list watch]
      services                                                   []                 []              [create delete deletecollection patch update get list watch]
      daemonsets.apps                                            []                 []              [create delete deletecollection patch update get list watch]
      deployments.apps/scale                                     []                 []              [create delete deletecollection patch update get list watch]
      deployments.apps                                           []                 []              [create delete deletecollection patch update get list watch]
      replicasets.apps/scale                                     []                 []              [create delete deletecollection patch update get list watch]
      replicasets.apps                                           []                 []              [create delete deletecollection patch update get list watch]
      statefulsets.apps/scale                                    []                 []              [create delete deletecollection patch update get list watch]
      statefulsets.apps                                          []                 []              [create delete deletecollection patch update get list watch]
      horizontalpodautoscalers.autoscaling                       []                 []              [create delete deletecollection patch update get list watch]
      cronjobs.batch                                             []                 []              [create delete deletecollection patch update get list watch]
      jobs.batch                                                 []                 []              [create delete deletecollection patch update get list watch]
      daemonsets.extensions                                      []                 []              [create delete deletecollection patch update get list watch]
      deployments.extensions/scale                               []                 []              [create delete deletecollection patch update get list watch]
      deployments.extensions                                     []                 []              [create delete deletecollection patch update get list watch]
      ingresses.extensions                                       []                 []              [create delete deletecollection patch update get list watch]
      replicasets.extensions/scale                               []                 []              [create delete deletecollection patch update get list watch]
      replicasets.extensions                                     []                 []              [create delete deletecollection patch update get list watch]
      replicationcontrollers.extensions/scale                    []                 []              [create delete deletecollection patch update get list watch]
      poddisruptionbudgets.policy                                []                 []              [create delete deletecollection patch update get list watch]
      deployments.apps/rollback                                  []                 []              [create delete deletecollection patch update]
      deployments.extensions/rollback                            []                 []              [create delete deletecollection patch update]
      catalogsources.operators.coreos.com                        []                 []              [create update patch delete get list watch]
      clusterserviceversions.operators.coreos.com                []                 []              [create update patch delete get list watch]
      installplans.operators.coreos.com                          []                 []              [create update patch delete get list watch]
      packagemanifests.operators.coreos.com                      []                 []              [create update patch delete get list watch]
      subscriptions.operators.coreos.com                         []                 []              [create update patch delete get list watch]
      buildconfigs/instantiate                                   []                 []              [create]
      buildconfigs/instantiatebinary                             []                 []              [create]
      builds/clone                                               []                 []              [create]
      deploymentconfigrollbacks                                  []                 []              [create]
      deploymentconfigs/instantiate                              []                 []              [create]
      deploymentconfigs/rollback                                 []                 []              [create]
      imagestreamimports                                         []                 []              [create]
      localresourceaccessreviews                                 []                 []              [create]
      localsubjectaccessreviews                                  []                 []              [create]
      podsecuritypolicyreviews                                   []                 []              [create]
      podsecuritypolicyselfsubjectreviews                        []                 []              [create]
      podsecuritypolicysubjectreviews                            []                 []              [create]
      resourceaccessreviews                                      []                 []              [create]
      routes/custom-host                                         []                 []              [create]
      subjectaccessreviews                                       []                 []              [create]
      subjectrulesreviews                                        []                 []              [create]
      deploymentconfigrollbacks.apps.openshift.io                []                 []              [create]
      deploymentconfigs.apps.openshift.io/instantiate            []                 []              [create]
      deploymentconfigs.apps.openshift.io/rollback               []                 []              [create]
      localsubjectaccessreviews.authorization.k8s.io             []                 []              [create]
      localresourceaccessreviews.authorization.openshift.io      []                 []              [create]
      localsubjectaccessreviews.authorization.openshift.io       []                 []              [create]
      resourceaccessreviews.authorization.openshift.io           []                 []              [create]
      subjectaccessreviews.authorization.openshift.io            []                 []              [create]
      subjectrulesreviews.authorization.openshift.io             []                 []              [create]
      buildconfigs.build.openshift.io/instantiate                []                 []              [create]
      buildconfigs.build.openshift.io/instantiatebinary          []                 []              [create]
      builds.build.openshift.io/clone                            []                 []              [create]
      imagestreamimports.image.openshift.io                      []                 []              [create]
      routes.route.openshift.io/custom-host                      []                 []              [create]
      podsecuritypolicyreviews.security.openshift.io             []                 []              [create]
      podsecuritypolicyselfsubjectreviews.security.openshift.io  []                 []              [create]
      podsecuritypolicysubjectreviews.security.openshift.io      []                 []              [create]
      jenkins.build.openshift.io                                 []                 []              [edit view view admin edit view]
      builds                                                     []                 []              [get create delete deletecollection get list patch update watch get list watch]
      builds.build.openshift.io                                  []                 []              [get create delete deletecollection get list patch update watch get list watch]
      projects                                                   []                 []              [get delete get delete get patch update]
      projects.project.openshift.io                              []                 []              [get delete get delete get patch update]
      namespaces                                                 []                 []              [get get list watch]
      pods/attach                                                []                 []              [get list watch create delete deletecollection patch update]
      pods/exec                                                  []                 []              [get list watch create delete deletecollection patch update]
      pods/portforward                                           []                 []              [get list watch create delete deletecollection patch update]
      pods/proxy                                                 []                 []              [get list watch create delete deletecollection patch update]
      services/proxy                                             []                 []              [get list watch create delete deletecollection patch update]
      routes/status                                              []                 []              [get list watch update]
      routes.route.openshift.io/status                           []                 []              [get list watch update]
      appliedclusterresourcequotas                               []                 []              [get list watch]
      bindings                                                   []                 []              [get list watch]
      builds/log                                                 []                 []              [get list watch]
      deploymentconfigs/log                                      []                 []              [get list watch]
      deploymentconfigs/status                                   []                 []              [get list watch]
      events                                                     []                 []              [get list watch]
      imagestreams/status                                        []                 []              [get list watch]
      limitranges                                                []                 []              [get list watch]
      namespaces/status                                          []                 []              [get list watch]
      pods/log                                                   []                 []              [get list watch]
      pods/status                                                []                 []              [get list watch]
      replicationcontrollers/status                              []                 []              [get list watch]
      resourcequotas/status                                      []                 []              [get list watch]
      resourcequotas                                             []                 []              [get list watch]
      resourcequotausages                                        []                 []              [get list watch]
      rolebindingrestrictions                                    []                 []              [get list watch]
      deploymentconfigs.apps.openshift.io/log                    []                 []              [get list watch]
      deploymentconfigs.apps.openshift.io/status                 []                 []              [get list watch]
      controllerrevisions.apps                                   []                 []              [get list watch]
      rolebindingrestrictions.authorization.openshift.io         []                 []              [get list watch]
      builds.build.openshift.io/log                              []                 []              [get list watch]
      imagestreams.image.openshift.io/status                     []                 []              [get list watch]
      appliedclusterresourcequotas.quota.openshift.io            []                 []              [get list watch]
      imagestreams/layers                                        []                 []              [get update get]
      imagestreams.image.openshift.io/layers                     []                 []              [get update get]
      builds/details                                             []                 []              [update]
      builds.build.openshift.io/details                          []                 []              [update]
    
    
    Name:         basic-user
    Labels:       <none>
    Annotations:  openshift.io/description: A user that can get basic information about projects.
    	              rbac.authorization.kubernetes.io/autoupdate: true
    PolicyRule:
    	Resources                                           Non-Resource URLs  Resource Names  Verbs
    	  ---------                                           -----------------  --------------  -----
    	  selfsubjectrulesreviews                             []                 []              [create]
    	  selfsubjectaccessreviews.authorization.k8s.io       []                 []              [create]
    	  selfsubjectrulesreviews.authorization.openshift.io  []                 []              [create]
    	  clusterroles.rbac.authorization.k8s.io              []                 []              [get list watch]
    	  clusterroles                                        []                 []              [get list]
    	  clusterroles.authorization.openshift.io             []                 []              [get list]
    	  storageclasses.storage.k8s.io                       []                 []              [get list]
    	  users                                               []                 [~]             [get]
    	  users.user.openshift.io                             []                 [~]             [get]
    	  projects                                            []                 []              [list watch]
    	  projects.project.openshift.io                       []                 []              [list watch]
    	  projectrequests                                     []                 []              [list]
    	  projectrequests.project.openshift.io                []                 []              [list]
    
    Name:         cluster-admin
    Labels:       kubernetes.io/bootstrapping=rbac-defaults
    Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
    PolicyRule:
    Resources  Non-Resource URLs  Resource Names  Verbs
    ---------  -----------------  --------------  -----
    *.*        []                 []              [*]
               [*]                []              [*]
    
    ...
  2. 要查看当前的集群角色绑定集,其中显示绑定到各种角色的用户和组

    $ oc describe clusterrolebinding.rbac
    示例输出
    Name:         alertmanager-main
    Labels:       <none>
    Annotations:  <none>
    Role:
      Kind:  ClusterRole
      Name:  alertmanager-main
    Subjects:
      Kind            Name               Namespace
      ----            ----               ---------
      ServiceAccount  alertmanager-main  openshift-monitoring
    
    
    Name:         basic-users
    Labels:       <none>
    Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
    Role:
      Kind:  ClusterRole
      Name:  basic-user
    Subjects:
      Kind   Name                  Namespace
      ----   ----                  ---------
      Group  system:authenticated
    
    
    Name:         cloud-credential-operator-rolebinding
    Labels:       <none>
    Annotations:  <none>
    Role:
      Kind:  ClusterRole
      Name:  cloud-credential-operator-role
    Subjects:
      Kind            Name     Namespace
      ----            ----     ---------
      ServiceAccount  default  openshift-cloud-credential-operator
    
    
    Name:         cluster-admin
    Labels:       kubernetes.io/bootstrapping=rbac-defaults
    Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
    Role:
      Kind:  ClusterRole
      Name:  cluster-admin
    Subjects:
      Kind   Name            Namespace
      ----   ----            ---------
      Group  system:masters
    
    
    Name:         cluster-admins
    Labels:       <none>
    Annotations:  rbac.authorization.kubernetes.io/autoupdate: true
    Role:
      Kind:  ClusterRole
      Name:  cluster-admin
    Subjects:
      Kind   Name                   Namespace
      ----   ----                   ---------
      Group  system:cluster-admins
      User   system:admin
    
    
    Name:         cluster-api-manager-rolebinding
    Labels:       <none>
    Annotations:  <none>
    Role:
      Kind:  ClusterRole
      Name:  cluster-api-manager-role
    Subjects:
      Kind            Name     Namespace
      ----            ----     ---------
      ServiceAccount  default  openshift-machine-api
    
    ...

查看本地角色和绑定

您可以使用oc CLI 和oc describe命令查看本地角色和绑定。

先决条件
  • 安装oc CLI。

  • 获得查看本地角色和绑定的权限

    • 在集群范围内绑定了cluster-admin默认集群角色的用户可以对任何资源执行任何操作,包括查看本地角色和绑定。

    • 在本地绑定了admin默认集群角色的用户可以查看和管理该项目中的角色和绑定。

步骤
  1. 要查看当前的本地角色绑定集,其中显示绑定到当前项目各种角色的用户和组

    $ oc describe rolebinding.rbac
  2. 要查看其他项目的本地角色绑定,请向命令添加-n标志

    $ oc describe rolebinding.rbac -n joe-project
    示例输出
    Name:         admin
    Labels:       <none>
    Annotations:  <none>
    Role:
      Kind:  ClusterRole
      Name:  admin
    Subjects:
      Kind  Name        Namespace
      ----  ----        ---------
      User  kube:admin
    
    
    Name:         system:deployers
    Labels:       <none>
    Annotations:  openshift.io/description:
                    Allows deploymentconfigs in this namespace to rollout pods in
                    this namespace.  It is auto-managed by a controller; remove
                    subjects to disa...
    Role:
      Kind:  ClusterRole
      Name:  system:deployer
    Subjects:
      Kind            Name      Namespace
      ----            ----      ---------
      ServiceAccount  deployer  joe-project
    
    
    Name:         system:image-builders
    Labels:       <none>
    Annotations:  openshift.io/description:
                    Allows builds in this namespace to push images to this
                    namespace.  It is auto-managed by a controller; remove subjects
                    to disable.
    Role:
      Kind:  ClusterRole
      Name:  system:image-builder
    Subjects:
      Kind            Name     Namespace
      ----            ----     ---------
      ServiceAccount  builder  joe-project
    
    
    Name:         system:image-pullers
    Labels:       <none>
    Annotations:  openshift.io/description:
                    Allows all pods in this namespace to pull images from this
                    namespace.  It is auto-managed by a controller; remove subjects
                    to disable.
    Role:
      Kind:  ClusterRole
      Name:  system:image-puller
    Subjects:
      Kind   Name                                Namespace
      ----   ----                                ---------
      Group  system:serviceaccounts:joe-project

向用户添加角色

您可以使用oc adm管理员 CLI 管理角色和绑定。

将角色绑定到用户或组会向用户或组授予角色授予的访问权限。您可以使用oc adm policy命令向用户和组添加和删除角色。

您可以将任何默认集群角色绑定到项目中的本地用户或组。

步骤
  1. 向特定项目中的用户添加角色

    $ oc adm policy add-role-to-user <role> <user> -n <project>

    例如,您可以通过运行以下命令将admin角色添加到joe项目中的alice用户

    $ oc adm policy add-role-to-user admin alice -n joe

    或者,您可以应用以下 YAML 将角色添加到用户

    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: admin-0
      namespace: joe
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: ClusterRole
      name: admin
    subjects:
    - apiGroup: rbac.authorization.k8s.io
      kind: User
      name: alice
  2. 查看本地角色绑定并在输出中验证添加。

    $ oc describe rolebinding.rbac -n <project>

    例如,要查看joe项目的本地角色绑定

    $ oc describe rolebinding.rbac -n joe
    示例输出
    
    Name:         admin
    Labels:       <none>
    Annotations:  <none>
    Role:
      Kind:  ClusterRole
      Name:  admin
    Subjects:
      Kind  Name        Namespace
      ----  ----        ---------
      User  kube:admin
    
    
    Name:         admin-0
    Labels:       <none>
    Annotations:  <none>
    Role:
      Kind:  ClusterRole
      Name:  admin
    Subjects:
      Kind  Name   Namespace
      ----  ----   ---------
      User  alice (1)
    
    
    Name:         system:deployers
    Labels:       <none>
    Annotations:  openshift.io/description:
                    Allows deploymentconfigs in this namespace to rollout pods in
                    this namespace.  It is auto-managed by a controller; remove
                    subjects to disa...
    Role:
      Kind:  ClusterRole
      Name:  system:deployer
    Subjects:
      Kind            Name      Namespace
      ----            ----      ---------
      ServiceAccount  deployer  joe
    
    
    Name:         system:image-builders
    Labels:       <none>
    Annotations:  openshift.io/description:
                    Allows builds in this namespace to push images to this
                    namespace.  It is auto-managed by a controller; remove subjects
                    to disable.
    Role:
      Kind:  ClusterRole
      Name:  system:image-builder
    Subjects:
      Kind            Name     Namespace
      ----            ----     ---------
      ServiceAccount  builder  joe
    
    
    Name:         system:image-pullers
    Labels:       <none>
    Annotations:  openshift.io/description:
                    Allows all pods in this namespace to pull images from this
                    namespace.  It is auto-managed by a controller; remove subjects
                    to disable.
    Role:
      Kind:  ClusterRole
      Name:  system:image-puller
    Subjects:
      Kind   Name                                Namespace
      ----   ----                                ---------
      Group  system:serviceaccounts:joe
    1 alice用户已添加到admins RoleBinding

创建本地角色

您可以为项目创建本地角色,然后将其绑定到用户。

步骤
  1. 要为项目创建本地角色,请运行以下命令

    $ oc create role <name> --verb=<verb> --resource=<resource> -n <project>

    在此命令中,请指定

    • <name>,本地角色的名称

    • <verb>,应用于角色的动词的逗号分隔列表

    • <resource>,角色适用的资源

    • <project>,项目名称

    例如,要创建一个允许用户查看blue项目中 Pod 的本地角色,请运行以下命令

    $ oc create role podview --verb=get --resource=pod -n blue
  2. 要将新角色绑定到用户,请运行以下命令

    $ oc adm policy add-role-to-user podview user2 --role-namespace=blue -n blue

创建集群角色

您可以创建一个集群角色。

步骤
  1. 要创建集群角色,请运行以下命令

    $ oc create clusterrole <name> --verb=<verb> --resource=<resource>

    在此命令中,请指定

    • <name>,本地角色的名称

    • <verb>,应用于角色的动词的逗号分隔列表

    • <resource>,角色适用的资源

    例如,要创建一个允许用户查看 Pod 的集群角色,请运行以下命令

    $ oc create clusterrole podviewonly --verb=get --resource=pod

本地角色绑定命令

使用以下操作管理用户或组的本地角色绑定关联角色时,可以使用-n标志指定项目。如果未指定,则使用当前项目。

您可以使用以下命令进行本地 RBAC 管理。

表 1. 本地角色绑定操作
命令 描述

$ oc adm policy who-can <verb> <resource>

指示哪些用户可以对资源执行操作。

$ oc adm policy add-role-to-user <role> <username>

将指定的角色绑定到当前项目中的指定用户。

$ oc adm policy remove-role-from-user <role> <username>

从当前项目中的指定用户中删除给定的角色。

$ oc adm policy remove-user <username>

删除当前项目中的指定用户及其所有角色。

$ oc adm policy add-role-to-group <role> <groupname>

将给定的角色绑定到当前项目中的指定组。

$ oc adm policy remove-role-from-group <role> <groupname>

从当前项目中的指定组中删除给定的角色。

$ oc adm policy remove-group <groupname>

删除当前项目中的指定组及其所有角色。

集群角色绑定命令

您还可以使用以下操作管理集群角色绑定。这些操作不使用-n标志,因为集群角色绑定使用非命名空间资源。

表 2. 集群角色绑定操作
命令 描述

$ oc adm policy add-cluster-role-to-user <role> <username>

将给定的角色绑定到集群中所有项目的指定用户。

$ oc adm policy remove-cluster-role-from-user <role> <username>

从集群中所有项目的指定用户中删除给定的角色。

$ oc adm policy add-cluster-role-to-group <role> <groupname>

将给定的角色绑定到集群中所有项目的指定组。

$ oc adm policy remove-cluster-role-from-group <role> <groupname>

从集群中所有项目的指定组中删除给定的角色。

创建集群管理员

cluster-admin角色是执行OpenShift Container Platform集群管理员级任务(例如修改集群资源)所必需的。

先决条件
  • 您必须已创建要定义为集群管理员的用户。

步骤
  • 将用户定义为集群管理员

    $ oc adm policy add-cluster-role-to-user cluster-admin <user>

未经身份验证的组的集群角色绑定

在 OpenShift Container Platform 4.17 之前,未经身份验证的组可以访问某些集群角色。从 OpenShift Container Platform 4.17 之前的版本更新的集群会保留未经身份验证的组对此类访问的权限。

出于安全原因,OpenShift Container Platform 4.17 不允许未经身份验证的组默认访问集群角色。

在某些情况下,可能需要将system:unauthenticated添加到集群角色。

集群管理员可以将未经身份验证的用户添加到以下集群角色

  • system:scope-impersonation

  • system:webhook

  • system:oauth-token-deleter

  • self-access-reviewer

修改未经身份验证的访问权限时,请务必验证是否符合您组织的安全标准。

将未经身份验证的组添加到集群角色

作为集群管理员,您可以通过创建集群角色绑定,将未经身份验证的用户添加到 OpenShift Container Platform 中的以下集群角色。未经身份验证的用户无权访问非公共集群角色。这应仅在必要时在特定用例中执行。

您可以将未经身份验证的用户添加到以下集群角色

  • system:scope-impersonation

  • system:webhook

  • system:oauth-token-deleter

  • self-access-reviewer

修改未经身份验证的访问权限时,请务必验证是否符合您组织的安全标准。

先决条件
  • 您可以作为具有cluster-admin角色的用户访问集群。

  • 您已安装 OpenShift CLI(oc)。

步骤
  1. 创建一个名为add-<cluster_role>-unauth.yaml的 YAML 文件,并添加以下内容

    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
     annotations:
       rbac.authorization.kubernetes.io/autoupdate: "true"
     name: <cluster_role>access-unauthenticated
    roleRef:
     apiGroup: rbac.authorization.k8s.io
     kind: ClusterRole
     name: <cluster_role>
    subjects:
     - apiGroup: rbac.authorization.k8s.io
       kind: Group
       name: system:unauthenticated
  2. 运行以下命令应用配置

    $ oc apply -f add-<cluster_role>.yaml

kubeadmin 用户

安装过程完成后,OpenShift Container Platform 会创建一个集群管理员kubeadmin

此用户会自动应用cluster-admin角色,并被视为集群的 root 用户。密码是动态生成的,对您的 OpenShift Container Platform 环境唯一。安装完成后,密码将显示在安装程序的输出中。例如

INFO Install complete!
INFO Run 'export KUBECONFIG=<your working directory>/auth/kubeconfig' to manage the cluster with 'oc', the OpenShift CLI.
INFO The cluster is ready when 'oc login -u kubeadmin -p <provided>' succeeds (wait a few minutes).
INFO Access the OpenShift web-console here: https://console-openshift-console.apps.demo1.openshift4-beta-abcorp.com
INFO Login to the console with user: kubeadmin, password: <provided>

删除 kubeadmin 用户

定义身份提供程序并创建新的cluster-admin用户后,您可以删除kubeadmin以提高集群安全性。

如果您在另一个用户成为cluster-admin之前执行此过程,则必须重新安装 OpenShift Container Platform。无法撤消此命令。

先决条件
  • 您必须至少配置一个身份提供程序。

  • 您必须已将cluster-admin角色添加到用户。

  • 您必须以管理员身份登录。

步骤
  • 删除kubeadmin密钥

    $ oc delete secrets kubeadmin -n kube-system

使用镜像的 Operator 目录填充 OperatorHub

如果您镜像了 Operator 目录以用于断开连接的集群,则可以使用镜像的目录中的 Operator 填充 OperatorHub。您可以使用镜像过程生成的清单来创建所需的ImageContentSourcePolicyCatalogSource对象。

先决条件

创建 ImageContentSourcePolicy 对象

将 Operator 目录内容镜像到镜像注册表后,创建所需的ImageContentSourcePolicy (ICSP) 对象。ICSP 对象配置节点以在 Operator 清单中存储的镜像引用和镜像注册表之间进行转换。

步骤
  • 在可以访问断开连接的集群的主机上,运行以下命令创建 ICSP,以指定清单目录中的imageContentSourcePolicy.yaml文件

    $ oc create -f <path/to/manifests/dir>/imageContentSourcePolicy.yaml

    其中<path/to/manifests/dir> 是镜像内容清单目录的路径。

    现在,您可以创建一个CatalogSource对象来引用您的镜像索引镜像和 Operator 内容。

向集群添加目录源

向 OpenShift Container Platform 集群添加目录源可使用户发现和安装 Operator。集群管理员可以创建一个CatalogSource对象来引用索引镜像。OperatorHub 使用目录源来填充用户界面。

或者,您可以使用 Web 控制台管理目录源。在**管理** → **集群设置** → **配置** → **OperatorHub** 页面中,单击**来源**选项卡,您可以在此处创建、更新、删除、禁用和启用各个来源。

先决条件
  • 您已构建并向注册表推送了索引镜像。

  • 您可以作为具有cluster-admin角色的用户访问集群。

步骤
  1. 创建一个引用您的索引镜像的CatalogSource对象。如果您使用oc adm catalog mirror命令将您的目录镜像到目标注册表,则可以使用清单目录中生成的catalogSource.yaml文件作为起点。

    1. 根据您的规格修改以下内容并将其保存为catalogSource.yaml文件

      apiVersion: operators.coreos.com/v1alpha1
      kind: CatalogSource
      metadata:
        name: my-operator-catalog (1)
        namespace: openshift-marketplace (2)
      spec:
        sourceType: grpc
        grpcPodConfig:
          securityContextConfig: <security_mode> (3)
        image: <registry>/<namespace>/redhat-operator-index:v4.17 (4)
        displayName: My Operator Catalog
        publisher: <publisher_name> (5)
        updateStrategy:
          registryPoll: (6)
            interval: 30m
      1 如果您在上传到注册表之前将内容镜像到本地文件,请从metadata.name字段中删除任何反斜杠 (/) 字符,以避免在创建对象时出现“无效资源名称”错误。
      2 如果您希望目录源对所有命名空间中的用户全局可用,请指定openshift-marketplace命名空间。否则,您可以为目录指定不同的命名空间,使其仅在该命名空间中可用。
      3 指定legacyrestricted的值。如果未设置该字段,则默认值为legacy。在未来的 OpenShift Container Platform 版本中,计划将默认值设置为restricted。如果您的目录无法在restricted权限下运行,建议您手动将此字段设置为legacy
      4 指定您的索引镜像。如果您在镜像名称后指定了一个标签,例如:v4.17,则目录源 pod 将使用Always的镜像拉取策略,这意味着 pod 始终会在启动容器之前拉取镜像。如果您指定了摘要,例如@sha256:<id>,则镜像拉取策略为IfNotPresent,这意味着 pod 只有在节点上不存在镜像时才会拉取镜像。
      5 指定发布目录的您的姓名或组织名称。
      6 目录源可以自动检查新版本以保持最新。
    2. 使用该文件创建CatalogSource对象

      $ oc apply -f catalogSource.yaml
  2. 验证以下资源是否已成功创建。

    1. 检查 Pod

      $ oc get pods -n openshift-marketplace
      示例输出
      NAME                                    READY   STATUS    RESTARTS  AGE
      my-operator-catalog-6njx6               1/1     Running   0         28s
      marketplace-operator-d9f549946-96sgr    1/1     Running   0         26h
    2. 检查目录源

      $ oc get catalogsource -n openshift-marketplace
      示例输出
      NAME                  DISPLAY               TYPE PUBLISHER  AGE
      my-operator-catalog   My Operator Catalog   grpc            5s
    3. 检查包清单

      $ oc get packagemanifest -n openshift-marketplace
      示例输出
      NAME                          CATALOG               AGE
      jaeger-product                My Operator Catalog   93s

您现在可以从 OpenShift Container Platform Web 控制台的**OperatorHub**页面安装 Operator。

关于使用 OperatorHub 安装 Operator

OperatorHub 是一个用于发现 Operator 的用户界面;它与 Operator Lifecycle Manager (OLM) 协同工作,后者在集群上安装和管理 Operator。

作为集群管理员,您可以使用 OpenShift Container Platform Web 控制台或 CLI 从 OperatorHub 安装 Operator。将 Operator 订阅到一个或多个命名空间可使集群上的开发人员可以使用该 Operator。

在安装过程中,您必须确定 Operator 的以下初始设置

安装模式

选择**集群上的所有命名空间(默认)**可在所有命名空间中安装 Operator,或者选择单个命名空间(如果可用)仅在选定的命名空间中安装 Operator。此示例选择**所有命名空间…**使所有用户和项目都可以使用 Operator。

更新渠道

如果 Operator 可通过多个渠道获得,您可以选择要订阅的渠道。例如,要从**稳定**渠道部署(如果可用),请从列表中选择它。

批准策略

您可以选择自动或手动更新。

如果您为已安装的 Operator 选择自动更新,则当所选渠道中提供该 Operator 的新版本时,Operator Lifecycle Manager (OLM) 会在无需人工干预的情况下自动升级正在运行的 Operator 实例。

如果您选择手动更新,则当有更新版本的 Operator 可用时,OLM 会创建一个更新请求。然后,您作为集群管理员必须手动批准该更新请求才能将 Operator 更新到新版本。

使用 Web 控制台从 OperatorHub 安装

您可以使用 OpenShift Container Platform Web 控制台从 OperatorHub 安装和订阅 Operator。

先决条件
  • 使用具有cluster-admin权限的帐户访问 OpenShift Container Platform 集群。

步骤
  1. 在 Web 控制台中导航到**Operators → OperatorHub**页面。

  2. 滚动或在**按关键字筛选**框中键入关键字以查找所需的 Operator。例如,键入jaeger以查找 Jaeger Operator。

    您还可以按**基础设施功能**筛选选项。例如,如果您想查看在断开连接的环境(也称为受限网络环境)中工作的 Operator,请选择**断开连接**。

  3. 选择 Operator 以显示其他信息。

    选择社区 Operator 会发出警告,提示 Red Hat 不认证社区 Operator;您必须在继续之前确认警告。

  4. 阅读有关 Operator 的信息,然后单击**安装**。

  5. 在**安装 Operator**页面上,配置您的 Operator 安装

    1. 如果您要安装特定版本的 Operator,请从列表中选择**更新渠道**和**版本**。您可以浏览任何渠道中 Operator 的各种版本,查看该渠道和版本的元数据,并选择要安装的确切版本。

      版本选择默认为所选渠道的最新版本。如果选择了渠道的最新版本,则默认启用**自动**批准策略。否则,在未安装所选渠道的最新版本时,需要**手动**批准。

      使用**手动**批准安装 Operator 会导致在命名空间中安装的所有 Operator 都使用**手动**批准策略,并且所有 Operator 都会一起更新。如果您想独立更新 Operator,请将 Operator 安装到单独的命名空间中。

    2. 确认 Operator 的安装模式

      • **集群上的所有命名空间(默认)**会在默认的openshift-operators命名空间中安装 Operator,以监视并使其可用于集群中的所有命名空间。此选项并不总是可用。

      • **集群上的特定命名空间**允许您选择要安装 Operator 的特定单个命名空间。Operator 将仅监视并在该单个命名空间中可用。

    3. 对于启用了令牌身份验证的云提供商集群

      • 如果集群使用 AWS 安全令牌服务(在 Web 控制台中显示为 **STS 模式**),请在 **角色 ARN** 字段中输入您的服务帐户的 AWS IAM 角色的 Amazon 资源名称 (ARN)。要创建角色的 ARN,请按照准备 AWS 帐户中描述的过程操作。

      • 如果集群使用 Microsoft Entra 工作负载 ID(在 Web 控制台中显示为 **工作负载标识/联合身份模式**),请在相应的字段中添加客户端 ID、租户 ID 和订阅 ID。

      • 如果集群使用 Google Cloud Platform 工作负载身份(在 Web 控制台中显示为 **GCP 工作负载标识/联合身份模式**),请在相应的字段中添加项目编号、池 ID、提供商 ID 和服务帐户电子邮件。

    4. 对于 **更新批准**,请选择 **自动** 或 **手动** 批准策略。

      如果 Web 控制台显示集群使用 AWS STS、Microsoft Entra 工作负载 ID 或 GCP 工作负载身份,则必须将 **更新批准** 设置为 **手动**。

      不建议使用自动批准更新的订阅,因为在更新之前可能需要进行权限更改。使用手动批准更新的订阅可确保管理员有机会验证更高版本的权限,采取必要的步骤,然后进行更新。

  6. 单击 **安装** 以使操作员可用于此 OpenShift Container Platform 集群上的选定命名空间。

    1. 如果您选择了 **手动** 批准策略,则订阅的升级状态将保持为 **正在升级**,直到您查看并批准安装计划。

      在 **安装计划** 页面上批准后,订阅升级状态将变为 **最新**。

    2. 如果您选择了 **自动** 批准策略,则升级状态应在无需干预的情况下变为 **最新**。

验证
  • 订阅的升级状态为 **最新** 后,选择 **操作员** → **已安装的操作员** 以验证已安装操作员的集群服务版本 (CSV) 最终是否显示。相关命名空间中的 **状态** 最终应变为 **成功**。

    对于 **所有命名空间…** 安装模式,状态在 `openshift-operators` 命名空间中变为 **成功**,但如果您在其他命名空间中检查,则状态为 **已复制**。

    如果未成功

    • 检查 `openshift-operators` 项目(如果选择了 **特定命名空间…** 安装模式,则为其他相关命名空间)中 **工作负载** → **Pod** 页面上报告问题的任何 Pod 的日志,以便进一步进行故障排除。

  • 安装操作员后,元数据将指示已安装的通道和版本。

    仍然可以使用 **通道** 和 **版本** 下拉菜单在此目录上下文中查看其他版本元数据。

使用 CLI 从 OperatorHub 安装

您可以使用 CLI 从 OperatorHub 安装操作员,而不是使用 OpenShift Container Platform Web 控制台。使用 `oc` 命令创建或更新 `Subscription` 对象。

对于 `SingleNamespace` 安装模式,您还必须确保在相关命名空间中存在适当的操作员组。由 `OperatorGroup` 对象定义的操作员组选择目标命名空间,以便为与操作员组位于同一命名空间中的所有操作员生成所需的 RBAC 访问权限。

在大多数情况下,此过程的 Web 控制台方法更可取,因为它会在后台自动执行任务,例如在选择 `SingleNamespace` 模式时自动处理 `OperatorGroup` 和 `Subscription` 对象的创建。

先决条件
  • 使用具有cluster-admin权限的帐户访问 OpenShift Container Platform 集群。

  • 您已安装 OpenShift CLI(oc)。

步骤
  1. 查看 OperatorHub 中集群可用的操作员列表

    $ oc get packagemanifests -n openshift-marketplace
    示例输出
    NAME                               CATALOG               AGE
    3scale-operator                    Red Hat Operators     91m
    advanced-cluster-management        Red Hat Operators     91m
    amq7-cert-manager                  Red Hat Operators     91m
    # ...
    couchbase-enterprise-certified     Certified Operators   91m
    crunchy-postgres-operator          Certified Operators   91m
    mongodb-enterprise                 Certified Operators   91m
    # ...
    etcd                               Community Operators   91m
    jaeger                             Community Operators   91m
    kubefed                            Community Operators   91m
    # ...

    记下您所需操作员的目录。

  2. 检查您所需的操作员以验证其支持的安装模式和可用的通道。

    $ oc describe packagemanifests <operator_name> -n openshift-marketplace
    示例输出
    # ...
    Kind:         PackageManifest
    # ...
          Install Modes: (1)
            Supported:  true
            Type:       OwnNamespace
            Supported:  true
            Type:       SingleNamespace
            Supported:  false
            Type:       MultiNamespace
            Supported:  true
            Type:       AllNamespaces
    # ...
        Entries:
          Name:       example-operator.v3.7.11
          Version:    3.7.11
          Name:       example-operator.v3.7.10
          Version:    3.7.10
        Name:         stable-3.7 (2)
    # ...
       Entries:
          Name:         example-operator.v3.8.5
          Version:      3.8.5
          Name:         example-operator.v3.8.4
          Version:      3.8.4
        Name:           stable-3.8 (2)
      Default Channel:  stable-3.8 (3)
    
    1 指示支持哪些安装模式。
    2 示例通道名称。
    3 如果未指定通道,则默认选择的通道。

    您可以通过运行以下命令以 YAML 格式打印操作员的版本和通道信息:

    $ oc get packagemanifests <operator_name> -n <catalog_namespace> -o yaml
    • 如果在命名空间中安装了多个目录,请运行以下命令以查找特定目录中操作员的可用版本和通道:

      $ oc get packagemanifest \
         --selector=catalog=<catalogsource_name> \
         --field-selector metadata.name=<operator_name> \
         -n <catalog_namespace> -o yaml

      如果您未指定操作员的目录,如果满足以下条件,则运行 `oc get packagemanifest` 和 `oc describe packagemanifest` 命令可能会返回来自意外目录的包:

      • 在同一命名空间中安装了多个目录。

      • 这些目录包含相同操作员或名称相同的操作员。

  3. 如果您打算安装的操作员支持 `AllNamespaces` 安装模式,并且您选择使用此模式,请跳过此步骤,因为 `openshift-operators` 命名空间默认情况下已设置了适当的操作员组,名为 `global-operators`。

    如果您打算安装的操作员支持 `SingleNamespace` 安装模式,并且您选择使用此模式,则必须确保在相关命名空间中存在适当的操作员组。如果不存在,您可以按照以下步骤创建一个:

    每个命名空间只能有一个操作员组。有关更多信息,请参阅“操作员组”。

    1. 为 `SingleNamespace` 安装模式创建一个 `OperatorGroup` 对象 YAML 文件,例如 `operatorgroup.yaml`。

      用于 `SingleNamespace` 安装模式的示例 `OperatorGroup` 对象:
      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: <operatorgroup_name>
        namespace: <namespace> (1)
      spec:
        targetNamespaces:
        - <namespace> (1)
      1 对于 `SingleNamespace` 安装模式,请对 `metadata.namespace` 和 `spec.targetNamespaces` 字段使用相同的 `` 值。
    2. 创建 `OperatorGroup` 对象:

      $ oc apply -f operatorgroup.yaml
  4. 创建 `Subscription` 对象以将命名空间订阅到操作员。

    1. 为 `Subscription` 对象创建一个 YAML 文件,例如 `subscription.yaml`。

      如果您想订阅操作员的特定版本,请将 `startingCSV` 字段设置为所需的版本,并将 `installPlanApproval` 字段设置为 `Manual` 以防止操作员在目录中存在更高版本时自动升级。有关详细信息,请参阅以下“具有特定起始操作员版本的示例 `Subscription` 对象”。

      示例 `Subscription` 对象:
      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: <subscription_name>
        namespace: <namespace_per_install_mode> (1)
      spec:
        channel: <channel_name> (2)
        name: <operator_name> (3)
        source: <catalog_name> (4)
        sourceNamespace: <catalog_source_namespace> (5)
        config:
          env: (6)
          - name: ARGS
            value: "-v=10"
          envFrom: (7)
          - secretRef:
              name: license-secret
          volumes: (8)
          - name: <volume_name>
            configMap:
              name: <configmap_name>
          volumeMounts: (9)
          - mountPath: <directory_name>
            name: <volume_name>
          tolerations: (10)
          - operator: "Exists"
          resources: (11)
            requests:
              memory: "64Mi"
              cpu: "250m"
            limits:
              memory: "128Mi"
              cpu: "500m"
          nodeSelector: (12)
            foo: bar
      1 对于默认的 `AllNamespaces` 安装模式用法,请指定 `openshift-operators` 命名空间。或者,如果您已创建自定义全局命名空间,则可以指定该命名空间。对于 `SingleNamespace` 安装模式用法,请指定相关的单个命名空间。
      2 要订阅的通道名称。
      3 要订阅的操作员名称。
      4 提供操作员的目录源名称。
      5 目录源的命名空间。对于默认的 OperatorHub 目录源,请使用 `openshift-marketplace`。
      6 `env` 参数定义必须存在于 OLM 创建的 pod 中所有容器中的环境变量列表。
      7 `envFrom` 参数定义用于填充容器中环境变量的源列表。
      8 `volumes` 参数定义必须存在于 OLM 创建的 pod 上的卷列表。
      9 volumeMounts 参数定义了由 OLM 创建的 Pod 中所有容器都必须存在的一组卷挂载。如果 volumeMount 引用了一个不存在的 volume,则 OLM 将无法部署 Operator。
      10 tolerations 参数定义了由 OLM 创建的 Pod 的容忍列表。
      11 resources 参数定义了由 OLM 创建的 Pod 中所有容器的资源限制。
      12 nodeSelector 参数定义了由 OLM 创建的 Pod 的节点选择器。
      指定 Operator 版本的 Subscription 对象示例
      apiVersion: operators.coreos.com/v1alpha1
      kind: Subscription
      metadata:
        name: example-operator
        namespace: example-operator
      spec:
        channel: stable-3.7
        installPlanApproval: Manual (1)
        name: example-operator
        source: custom-operators
        sourceNamespace: openshift-marketplace
        startingCSV: example-operator.v3.7.10 (2)
      1 如果您的指定版本被目录中的更高版本取代,请将批准策略设置为 Manual。此计划可以防止自动升级到更高版本,并在启动 CSV 完成安装之前需要手动批准。
      2 设置 Operator CSV 的特定版本。
    2. 对于启用了令牌身份验证的云提供商集群(例如 Amazon Web Services (AWS) 安全令牌服务 (STS)、Microsoft Entra 工作负载 ID 或 Google Cloud Platform 工作负载身份),请按照以下步骤配置您的 Subscription 对象

      1. 确保 Subscription 对象设置为手动更新批准

        具有手动更新批准的 Subscription 对象示例
        kind: Subscription
        # ...
        spec:
          installPlanApproval: Manual (1)
        1 不建议使用自动批准更新的订阅,因为在更新之前可能需要进行权限更改。使用手动批准更新的订阅可确保管理员有机会验证更高版本的权限,采取必要的步骤,然后进行更新。
      2. Subscription 对象的 config 部分中包含相关的云提供商特定字段

        • 如果集群处于 AWS STS 模式,请包含以下字段

          包含 AWS STS 变量的 Subscription 对象示例
          kind: Subscription
          # ...
          spec:
            config:
              env:
              - name: ROLEARN
                value: "<role_arn>" (1)
          1 包含角色 ARN 详情。
        • 如果集群处于工作负载 ID 模式,请包含以下字段

          包含工作负载 ID 变量的 Subscription 对象示例
          kind: Subscription
          # ...
          spec:
           config:
             env:
             - name: CLIENTID
               value: "<client_id>" (1)
             - name: TENANTID
               value: "<tenant_id>" (2)
             - name: SUBSCRIPTIONID
               value: "<subscription_id>" (3)
          1 包含客户端 ID。
          2 包含租户 ID。
          3 包含订阅 ID。
        • 如果集群处于 GCP 工作负载身份模式,请包含以下字段

          包含 GCP 工作负载身份变量的 Subscription 对象示例
          kind: Subscription
          # ...
          spec:
           config:
             env:
             - name: AUDIENCE
               value: "<audience_url>" (1)
             - name: SERVICE_ACCOUNT_EMAIL
               value: "<service_account_email>" (2)

          其中

          <audience>

          由管理员在 GCP 中创建,当他们设置 GCP 工作负载身份时,AUDIENCE 值必须是以下格式的预格式化 URL

          //iam.googleapis.com/projects/<project_number>/locations/global/workloadIdentityPools/<pool_id>/providers/<provider_id>
          <service_account_email>

          SERVICE_ACCOUNT_EMAIL 值是在 Operator 操作期间模拟的 GCP 服务帐户电子邮件,例如

          <service_account_name>@<project_id>.iam.gserviceaccount.com
    3. 运行以下命令创建 Subscription 对象

      $ oc apply -f subscription.yaml
  5. 如果您将 installPlanApproval 字段设置为 Manual,请手动批准挂起的安装计划以完成 Operator 安装。有关更多信息,请参阅“手动批准挂起的 Operator 更新”。

此时,OLM 现在已经知道所选的 Operator。目标命名空间中应该会出现 Operator 的集群服务版本 (CSV),并且 Operator 提供的 API 应该可以创建。

验证
  1. 运行以下命令检查已安装 Operator 的 Subscription 对象的状态

    $ oc describe subscription <subscription_name> -n <namespace>
  2. 如果您为 SingleNamespace 安装模式创建了 Operator 组,请运行以下命令检查 OperatorGroup 对象的状态

    $ oc describe operatorgroup <operatorgroup_name> -n <namespace>
其他资源