×

使用 Operator Lifecycle Manager (OLM),集群管理员可以将基于 OLM 的 Operator 安装到 OpenShift Container Platform 集群。

有关 OLM 如何处理安装在同一命名空间中的 Operator 的更新以及使用自定义全局 Operator 组安装 Operator 的替代方法的信息,请参阅 多租户和 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。例如,输入advanced以查找适用于Kubernetes的Advanced Cluster Management Operator。

    您还可以按**基础架构功能**筛选选项。例如,如果您想查看在脱机环境(也称为受限网络环境)中工作的Operators,请选择**脱机**。

  3. 选择Operator以显示更多信息。

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

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

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

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

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

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

    2. 确认Operator的安装模式

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

      • **集群上的特定命名空间**允许您选择要在其中安装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. 单击**安装**以使Operator可用于此OpenShift Container Platform集群上选定的命名空间。

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

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

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

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

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

    如果没有

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

  • 安装Operator后,元数据会指示安装了哪个通道和版本。

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

使用CLI从OperatorHub安装

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

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

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

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

  • 您已安装OpenShift CLI(oc)。

步骤
  1. 查看OperatorHub中集群可用的Operator列表。

    $ 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
    # ...

    请注意所需Operator的目录。

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

    $ 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格式打印Operator的版本和通道信息。

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

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

      如果您未指定Operator的目录,如果满足以下条件,则运行oc get packagemanifestoc describe packagemanifest命令可能会返回来自意外目录的包。

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

      • 这些目录包含相同的Operator或名称相同的Operator。

  3. 如果您打算安装的Operator支持AllNamespaces安装模式,并且您选择使用此模式,请跳过此步骤,因为openshift-operators命名空间默认情况下已安装相应的Operator组,名为global-operators

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

    每个命名空间只能拥有一个 Operator 组。更多信息,请参阅“Operator 组”。

    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.namespacespec.targetNamespaces字段使用相同的<namespace>值。
    2. 创建OperatorGroup对象

      $ oc apply -f operatorgroup.yaml
  4. 创建一个Subscription对象,将命名空间订阅到 Operator

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

      如果您想订阅特定版本的 Operator,请将startingCSV字段设置为所需版本,并将installPlanApproval字段设置为Manual,以防止在目录中存在更高版本时 Operator 自动升级。详情请参阅以下“具有特定起始 Operator 版本的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 要订阅的 Operator 名称。
      4 提供 Operator 的目录源名称。
      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 的NodeSelector
      具有特定起始 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>

为多租户集群中 Operator 的多个实例做准备

作为集群管理员,您可以添加 Operator 的多个实例以用于多租户集群。这是对使用标准的“所有命名空间”安装模式(这可能被认为违反了最小权限原则)或“多命名空间”模式(未被广泛采用)的替代方案。更多信息,请参阅“多租户集群中的 Operator”。

在以下过程中,租户是指共享已部署工作负载集的公共访问权限和权限的用户或用户组。租户 Operator 是仅供该租户使用的 Operator 实例。

先决条件
  • 您要安装的所有 Operator 实例在给定集群中必须是相同版本。

    有关此信息和其他限制的更多信息,请参阅“多租户集群中的 Operator”。

步骤
  1. 在安装 Operator 之前,为租户 Operator 创建一个与租户命名空间分开的命名空间。例如,如果租户的命名空间是team1,您可以创建一个team1-operator命名空间

    1. 定义Namespace资源并保存 YAML 文件,例如team1-operator.yaml

      apiVersion: v1
      kind: Namespace
      metadata:
        name: team1-operator
    2. 运行以下命令创建命名空间

      $ oc create -f team1-operator.yaml
  2. 为作用域为租户命名空间的租户 Operator 创建一个 Operator 组,在spec.targetNamespaces列表中仅包含该命名空间条目。

    1. 定义OperatorGroup资源并保存 YAML 文件,例如team1-operatorgroup.yaml

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: team1-operatorgroup
        namespace: team1-operator
      spec:
        targetNamespaces:
        - team1 (1)
      1 仅在spec.targetNamespaces列表中定义租户的命名空间。
    2. 运行以下命令创建 Operator 组

      $ oc create -f team1-operatorgroup.yaml
后续步骤
  • 在租户 Operator 命名空间中安装 Operator。使用 Web 控制台中的 OperatorHub 比使用 CLI 更容易完成此任务;有关详细过程,请参阅使用 Web 控制台从 OperatorHub 安装

    完成 Operator 安装后,Operator 驻留在租户 Operator 命名空间中并监视租户命名空间,但租户无法看到或使用 Operator 的 pod 或其服务帐户。

在自定义命名空间中安装全局 Operator

使用OpenShift Container Platform Web控制台安装Operator时,默认行为会将支持**所有命名空间**安装模式的Operator安装到默认的openshift-operators全局命名空间中。这可能会导致命名空间中所有Operator之间共享安装计划和更新策略相关的问题。有关这些限制的更多详细信息,请参阅“多租户和Operator同处”。

作为集群管理员,您可以通过手动创建一个自定义全局命名空间,并使用该命名空间来安装您单独的或作用域内的Operator及其依赖项来绕过此默认行为。

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

步骤
  1. 在安装Operator之前,请为所需Operator的安装创建一个命名空间。此安装命名空间将成为自定义全局命名空间。

    1. 定义一个Namespace资源并保存YAML文件,例如global-operators.yaml

      apiVersion: v1
      kind: Namespace
      metadata:
        name: global-operators
    2. 运行以下命令创建命名空间

      $ oc create -f global-operators.yaml
  2. 创建一个自定义的全局Operator组,这是一个监视所有命名空间的Operator组。

    1. 定义一个OperatorGroup资源并保存YAML文件,例如global-operatorgroup.yaml。省略spec.selectorspec.targetNamespaces字段,使其成为一个全局Operator组,该组选择所有命名空间。

      apiVersion: operators.coreos.com/v1
      kind: OperatorGroup
      metadata:
        name: global-operatorgroup
        namespace: global-operators

      已创建的全局Operator组的status.namespaces包含空字符串 (""),这向使用者Operator发出信号,指示它应该监视所有命名空间。

    2. 运行以下命令创建 Operator 组

      $ oc create -f global-operatorgroup.yaml
后续步骤
  • 在您的自定义全局命名空间中安装所需的Operator。由于Web控制台在使用自定义全局命名空间安装Operator时不会填充**已安装命名空间**菜单,因此此任务只能使用OpenShift CLI (oc) 执行。有关详细步骤,请参阅使用CLI从OperatorHub安装

    启动Operator安装时,如果Operator有依赖项,这些依赖项也会自动安装在自定义全局命名空间中。因此,依赖Operator具有相同的更新策略和共享安装计划是有效的。

Operator工作负载的Pod放置

默认情况下,Operator生命周期管理器 (OLM) 在安装Operator或部署Operand工作负载时会将Pod放置在任意工作节点上。作为管理员,您可以使用具有节点选择器、污点和容忍度组合的项目来控制Operator和Operand到特定节点的放置。

控制Operator和Operand工作负载的Pod放置具有以下先决条件:

  1. 根据您的需求确定要为Pod定位的节点或节点集。如果可用,请注意现有标签,例如node-role.kubernetes.io/app,它标识节点或节点。否则,请使用计算机组或直接编辑节点来添加标签,例如myoperator。您将在后面的步骤中将此标签用作项目上的节点选择器。

  2. 如果您想确保只有具有特定标签的Pod才能在节点上运行,同时将不相关的作业引导到其他节点,请使用计算机会集或直接编辑节点来向节点添加污点。使用确保不匹配污点的新的Pod无法在节点上调度的效果。例如,myoperator:NoSchedule污点确保不匹配污点的新的Pod不会调度到该节点,但允许节点上的现有Pod保留。

  3. 创建一个配置了默认节点选择器且(如果您添加了污点)具有匹配容忍度的项目。

此时,您可以使用创建的项目在以下情况下将Pod引导到指定的节点:

对于Operator Pod:

管理员可以在项目中创建Subscription对象,如下节所述。结果,Operator Pod 将放置在指定的节点上。

对于Operand Pod:

使用已安装的Operator,用户可以在项目中创建一个应用程序,该应用程序将Operator拥有的自定义资源 (CR) 放置在项目中。结果,Operand Pod 将放置在指定的节点上,除非Operator正在其他命名空间中部署集群范围的对象或资源,在这种情况下,此自定义Pod放置不适用。

控制Operator的安装位置

默认情况下,安装Operator时,OpenShift Container Platform 会将 Operator Pod 随机安装到您的某个工作节点上。但是,在某些情况下,您可能希望将该 Pod 调度到特定节点或节点集。

以下示例描述了您可能希望将 Operator Pod 调度到特定节点或节点集的情况:

  • 如果Operator需要特定平台,例如amd64arm64

  • 如果Operator需要特定操作系统,例如Linux或Windows。

  • 如果您希望一起工作的Operator调度到同一主机或位于同一机架上的主机上。

  • 如果您希望Operator分散在整个基础架构中,以避免因网络或硬件问题导致的停机。

您可以通过向Operator的Subscription对象添加节点亲和性、Pod亲和性或Pod反亲和性约束来控制Operator Pod的安装位置。节点亲和性是由调度程序用于确定可以在何处放置Pod的一组规则。Pod亲和性使您可以确保将相关的Pod调度到同一节点。Pod反亲和性允许您阻止Pod在节点上进行调度。

以下示例显示如何使用节点亲和性或Pod反亲和性将自定义指标自动缩放器Operator的实例安装到集群中的特定节点。

将Operator Pod放置在特定节点上的节点亲和性示例
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: openshift-custom-metrics-autoscaler-operator
  namespace: openshift-keda
spec:
  name: my-package
  source: my-operators
  sourceNamespace: operator-registries
  config:
    affinity:
      nodeAffinity: (1)
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - ip-10-0-163-94.us-west-2.compute.internal
#...
1 需要将Operator的Pod调度到名为ip-10-0-163-94.us-west-2.compute.internal的节点上的节点亲和性。
将Operator Pod放置在具有特定平台的节点上的节点亲和性示例
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: openshift-custom-metrics-autoscaler-operator
  namespace: openshift-keda
spec:
  name: my-package
  source: my-operators
  sourceNamespace: operator-registries
  config:
    affinity:
      nodeAffinity: (1)
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/arch
              operator: In
              values:
              - arm64
            - key: kubernetes.io/os
              operator: In
              values:
              - linux
#...
1 需要将Operator的Pod调度到具有kubernetes.io/arch=arm64kubernetes.io/os=linux标签的节点上的节点亲和性。
将Operator Pod放置在一个或多个特定节点上的Pod亲和性示例
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: openshift-custom-metrics-autoscaler-operator
  namespace: openshift-keda
spec:
  name: my-package
  source: my-operators
  sourceNamespace: operator-registries
  config:
    affinity:
      podAffinity: (1)
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
            - key: app
              operator: In
              values:
              - test
          topologyKey: kubernetes.io/hostname
#...
1 将Operator的Pod放置在具有app=test标签的Pod的节点上的Pod亲和性。
阻止Operator Pod在一个或多个特定节点上的Pod反亲和性示例
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
  name: openshift-custom-metrics-autoscaler-operator
  namespace: openshift-keda
spec:
  name: my-package
  source: my-operators
  sourceNamespace: operator-registries
  config:
    affinity:
      podAntiAffinity: (1)
        requiredDuringSchedulingIgnoredDuringExecution:
        - labelSelector:
            matchExpressions:
            - key: cpu
              operator: In
              values:
              - high
          topologyKey: kubernetes.io/hostname
#...
1 阻止Operator的Pod调度到具有cpu=high标签的Pod的节点上的Pod反亲和性。
步骤

要控制Operator Pod的放置,请完成以下步骤:

  1. 照常安装Operator。

  2. 如果需要,请确保您的节点已标记以正确响应亲和性。

  3. 编辑Operator Subscription对象以添加亲和性

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: openshift-custom-metrics-autoscaler-operator
      namespace: openshift-keda
    spec:
      name: my-package
      source: my-operators
      sourceNamespace: operator-registries
      config:
        affinity: (1)
          nodeAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: kubernetes.io/hostname
                  operator: In
                  values:
                  - ip-10-0-185-229.ec2.internal
    #...
    1 添加nodeAffinitypodAffinitypodAntiAffinity。有关创建亲和性的信息,请参阅下面的附加资源部分。
验证
  • 要确保Pod部署在特定节点上,请运行以下命令:

    $ oc get pods -o wide
    示例输出
    NAME                                                  READY   STATUS    RESTARTS   AGE   IP            NODE                           NOMINATED NODE   READINESS GATES
    custom-metrics-autoscaler-operator-5dcc45d656-bhshg   1/1     Running   0          50s   10.131.0.20   ip-10-0-185-229.ec2.internal   <none>           <none>