12.5. 使用 scorecard 验证 Operator


Operator 作者应验证其 Operator 已正确打包且没有语法错误。作为 Operator 作者,您可以使用 Operator SDK 的 scorecard 工具验证 Operator 打包并运行测试。

注意

OpenShift Container Platform 4.4 支持 Operator SDK v0.15.0。

12.5.1. 关于 scorecard 工具

为验证 Operator,Operator SDK 的 scorecard 工具将首先创建任何相关的自定义资源 (CR) 和 Operator 所需的所有资源。然后,scorecard 在 Operator 的 Deployment 中创建一个代理容器,用于记录对 API 服务器的调用并运行一些测试。执行的测试还会检查 CR 中的部分参数。

12.5.2. Scorecard 配置

Scorecard 工具使用一个配置文件来供您配置内部插件以及几个全局配置选项。

12.5.2.1. 配置文件

Scorecard 工具配置的默认位置为 <project_dir>/.osdk-scorecard.*。以下是 YAML 格式的配置文件示例:

Scorecard 配置文件

scorecard:
  output: json
  plugins:
    - basic: 1
        cr-manifest:
          - "deploy/crds/cache.example.com_v1alpha1_memcached_cr.yaml"
          - "deploy/crds/cache.example.com_v1alpha1_memcachedrs_cr.yaml"
    - olm: 2
        cr-manifest:
          - "deploy/crds/cache.example.com_v1alpha1_memcached_cr.yaml"
          - "deploy/crds/cache.example.com_v1alpha1_memcachedrs_cr.yaml"
        csv-path: "deploy/olm-catalog/memcached-operator/0.0.3/memcached-operator.v0.0.3.clusterserviceversion.yaml"

1
配置为测试两个 CR 的 basic 测试。
2
配置为测试两个 CR 的 olm 测试。

全局选项的配置方法采用以下优先级,从最高到最低依次为:

命令参数(如果可用)→ 配置文件 默认设置

配置文件必须为 YAML 格式。由于配置文件将来可能会扩展为允许配置所有 operator-sdk 子命令,因此 scorecard 的配置必须在 scorecard 子部分下。

注意

配置文件支持由 viper 软件包提供。如需有关 viper 配置如何工作的更多信息,请参阅 viper 软件包 README

12.5.2.2. 命令参数

虽然大多数的 scorecard ​工具配置都是使用配置文件完成的,但您也可以使用以下参数:

表 12.13. Scorecard 工具参数
标记类型描述

--bundle, -b

字符串

用于捆绑包验证测试的捆绑包目录的路径。

--config

字符串

Scorecard 配置文件的路径。默认为 <project_dir>/.osdk-scorecard。文件类型和扩展名必须为 .yaml。如果没有在默认位置提供或找到配置文件,则 scorecard 退出时会出错。

--output, -o

字符串

输出格式。有效选项为 textjson。默认格式为 text,这是一种人类可读格式。json 格式使用 JSON 模式输出格式,用于稍后定义的插件。

--kubeconfig, -o

字符串

kubeconfig 文件的路径。它为内部插件设置 kubeconfig

--version

字符串

要运行的 scorecard 版本。默认和唯一有效选项为 v1alpha2

--selector, -l

字符串

用于过滤测试的标签选择器。

--list, -L

bool

如果为 true,则只输出会基于选择器过滤运行的测试名称。

12.5.2.3. 配置文件选项

Scorecard 配置文件提供以下选项:

表 12.14. Scorecard 配置文件选项
选项类型描述

bundle

字符串

等同于 --bundle 标记。OLM 捆绑包目录路径,指定时用于运行捆绑包验证。

output

字符串

等同于 --output 标记。如果此选项同时由配置文件和标记定义,则标记的值将具有优先权。

kubeconfig

字符串

等同于 --kubeconfig 标记。如果此选项同时由配置文件和标记定义,则标记的值将具有优先权。

plugins

数组

插件名称的数组。

12.5.2.3.1. 基本和 OLM 插件

Scorecard 支持内部 basicolm 插件,这些插件由配置文件中的 plugins 部分配置。

表 12.15. 插件选项
选项类型描述

cr-manifest

[]string

待测试 CR 的路径。如果 olm-deployed 未设置或为 false,则此项为必需。

csv-path

字符串

Operator 的 CSV 路径。对于 OLM 测试或者当 olm-deployed 设为 true 时为必需。

olm-deployed

bool

指示 OLM 已将 CSV 和相关 CRD 部署到集群中。

kubeconfig

字符串

kubeconfig 文件的路径。如果同时设置了全局 kubeconfig 和此字段,则会将此字段用于插件。

namespace

字符串

在其中运行插件的命名空间。如果未设置,则会使用由 kubeconfig 文件指定的默认设置。

init-timeout

int

Operator 初始化过程中的超时时间(以秒为单位)。

crds-dir

字符串

包含必须部署到集群中的 CRD 的目录路径。

namespaced-manifest

字符串

包含了在一个命名空间内运行的所有资源的清单文件。默认情况下,scorecard 将 deploy 目录中的 service_account.yamlrole.yamlrole_binding.yamloperator.yaml 文件组合成一个临时清单,以用作具有命名空间的清单。

global-manifest

字符串

包含全局运行(不具有命名空间)的所需资源的清单。默认情况下,scorecard 将 crds-dir 目录中的所有 CRD 组合成一个临时清单,以用作全局清单。

注意

目前,将 scorecard 与 CSV 搭配使用时不允许通过 CLI、配置文件或 CSV 注解设置多个 CR 清单。您必须在集群中停止 Operator,重新部署,并为每个经过测试的 CR 重新运行 scorecard。

其他资源

  • 您可以将 cr-manifest 或 CSV 的 metadata.annotations['alm-examples'] 设置为向 scorecard 提供 CR,但不能同时设置两者。详情请参阅 CRD 模板

12.5.3. 执行的测试

默认情况下,scorecard 工具在两个内部插件之间提供八个可以运行的内部测试。如果为插件指定多个 CR,在每个 CR 后会完全清理测试环境,以便每个 CR 获取一个干净的测试环境。

每个测试都有一个唯一标识测试的简短名称。这在选择一个特定测试或多个测试来运行时很有用。例如:

$ operator-sdk scorecard -o text --selector=test=checkspectest
$ operator-sdk scorecard -o text --selector='test in (checkspectest,checkstatustest)'

12.5.3.1. Basic 插件

Basic 插件提供了以下基本的 Operator 测试:

表 12.16. basic 插件测试
测试描述短名称

Spec Block Exists

此测试会检查集群中创建的自定义资源,以确保所有 CR 都有一个 spec 块。此测试的最高分数为 1

checkspectest

Status Block Exists

此测试会检查集群中创建的自定义资源,以确保所有 CR 都有一个 status 块。此测试的最高分数为 1

checkstatustest

Writing Into CRs Has An Effect

此测试会读取 scorecard 代理的日志,以验证 Operator 是否正在向 API 服务器发出 PUT 和/或 POST 请求,表示它正在修改资源。此测试的最高分数为 1

writingintocrshaseffecttest

12.5.3.2. OLM 插件

Olm 插件提供了以下 OLM 集成测试:

测试描述短名称

OLM 捆绑包验证

此测试会验证捆绑包目录中找到的 OLM 捆绑包清单,通过捆绑包标记来指定。如果捆绑包内容包含错误,那么测试结果输出中将包括验证器日志以及验证库中的错误消息。

bundlevalidationtest

Provided APIs Have Validation

此测试会验证提供的 CR 的 CRD 是否包含一个验证部分,且 CR 中检测到的每个 specstatus 字段是否都有验证。此测试的最高分数等于 cr-manifest 选项提供的 CR 数量。

crdshavevalidationtest

Owned CRDs Have Resources Listed

此测试确保 cr-manifest 选项提供的每个 CR 的 CRD 在 CSV 的 owned CRDs 部分都有 resources 子部分。如果测试检测到未在 resources 部分中列出的已使用资源,它会在测试结束时将它们列在建议中。此测试的最高分数等于 cr-manifest 选项提供的 CR 数量。

crdshaveresourcestest

Spec Fields With Descriptors

此测试会验证自定义资源的 spec 部分中的每一个字段是否都在 CSV 中列有对应的描述符。此测试的最高分数等于 cr-manifest 选项传递的每个自定义资源的 spec 部分中的字段总数。

specdescriptorstest

Status Fields With Descriptors

此测试会验证自定义资源的 status 部分中的每一个字段是否都在 CSV 中列有对应的描述符。此测试的最高分数等于 cr-manifest 选项传递的每个自定义资源的 status 部分中的字段总数。

statusdescriptorstest

其他资源

12.5.4. 在 scorecard 中运行

先决条件

Operator 项目的以下先决条件由 scorecard 工具检查:

  • 访问运行 Kubernetes 1.11.3 或更高版本的集群。
  • 如果要使用 scorecard 检查 Operator 项目与 Operator Lifecycle Manager (OLM) 的集成,则还需要 ClusterServiceVersion (CSV) 文件。这是使用 olm-deployed 选项时的一项要求。
  • 对于不是使用 Operator SDK 生成的 Operator(非 SDK Operator):

    • 用于安装和配置 Operator 和 CR 的资源清单。
    • 支持从 KUBECONFIG 环境变量读取的配置 getter,例如 clientcmdcontroller-runtime 配置 getter。这是 scorecard 代理正常工作所需的。

流程

  1. 在 Operator 项目中定义 .osdk-scorecard.yaml 配置文件。
  2. 创建在 RBAC 文件中定义的命名空间 (role_binding)。
  3. 从 Operator 项目的根目录运行 scorecard:

    $ operator-sdk scorecard

    如果任何执行的测试都未通过,则 scorecard 返回代码为 1,如果所有选定的测试都已通过,则为 0

12.5.5. 使用 OLM 管理的 Operator 运行 scorecard

可使用 ClusterServiceVersion (CSV) 运行 scorecard,提供测试集群就绪和非 SDK Operator 的方法。

流程

  1. Scorecard 需要 Operator 的 Deployment Pod 中的代理容器来读取 Operator 日志。在使用 OLM 部署 Operator 之前,需要对 CSV 进行一些修改并创建一个额外的对象来运行代理。

    这一步可以手动执行或使用 bash 功能自动执行。选择以下任一方法。

    • 手动方法:

      1. 创建包含本地 Kubeconfig 的代理服务器 secret:

        1. 使用 scorecard 代理具有命名空间的所有者引用生成用户名。

          $ echo '{"apiVersion":"","kind":"","name":"scorecard","uid":"","Namespace":"'<namespace>'"}' | base64 -w 0 1
          1
          <namespace> 替换为 Operator 将部署到的命名空间。
        2. 使用以下模板编写 Config 清单 scorecard-config.yaml,将 <username> 替换为上一步中生成的 base64 用户名:

          apiVersion: v1
          kind: Config
          clusters:
          - cluster:
              insecure-skip-tls-verify: true
              server: http://<username>@localhost:8889
            name: proxy-server
          contexts:
          - context:
              cluster: proxy-server
              user: admin/proxy-server
            name: <namespace>/proxy-server
          current-context: <namespace>/proxy-server
          preferences: {}
          users:
          - name: admin/proxy-server
            user:
              username: <username>
              password: unused
        3. Config 编码为 base64:

          $ cat scorecard-config.yaml | base64 -w 0
        4. 创建 Secret 清单 scorecard-secret.yaml

          apiVersion: v1
          kind: Secret
          metadata:
            name: scorecard-kubeconfig
            namespace: <namespace> 1
          data:
            kubeconfig: <kubeconfig_base64> 2
          1
          <namespace> 替换为 Operator 将部署到的命名空间。
          2
          <kubeconfig_base64> 替换为编码为 base64 的 Config
        5. 应用 secret:

          $ oc apply -f scorecard-secret.yaml
        6. 将一个指向 Secret 的卷插入到 Operator 的 Deployment 中:

          spec:
            install:
              spec:
                deployments:
                - name: memcached-operator
                  spec:
                    ...
                    template:
                      ...
                      spec:
                        containers:
                        ...
                        volumes:
                        - name: scorecard-kubeconfig 1
                          secret:
                            secretName: scorecard-kubeconfig
                            items:
                            - key: kubeconfig
                              path: config
          1
          Scorecard kubeconfig 卷。
      2. 在 Operator 的 Deployment 中,将卷挂载和 KUBECONFIG 环境变量插入到每个容器中:

        spec:
          install:
            spec:
              deployments:
              - name: memcached-operator
                spec:
                  ...
                  template:
                    ...
                    spec:
                      containers:
                      - name: container1
                        ...
                        volumeMounts:
                        - name: scorecard-kubeconfig 1
                          mountPath: /scorecard-secret
                        env:
                        - name: KUBECONFIG 2
                          value: /scorecard-secret/config
                      - name: container2 3
                        ...
        1
        Scorecard kubeconfig 卷挂载。
        2
        Scorecard kubeconfig 环境变量。
        3
        对此容器和所有其他容器重复同一操作。
      3. 将 scorecard 代理容器插入到 Operator 的 Deployment 中:

        spec:
          install:
            spec:
              deployments:
              - name: memcached-operator
                spec:
                  ...
                  template:
                    ...
                    spec:
                      containers:
                      ...
                      - name: scorecard-proxy 1
                        command:
                        - scorecard-proxy
                        env:
                        - name: WATCH_NAMESPACE
                          valueFrom:
                            fieldRef:
                              apiVersion: v1
                              fieldPath: metadata.namespace
                        image: quay.io/operator-framework/scorecard-proxy:master
                        imagePullPolicy: Always
                        ports:
                        - name: proxy
                          containerPort: 8889
        1
        Scorecard 代理容器。
    • 自动方法:

      Community-operators 存储库有几个 bash 功能,可为您执行流程中的前面步骤:

      $ curl -Lo csv-manifest-modifiers.sh \
          https://raw.githubusercontent.com/operator-framework/community-operators/master/scripts/lib/file
      $ . ./csv-manifest-modifiers.sh
      $ create_kubeconfig_secret_file scorecard-secret.yaml "<namespace>" 1
      $ oc apply -f scorecard-secret.yaml
      $ insert_kubeconfig_volume "<csv_file>" 2
      $ insert_kubeconfig_secret_mount "<csv_file>"
      $ insert_proxy_container "<csv_file>" "quay.io/operator-framework/scorecard-proxy:master"
      1
      <namespace> 替换为 Operator 将部署到的命名空间。
      2
      <csv_file> 替换为 Operator 的 CSV 清单的路径。
  2. 插入代理容器后,按照 Operator SDK 入门指南中的步骤捆绑 CSV 和 CRD,并在 OLM 上部署 Operator。
  3. 在 OLM 上部署了 Operator 后,请在 Operator 项目中定义 .osdk-scorecard.yaml 配置文件,并确保 csv-path: <csv_manifest_path>olm-deployed 选项都已设置。
  4. csv-path: <csv_manifest_path>olm-deployed 均已在 scorecard 配置文件中设置的情况下运行 scorecard:

    $ operator-sdk scorecard
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.