12.7. Operator SDK CLI 参考

本指南记录 Operator SDK CLI 命令及其语法:

$ operator-sdk <command> [<subcommand>] [<argument>] [<flags>]

12.7.1. build

operator-sdk build 命令编译代码并构建可执行文件。build 完成后,镜像会在 docker 本地构建。之后必须推送至远程 registry。

表 12.13. build 参数

参数描述

<image>

要构建的容器镜像,如:quay.io/example/operator:v0.0.1

表 12.14. build 标记

标记描述

--enable-tests (bool)

通过在镜像中添加测试二进制文件来启用集群内测试。

--namespaced-manifest (string)

用于测试的命名空间资源清单的路径。默认值:deploy/operator.yaml

--test-location (string)

测试位置。默认值:./test/e2e

-h, --help

使用方法帮助输出。

如果设定了 --enable-testsbuild 命令还会构建测试二进制文件,将其添加到容器镜像中,并生成一个 deploy/test-pod.yaml 文件,允许用户在群集上作为 Pod 运行测试。

输出示例

$ operator-sdk build quay.io/example/operator:v0.0.1

building example-operator...

building container quay.io/example/operator:v0.0.1...
Sending build context to Docker daemon  163.9MB
Step 1/4 : FROM alpine:3.6
 ---> 77144d8c6bdc
Step 2/4 : ADD tmp/_output/bin/example-operator /usr/local/bin/example-operator
 ---> 2ada0d6ca93c
Step 3/4 : RUN adduser -D example-operator
 ---> Running in 34b4bb507c14
Removing intermediate container 34b4bb507c14
 ---> c671ec1cff03
Step 4/4 : USER example-operator
 ---> Running in bd336926317c
Removing intermediate container bd336926317c
 ---> d6b58a0fcb8c
Successfully built d6b58a0fcb8c
Successfully tagged quay.io/example/operator:v0.0.1

12.7.2. completion

operator-sdk completion 命令生成 shell completion,以便更迅速、更轻松地发出 CLI 命令。

表 12.15. completion 子命令

子命令描述

bash

生成 bash completion。

zsh

生成 zsh completion。

表 12.16. completion 标记

标记描述

-h, --help

使用方法帮助输出。

输出示例

$ operator-sdk completion bash

# bash completion for operator-sdk                         -*- shell-script -*-
...
# ex: ts=4 sw=4 et filetype=sh

12.7.3. print-deps

operator-sdk print-deps 命令打印 Operator 所需的最新 Golang 软件包和版本。默认以列示格式打印。

表 12.17. print-deps 标记

标记描述

--as-file

Gopkg.toml 格式打印软件包和版本。

输出示例

$ operator-sdk print-deps --as-file
required = [
  "k8s.io/code-generator/cmd/defaulter-gen",
  "k8s.io/code-generator/cmd/deepcopy-gen",
  "k8s.io/code-generator/cmd/conversion-gen",
  "k8s.io/code-generator/cmd/client-gen",
  "k8s.io/code-generator/cmd/lister-gen",
  "k8s.io/code-generator/cmd/informer-gen",
  "k8s.io/code-generator/cmd/openapi-gen",
  "k8s.io/gengo/args",
]

[[override]]
  name = "k8s.io/code-generator"
  revision = "6702109cc68eb6fe6350b83e14407c8d7309fd1a"
...

12.7.4. generate

operator-sdk generate 命令调用特定生成器以便根据需要生成代码。

表 12.18. generate 子命令

子命令描述

k8s

pkg/apis/ 下针对所有 CRD API 运行 Kubernetes code-generators。目前,k8s 只会运行 deepcopy-gen 来为所有自定义资源 (CR) 类型生成所需的 DeepCopy() 函数。

注意

每次需要更新自定义资源类型的 API(specstatus)时,便必须运行该命令。

输出示例

$ tree pkg/apis/app/v1alpha1/
pkg/apis/app/v1alpha1/
├── appservice_types.go
├── doc.go
├── register.go

$ operator-sdk generate k8s
Running code-generation for Custom Resource (CR) group versions: [app:v1alpha1]
Generating deepcopy funcs

$ tree pkg/apis/app/v1alpha1/
pkg/apis/app/v1alpha1/
├── appservice_types.go
├── doc.go
├── register.go
└── zz_generated.deepcopy.go

12.7.5. olm-catalog

operator-sdk olm-catalog 是所有 Operator Lifecycle Manager (OLM) 目录相关命令的父命令。

12.7.5.1. gen-csv

使用 gen-csv 子命令可将 ClusterServiceVersion (CSV) 清单和(可选)自定义资源定义 (CRD) 文件写入 deploy/olm-catalog/<operator_name>/<csv_version> 中。

表 12.19. olm-catalog gen-csv 标记

标记描述

--csv-version (string)

CSV 清单的语义版本。必需。

--from-version (string)

CSV 清单的语义版本,用作新版本基础。

--csv-config (string)

CSV 配置文件的路径。默认值:deploy/olm-catalog/csv-config.yaml

--update-crds

使用最新 CRD 清单更新 deploy/<operator_name>/<csv_version> 中的 CRD 清单。

输出示例

$ operator-sdk olm-catalog gen-csv --csv-version 0.1.0 --update-crds
INFO[0000] Generating CSV manifest version 0.1.0
INFO[0000] Fill in the following required fields in file deploy/olm-catalog/operator-name/0.1.0/operator-name.v0.1.0.clusterserviceversion.yaml:
	spec.keywords
	spec.maintainers
	spec.provider
	spec.labels
INFO[0000] Created deploy/olm-catalog/operator-name/0.1.0/operator-name.v0.1.0.clusterserviceversion.yaml

12.7.6. new

使用 operator-sdk new 命令可创建新的 Operator 应用程序,并根据输入的 <project_name> 生成(或构建)默认项目目录布局。

表 12.20. new 参数

参数描述

<project_name>

新项目的名称。

表 12.21. new 标记

标记描述

--api-version

$GROUP_NAME/$VERSION 格式呈现的 CRD APIVersion,如 app.example.com/v1alpha1。与 ansiblehelm 类型一同使用。

--generate-playbook

生成 Ansible playbook 框架。与 ansible 类型一同使用。

--header-file <string>

包含所生成 Go 文件标题的文件路径。复制到 hack/boilerplate.go.txt

--helm-chart <string>

用现有 Helm Chart <url><repo>/<name> 或本地路径来初始化 Helm Operator。

--helm-chart-repo <string>

用于所请求 Helm Chart 的 Chart 存储库 URL。

--helm-chart-version <string>

Helm Chart 的特定版本。(默认值:最新版本)

--help, -h

使用方法和帮助输出。

--kind <string>

CRD Kind,如 AppService。与 ansiblehelm 类型一同使用。

--skip-git-init

不要将目录初始化为 Git 存储库。

--type

要初始化的 Operator 类型:goansiblehelm。(默认值:go

注意

从 Operator SDK v0.12.0 开始,删除了 --dep-manager 标签以及对基于 dep 的项目的支持。现在,Go 项目被构建为使用 Go 模块。

Go 项目使用方法示例

$ mkdir $GOPATH/src/github.com/example.com/
$ cd $GOPATH/src/github.com/example.com/
$ operator-sdk new app-operator

Ansible 项目使用方法示例

$ operator-sdk new app-operator \
    --type=ansible \
    --api-version=app.example.com/v1alpha1 \
    --kind=AppService

12.7.7. add

使用 operator-sdk add 命令可为项目添加控制器或资源。该命令必须从 Operator 项目根目录运行。

表 12.22. add 子命令

子命令描述

api

pkg/apis 下为新的自定义资源 (CR) 添加新 API 定义,并在 deploy/crds/ 下生成自定义资源定义 (CRD) 和自定义资源 (CR) 文件。如果 pkg/apis/<group>/<version> 中已存在 API,则该命令不会覆盖,且会返回错误。

controller

pkg/controller/<kind>/ 下添加新控制器。控制器希望使用 pkg/apis/<group>/<version> 下应该已经通过 operator-sdk add api --kind=<kind> --api-version=<group/version> 命令定义的 CR 类型。如果 pkg/controller/<kind> 中已存在该 Kind 的控制器软件包,则该命令不会进行覆盖,并且会返回错误。

crd

添加 CRD 和 CR 文件。<project-name>/deploy 路径必须已存在。需要 --api-version--kind 标记来生成新的 Operator 应用程序。

  • 所生成的 CRD 文件名:<project-name>/deploy/crds/<group>_<version>_<kind>_crd.yaml
  • 所生成的 CR 文件名:<project-name>/deploy/crds/<group>_<version>_<kind>_cr.yaml

表 12.23. add api 标记

标记描述

--api-version (string)

$GROUP_NAME/$VERSION 格式呈现的 CRD APIVersion,如 app.example.com/v1alpha1

--kind (string)

CRD Kind(如 AppService)。

add api 输出示例

$ operator-sdk add api --api-version app.example.com/v1alpha1 --kind AppService
Create pkg/apis/app/v1alpha1/appservice_types.go
Create pkg/apis/addtoscheme_app_v1alpha1.go
Create pkg/apis/app/v1alpha1/register.go
Create pkg/apis/app/v1alpha1/doc.go
Create deploy/crds/app_v1alpha1_appservice_cr.yaml
Create deploy/crds/app_v1alpha1_appservice_crd.yaml
Running code-generation for Custom Resource (CR) group versions: [app:v1alpha1]
Generating deepcopy funcs

$ tree pkg/apis
pkg/apis/
├── addtoscheme_app_appservice.go
├── apis.go
└── app
	└── v1alpha1
		├── doc.go
		├── register.go
		├── types.go

add controller 输出示例

$ operator-sdk add controller --api-version app.example.com/v1alpha1 --kind AppService
Create pkg/controller/appservice/appservice_controller.go
Create pkg/controller/add_appservice.go

$ tree pkg/controller
pkg/controller/
├── add_appservice.go
├── appservice
│   └── appservice_controller.go
└── controller.go

add crd 输出示例

$ operator-sdk add crd --api-version app.example.com/v1alpha1 --kind AppService
Generating Custom Resource Definition (CRD) files
Create deploy/crds/app_v1alpha1_appservice_crd.yaml
Create deploy/crds/app_v1alpha1_appservice_cr.yaml

12.7.8. test

operator-sdk test 命令可在本地测试 Operator。

12.7.8.1. local

通过 local 子命令,在本地运行使用 Operator SDK 测试框架构建的 Go 测试。

表 12.24. test local 参数

参数描述

<test_location> (string)

e2e 测试文件的位置(如 ./test/e2e/)。

表 12.25. test local 标记

标记描述

--kubeconfig (string)

集群的 kubeconfig 位置。默认值:~/.kube/config

--global-manifest (string)

全局资源清单的路径。默认值:deploy/crd.yaml

--namespaced-manifest (string)

按测试的、命名空间资源的清单路径。默认将 deploy/service_account.yamldeploy/rbac.yamldeploy/operator.yaml 合并到一起。

--namespace (string)

如果非空,则为在其中运行测试的单个命名空间(如 operator-test)。默认值:""

--go-test-flags (string)

要传递至 go test 的额外参数(如 -f "-v -parallel=2")。

--up-local

使用 go run 在本地运行 Operator,而非作为集群中的镜像运行。

--no-setup

禁用测试资源创建。

--image (string)

使用与命名空间清单中指定的镜像不同的 Operator 镜像。

-h, --help

使用方法帮助输出。

输出示例

$ operator-sdk test local ./test/e2e/

# Output:
ok  	github.com/operator-framework/operator-sdk-samples/memcached-operator/test/e2e	20.410s

12.7.9. up

operator-sdk up 命令包含可通过多种方式启动 Operator 的子命令。

12.7.9.1. local

local 子命令通过构建 Operator 二进制文件来启动本地机器上的 Operator,该二进制文件可使用 kubeconfig 文件来访问 Kubernetes 集群。

表 12.26. up local 参数

参数描述

--kubeconfig (string)

Kubernetes 配置文件的文件路径。默认值:$HOME/.kube/config

--namespace (string)

Operator 监视是否发生变化的命名空间。默认值:default

--operator-flags

本地 Operator 可能需要的标记。示例:--flag1 value1 --flag2=value2

-h, --help

使用方法帮助输出。

输出示例

$ operator-sdk up local \
  --kubeconfig "mycluster.kubecfg" \
  --namespace "default" \
  --operator-flags "--flag1 value1 --flag2=value2"

以下示例使用默认 kubeconfig,即默认的命名空间环境变量,并为 Operator 传递标记。要使用 Operator 标记,您的 Operator 必须知道如何处理该选项。例如,对于理解 resync-interval 标记的 Operator 来说:

$ operator-sdk up local --operator-flags "--resync-interval 10"

如果您计划使用与默认命名空间不同的命名空间,请使用 --namespace 标记来更改 Operator 监视要创建自定义资源 (CR) 的位置:

$ operator-sdk up local --namespace "testing"

要实现这一目的,您的 Operator 必须负责处理 WATCH_NAMESPACE 环境变量。这可通过使用 Operator 中的 utility 函数 k8sutil.GetWatchNamespace 来完成。