4.7. 允许非集群管理员安装 Operator

集群管理员可以使用 Operator 组来允许常规用户安装 Operator。

其他资源

4.7.1. 了解 Operator 安装策略

Operator 可能需要广泛权限才可运行,且不同版本需要的权限也可能不同。Operator Lifecycle Manager (OLM) 需要 cluster-admin 权限才可运行。默认情况下,Operator 作者可在集群服务版本(CSV)中指定任意权限集,OLM 之后会将其授予 Operator。

为确保 Operator 无法获得集群范围的权限,并且用户无法使用 OLM 升级权限,集群管理员可在将 Operator 添加到集群前手动审核 Operator。集群管理员还可获得一些工具来决定和限制在使用服务账户安装或升级 Operator 期间允许的操作。

集群管理员可以将 Operator 组与赋予了一组权限的服务账户关联。服务帐户在 Operator 上设置策略,通过使用基于角色的访问控制 (RBAC) 规则来确保它们仅在预先确定的边界内运行。因此,Operator 无法执行这些规则未明确允许的任何操作。

通过使用 Operator 组,具有足够权限的用户可以安装具有有限范围的 Operator。因此,更多 Operator Framework 工具可以安全地提供给更多用户,为使用 Operator 构建应用程序提供更丰富的体验。

注意

Subscription 对象的基于角色的访问控制 (RBAC) 会自动授予命名空间中具有 editadmin 角色的用户。但是,OperatorGroup 对象不存在 RBAC;没有什么情况可防止常规用户安装 Operator。预安装 Operator 组实际上会提供安装权限。

在将 Operator 组与服务帐户关联时请注意以下几点:

  • APIServiceCustomResourceDefinition 资源都由 OLM 使用 cluster-admin 角色来创建。不应向与 Operator 组相关联的服务账户授予写入这些资源的权限。
  • 与该 Operator 组相关联的所有 Operator 现已被限制在指定服务账户获得的权限范围内。如果 Operator 请求了超出服务账户范围的权限,安装会失败,并显示适当的错误,以便集群管理员能够排除故障并解决问题。

4.7.1.1. 安装场景

在确定是否可在集群上安装或升级 Operator 时,Operator Lifecycle Manager(OLM)会考虑以下情况:

  • 集群管理员新建了一个 Operator 组并指定了服务账户。已安装与该 Operator 组关联的所有 Operator,并根据相应服务账户获得的权限运行。
  • 集群管理员新建了一个 Operator 组,且不指定任何服务帐户。OpenShift Container Platform 保持向后兼容性,因此会保留默认行为,并允许安装和升级 Operator。
  • 对于未指定服务账户的现有 Operator 组,会保留默认行为,并允许安装和升级 Operator。
  • 集群管理员更新了现有 Operator 组并指定了服务帐户。OLM 支持现有 Operator 继续根据当前权限运行。现有 Operator 升级后,它会重新安装并根据相应服务账户获得的权限运行,与新 Operator 一样。
  • 由 Operator 组指定的服务帐户通过添加或删除权限来更改,或者现有服务账户被换为新服务帐户。现有 Operator 升级后,它会重新安装并根据更新后的服务账户获得的权限运行,与新 Operator 一样。
  • 集群管理员从 Operator 组中删除服务账户。默认行为保留,并允许安装和升级 Operator。

4.7.1.2. 安装工作流

当 Operator 组与服务账户绑定,并且安装或升级了 Operator 时,Operator Lifecycle Manager(OLM)会使用以下工作流:

  1. OLM 会提取给定订阅对象。
  2. OLM 获取与该订阅相关联的 Operator 组。
  3. OLM 确定 Operator 组是否指定了服务帐户。
  4. OLM 在服务账户范围内创建一个客户端,并使用该范围内客户端来安装 Operator。这样可确保 Operator 请求的任何权限始终限制在 Operator 组中服务账户的权限范围内。
  5. OLM 新建一个服务账户,在 CSV 中指定其权限集,并将其分配至 Operator。Operator 将根据所分配的服务账户运行。

4.7.2. 限定 Operator 安装范围

要为 Operator Lifecycle Manager(OLM)上的 Operator 安装和升级提供范围规则,请将服务帐户与 Operator 组关联。

集群管理员可借鉴本例,将一组 Operator 限制到指定命名空间中。

流程

  1. 新建命名空间:

    $ cat <<EOF | oc create -f -
    apiVersion: v1
    kind: Namespace
    metadata:
      name: scoped
    EOF
  2. 分配 Operator 的权限范围。这涉及创建新服务帐户、相关角色和角色绑定。

    $ cat <<EOF | oc create -f -
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: scoped
      namespace: scoped
    EOF

    为简便起见,以下示例授予服务账户在指定命名空间进行任何操作的权限。在生产环境中,应创建更为精细的权限集:

    $ cat <<EOF | oc create -f -
    apiVersion: rbac.authorization.k8s.io/v1
    kind: Role
    metadata:
      name: scoped
      namespace: scoped
    rules:
    - apiGroups: ["*"]
      resources: ["*"]
      verbs: ["*"]
    ---
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: scoped-bindings
      namespace: scoped
    roleRef:
      apiGroup: rbac.authorization.k8s.io
      kind: Role
      name: scoped
    subjects:
    - kind: ServiceAccount
      name: scoped
      namespace: scoped
    EOF
  3. 在指定的命名空间中创建 OperatorGroup 对象。该 Operator 组以指定的命名空间为目标,以确保其租期仅限于该命名空间。

    另外,Operator 组允许用户指定服务帐户。指定上一步中创建的服务帐户:

    $ cat <<EOF | oc create -f -
    apiVersion: operators.coreos.com/v1
    kind: OperatorGroup
    metadata:
      name: scoped
      namespace: scoped
    spec:
      serviceAccountName: scoped
      targetNamespaces:
      - scoped
    EOF

    在指定命名空间中安装的任何 Operator 均会关联至此 Operator 组,因此也会关联到指定的服务账户。

  4. 在指定命名空间中创建 Subscription 对象以安装 Operator:

    $ cat <<EOF | oc create -f -
    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: etcd
      namespace: scoped
    spec:
      channel: singlenamespace-alpha
      name: etcd
      source: <catalog_source_name> 1
      sourceNamespace: <catalog_source_namespace> 2
    EOF
    1
    指定已存在于指定命名空间中或位于全局目录命名空间中的目录源。
    2
    指定创建目录源的命名空间。

    与该 Operator 组相关联的所有 Operator 都仅限于为指定服务账户授予的权限。如果 Operator 请求的权限超出服务账户范围,安装会失败并显示相关错误。

4.7.2.1. 细粒度权限

Operator Lifecycle Manager(OLM)使用 Operator 组中指定的服务账户来创建或更新与正在安装的 Operator 相关的以下资源:

  • ClusterServiceVersion
  • Subscription
  • Secret
  • ServiceAccount
  • Service
  • ClusterRoleClusterRoleBinding
  • RoleRoleBinding

要将 Operator 限制到指定命名空间,集群管理员可以首先向服务账户授予以下权限:

注意

以下角色只是一个通用示例,具体 Operator 可能需要额外规则。

kind: Role
rules:
- apiGroups: ["operators.coreos.com"]
  resources: ["subscriptions", "clusterserviceversions"]
  verbs: ["get", "create", "update", "patch"]
- apiGroups: [""]
  resources: ["services", "serviceaccounts"]
  verbs: ["get", "create", "update", "patch"]
- apiGroups: ["rbac.authorization.k8s.io"]
  resources: ["roles", "rolebindings"]
  verbs: ["get", "create", "update", "patch"]
- apiGroups: ["apps"] 1
  resources: ["deployments"]
  verbs: ["list", "watch", "get", "create", "update", "patch", "delete"]
- apiGroups: [""] 2
  resources: ["pods"]
  verbs: ["list", "watch", "get", "create", "update", "patch", "delete"]
1 2
增加创建其他资源的权限,如此处显示的部署和 pod。

另外,如果任何 Operator 指定了 pull secret,还必须增加以下权限:

kind: ClusterRole 1
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["get"]
---
kind: Role
rules:
- apiGroups: [""]
  resources: ["secrets"]
  verbs: ["create", "update", "patch"]
1
需要从 OLM 命名空间中获取 secret。

4.7.3. Operator 目录访问控制

当在全局目录命名空间 openshift-marketplace 中创建 Operator 目录时,目录的 Operator 会提供给所有命名空间。在其他命名空间中创建的目录仅使其 Operator 在目录的同一命名空间中可用。

在非集群管理员用户委托了 Operator 安装权限的集群上,集群管理员可能需要进一步控制或限制允许用户安装的 Operator 集合。这可以通过以下操作来实现:

  1. 禁用所有默认全局目录。
  2. 在预安装相关 Operator 组的同一命名空间中启用自定义、策展的目录。

4.7.4. 故障排除权限失败

如果因为缺少权限而导致 Operator 安装失败,请按照以下流程找出错误。

流程

  1. 查看 Subscription 对象。其状态中有一个指向 InstallPlan 对象的对象引用 installPlanRef,该对象试图为 Operator 创建需要的 [Cluster]Role[Binding]

    apiVersion: operators.coreos.com/v1
    kind: Subscription
    metadata:
      name: etcd
      namespace: scoped
    status:
      installPlanRef:
        apiVersion: operators.coreos.com/v1
        kind: InstallPlan
        name: install-4plp8
        namespace: scoped
        resourceVersion: "117359"
        uid: 2c1df80e-afea-11e9-bce3-5254009c9c23
  2. 检查 InstallPlan 对象的状态中的任何错误:

    apiVersion: operators.coreos.com/v1
    kind: InstallPlan
    status:
      conditions:
      - lastTransitionTime: "2019-07-26T21:13:10Z"
        lastUpdateTime: "2019-07-26T21:13:10Z"
        message: 'error creating clusterrole etcdoperator.v0.9.4-clusterwide-dsfx4: clusterroles.rbac.authorization.k8s.io
          is forbidden: User "system:serviceaccount:scoped:scoped" cannot create resource
          "clusterroles" in API group "rbac.authorization.k8s.io" at the cluster scope'
        reason: InstallComponentFailed
        status: "False"
        type: Installed
      phase: Failed

    错误信息中会显示:

    • 创建失败的资源类型,包括资源的 API 组。本例中为 rbac.authorization.k8s.io 组中的 clusterroles
    • 资源名称。
    • 错误类型:is forbidden 表明相应用户没有足够权限来执行这一操作。
    • 试图创建或更新资源的用户名称。本例中指的是 Operator 组中指定的服务账户。
    • 操作范围:集群范围内或范围外。

      用户可在服务账户中增加所缺权限,然后迭代操作。

      注意

      Operator Lifecycle Manager(OLM)目前未提供第一次尝试的完整错误列表。