第 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 -fkn service apply -foc apply -f 命令将更改传播到集群。

离线模式有几种用途:

  • 在使用描述符文件对集群进行更改之前,您可以手动修改该文件。
  • 您可以在本地跟踪版本控制系统中服务的描述符文件。这可让您在目标集群以外的位置重复使用描述符文件,例如在持续集成(CI)管道、开发环境或演示中。
  • 您可以检查创建的描述符文件,以了解 Knative 服务的信息。特别是,您可以看到生成的服务如何受到传递给 kn 命令的不同参数的影响。

离线模式有其优点:速度非常快,不需要连接到集群。但是,离线模式缺少服务器端验证。因此,您无法验证服务名称是否唯一,或者是否可以拉取指定镜像。

7.1.2.2. 使用离线模式创建服务

您可以在离线模式下执行 kn service 命令,以便集群中不会发生任何更改,而是在本地机器上创建服务描述符文件。创建描述符文件后,您可以在向集群传播更改前修改该文件。

重要

Knative CLI 的离线模式只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围

先决条件

  • 在集群中安装了 OpenShift Serverless Operator 和 Knative Serving。
  • 已安装 Knative (kn) CLI。

流程

  1. 在离线模式下,创建一个本地 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 命名空间中创建。

  2. 检查创建的目录结构:

    $ tree ./

    输出示例

    ./
    └── test
        └── ksvc
            └── event-display.yaml
    
    2 directories, 1 file

    • 使用 --target 指定的当前 ./ 目录包含新的 test/ 目录,它在指定的命名空间后命名。
    • test/ 目录包含 ksvc,它在资源类型后命名。
    • ksvc 目录包含描述符文件 event-display.yaml,它根据指定的服务名称命名。
  3. 检查生成的服务描述符文件:

    $ 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: {}

  4. 列出新服务的信息:

    $ 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 会在以当前命名空间命名的子目录中搜索该服务。否则,kndefault/ 子目录中搜索。

  5. 使用服务描述符文件在集群中创建服务:

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