第 7 章 Knative CLI
7.1. Knative Serving CLI 命令
7.1.1. kn service 命令
您可以使用以下命令创建和管理 Knative 服务。
7.1.1.1. 使用 Knative CLI 创建无服务器应用程序
通过使用 Knative (kn
) CLI 创建无服务器应用程序,通过直接修改 YAML 文件来提供更精简且直观的用户界面。您可以使用 kn service create
命令创建基本无服务器应用程序。
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。
-
已安装 Knative (
kn
) CLI。 - 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
流程
创建 Knative 服务:
$ kn service create <service-name> --image <image> --tag <tag-value>
其中:
-
--image
是应用的镜像的 URI。 --tag
是一个可选标志,可用于向利用服务创建的初始修订版本添加标签。示例命令
$ kn service create event-display \ --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest
输出示例
Creating service 'event-display' in namespace 'default': 0.271s The Route is still working to reflect the latest desired specification. 0.580s Configuration "event-display" is waiting for a Revision to become ready. 3.857s ... 3.861s Ingress has not yet been reconciled. 4.270s Ready to serve. Service 'event-display' created with latest revision 'event-display-bxshg-1' and URL: http://event-display-default.apps-crc.testing
-
7.1.1.2. 使用 Knative CLI 更新无服务器应用程序
在以递增方式构建服务时,您可以使用 kn service update
命令进行命令行上的互动会话。与 kn service apply
命令不同,在使用 kn service update
命令时,只需要指定您要更新的更改,而不是指定 Knative 服务的完整配置。
示例命令
通过添加新环境变量来更新服务:
$ kn service update <service_name> --env <key>=<value>
通过添加新端口来更新服务:
$ kn service update <service_name> --port 80
通过添加新的请求和限制参数来更新服务:
$ kn service update <service_name> --request cpu=500m --limit memory=1024Mi --limit cpu=1000m
为修订分配
latest
标签:$ kn service update <service_name> --tag <revision_name>=latest
为服务的最新
READY
修订将标签从testing
更新为staging
:$ kn service update <service_name> --untag testing --tag @latest=staging
将
test
标签添加到接收 10% 流量的修订,并将其它流量发送到服务的最新READY
修订:$ kn service update <service_name> --tag <revision_name>=test --traffic test=10,@latest=90
7.1.1.3. 应用服务声明
您可以使用 kn service apply
命令声明性配置 Knative 服务。如果服务不存在,则使用已更改的选项更新现有服务。
kn service apply
命令对 shell 脚本或持续集成管道特别有用,因为用户通常希望在单个命令中完全指定服务的状态来声明目标状态。
使用 kn service apply
时,必须为 Knative 服务提供完整的配置。这与 kn service update
命令不同,它只在命令中指定您要更新的选项。
示例命令
创建服务:
$ kn service apply <service_name> --image <image>
将环境变量添加到服务:
$ kn service apply <service_name> --image <image> --env <key>=<value>
从 JSON 或 YAML 文件中读取服务声明:
$ kn service apply <service_name> -f <filename>
7.1.1.4. 使用 Knative CLI 描述无服务器应用程序
您可以使用 kn service describe
命令来描述 Knative 服务。
示例命令
描述服务:
$ kn service describe --verbose <service_name>
--verbose
标志是可选的,但可以包含它以提供更详细的描述。常规输出和详细输出之间的区别在以下示例中显示:没有
--verbose
标记的输出示例Name: hello Namespace: default Age: 2m URL: http://hello-default.apps.ocp.example.com Revisions: 100% @latest (hello-00001) [1] (2m) Image: docker.io/openshift/hello-openshift (pinned to aaea76) Conditions: OK TYPE AGE REASON ++ Ready 1m ++ ConfigurationsReady 1m ++ RoutesReady 1m
带有
--verbose
标记的输出示例Name: hello Namespace: default Annotations: serving.knative.dev/creator=system:admin serving.knative.dev/lastModifier=system:admin Age: 3m URL: http://hello-default.apps.ocp.example.com Cluster: http://hello.default.svc.cluster.local Revisions: 100% @latest (hello-00001) [1] (3m) Image: docker.io/openshift/hello-openshift (pinned to aaea76) Env: RESPONSE=Hello Serverless! Conditions: OK TYPE AGE REASON ++ Ready 3m ++ ConfigurationsReady 3m ++ RoutesReady 3m
以 YAML 格式描述服务:
$ kn service describe <service_name> -o yaml
以 JSON 格式描述服务:
$ kn service describe <service_name> -o json
仅输出服务 URL:
$ kn service describe <service_name> -o url
7.1.2. 处于离线模式的 kn service 命令
7.1.2.1. 关于 Knative CLI 离线模式
执行 kn service
命令时,更改会立即传播到集群。但是,作为替代方案,您可以在离线模式下执行 kn service
命令。当您以离线模式创建服务时,集群不会发生任何更改,而是在本地计算机上创建服务描述符文件。
Knative CLI 的离线模式只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
创建描述符文件后,您可以手动修改并在版本控制系统中跟踪该文件。您还可以使用 kn service create -f
、kn service apply -f
或 oc apply -f
命令将更改传播到集群。
离线模式有几种用途:
- 在使用描述符文件对集群进行更改之前,您可以手动修改该文件。
- 您可以在本地跟踪版本控制系统中服务的描述符文件。这可让您在目标集群以外的位置重复使用描述符文件,例如在持续集成(CI)管道、开发环境或演示中。
-
您可以检查创建的描述符文件,以了解 Knative 服务的信息。特别是,您可以看到生成的服务如何受到传递给
kn
命令的不同参数的影响。
离线模式有其优点:速度非常快,不需要连接到集群。但是,离线模式缺少服务器端验证。因此,您无法验证服务名称是否唯一,或者是否可以拉取指定镜像。
7.1.2.2. 使用离线模式创建服务
您可以在离线模式下执行 kn service
命令,以便集群中不会发生任何更改,而是在本地机器上创建服务描述符文件。创建描述符文件后,您可以在向集群传播更改前修改该文件。
Knative CLI 的离线模式只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。
-
已安装 Knative (
kn
) CLI。
流程
在离线模式下,创建一个本地 Knative 服务描述符文件:
$ kn service create event-display \ --image quay.io/openshift-knative/knative-eventing-sources-event-display:latest \ --target ./ \ --namespace test
输出示例
Service 'event-display' created in namespace 'test'.
--target ./
标志启用脱机模式,并将./
指定为用于存储新目录树的目录。如果您没有指定现有目录,但使用文件名,如
--target my-service.yaml
,则不会创建目录树。相反,当前目录中只创建服务描述符my-service.yaml
文件。文件名可以具有
.yaml
、.yml
或.json
扩展名。选择.json
以 JSON 格式创建服务描述符文件。namespace test
选项将新服务放在test
命名空间中。如果不使用
--namespace
,且您登录到 OpenShift Container Platform 集群,则会在当前命名空间中创建描述符文件。否则,描述符文件会在default
命名空间中创建。
检查创建的目录结构:
$ tree ./
输出示例
./ └── test └── ksvc └── event-display.yaml 2 directories, 1 file
-
使用
--target
指定的当前./
目录包含新的test/
目录,它在指定的命名空间后命名。 -
test/
目录包含ksvc
,它在资源类型后命名。 -
ksvc
目录包含描述符文件event-display.yaml
,它根据指定的服务名称命名。
-
使用
检查生成的服务描述符文件:
$ cat test/ksvc/event-display.yaml
输出示例
apiVersion: serving.knative.dev/v1 kind: Service metadata: creationTimestamp: null name: event-display namespace: test spec: template: metadata: annotations: client.knative.dev/user-image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest creationTimestamp: null spec: containers: - image: quay.io/openshift-knative/knative-eventing-sources-event-display:latest name: "" resources: {} status: {}
列出新服务的信息:
$ kn service describe event-display --target ./ --namespace test
输出示例
Name: event-display Namespace: test Age: URL: Revisions: Conditions: OK TYPE AGE REASON
--target ./
选项指定包含命名空间子目录的目录结构的根目录。另外,您可以使用
--target
选项直接指定 YAML 或 JSON 文件名。可接受的文件扩展包括.yaml
、.yml
和.json
。--namespace
选项指定命名空间,与kn
通信包含所需服务描述符文件的子目录。如果不使用
--namespace
,并且您登录到 OpenShift Container Platform 集群,kn
会在以当前命名空间命名的子目录中搜索该服务。否则,kn
在default/
子目录中搜索。
使用服务描述符文件在集群中创建服务:
$ kn service create -f test/ksvc/event-display.yaml
输出示例
Creating service 'event-display' in namespace 'test': 0.058s The Route is still working to reflect the latest desired specification. 0.098s ... 0.168s Configuration "event-display" is waiting for a Revision to become ready. 23.377s ... 23.419s Ingress has not yet been reconciled. 23.534s Waiting for load balancer to be ready 23.723s Ready to serve. Service 'event-display' created to latest revision 'event-display-00001' is available at URL: http://event-display-test.apps.example.com
7.1.3. kn 容器命令
您可以使用以下命令在 Knative 服务规格中创建和管理多个容器。
7.1.3.1. Knative 客户端多容器支持
您可以使用 kn container add
命令将 YAML 容器 spec 打印到标准输出。此命令对多容器用例很有用,因为它可以与其他标准 kn
标志一起使用来创建定义。
kn container add
命令接受与容器相关的所有标志,它们都支持与 kn service create
命令搭配使用。kn container add
命令也可以使用 UNIX 管道 (|
) 一次创建多个容器定义来串联。
示例命令
从镜像添加容器并将其打印到标准输出中:
$ kn container add <container_name> --image <image_uri>
示例命令
$ kn container add sidecar --image docker.io/example/sidecar
输出示例
containers: - image: docker.io/example/sidecar name: sidecar resources: {}
将两个
kn container add
命令链接在一起,然后将它们传递给kn service create
命令创建带有两个容器的 Knative 服务:$ kn container add <first_container_name> --image <image_uri> | \ kn container add <second_container_name> --image <image_uri> | \ kn service create <service_name> --image <image_uri> --extra-containers -
--extra-containers -
指定一个特殊情况,kn
读取管道输入,而不是 YAML 文件。示例命令
$ kn container add sidecar --image docker.io/example/sidecar:first | \ kn container add second --image docker.io/example/sidecar:second | \ kn service create my-service --image docker.io/example/my-app:latest --extra-containers -
--extra-containers
标志也可以接受到 YAML 文件的路径:$ kn service create <service_name> --image <image_uri> --extra-containers <filename>
示例命令
$ kn service create my-service --image docker.io/example/my-app:latest --extra-containers my-extra-containers.yaml
7.1.4. kn 域命令
您可以使用下列命令创建和管理域映射。
7.1.4.1. 使用 Knative CLI 创建自定义域映射
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。
您已创建了 Knative 服务或路由,并控制要映射到该 CR 的自定义域。
注意您的自定义域必须指向 OpenShift Container Platform 集群的 DNS。
-
已安装 Knative (
kn
) CLI。 - 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
流程
将域映射到当前命名空间中的 CR:
$ kn domain create <domain_mapping_name> --ref <target_name>
示例命令
$ kn domain create example-domain-map --ref example-service
--ref
标志为域映射指定一个可寻址的目标 CR。如果使用
--ref
标志时没有提供前缀,则会假定目标为当前命名空间中的 Knative 服务。将域映射到指定命名空间中的 Knative 服务:
$ kn domain create <domain_mapping_name> --ref <ksvc:service_name:service_namespace>
示例命令
$ kn domain create example-domain-map --ref ksvc:example-service:example-namespace
将域映射到 Knative 路由:
$ kn domain create <domain_mapping_name> --ref <kroute:route_name>
示例命令
$ kn domain create example-domain-map --ref kroute:example-route
7.1.4.2. 使用 Knative CLI 管理自定义域映射
创建 DomainMapping
自定义资源 (CR) 后,您可以使用 Knative (kn
) CLI 列出现有 CR、查看现有 CR 的信息、更新 CR 或删除 CR。
先决条件
- 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。
-
您至少已创建了一个
DomainMapping
CR。 -
已安装 Knative (
kn
) CLI 工具。 - 您已创建了一个项目,或者具有适当的角色和权限访问项目,以便在 OpenShift Container Platform 中创建应用程序和其他工作负载。
流程
列出现有的
DomainMapping
CR:$ kn domain list -n <domain_mapping_namespace>
查看现有
DomainMapping
CR 的详情:$ kn domain describe <domain_mapping_name>
更新
DomainMapping
CR 以指向新目标:$ kn domain update --ref <target>
删除
DomainMapping
CR:$ kn domain delete <domain_mapping_name>