部署容器映像

本页面介绍如何将新服务和新修订版本部署到 Knative serving。

准备工作

如需使用 Google Cloud CLI,您必须先设置和配置命令行工具

连接到 GKE 集群

您必须先登录并连接到 GKE 集群,然后才能将服务部署到 Knative serving。

如需详细了解如何连接到 GKE 集群(包括其他选项),请参阅:

部署所需的权限

除了需要针对 apiGroup serving.knative.dev 和 kind Service 的创建、更新和删除权限外,您还必须拥有下列 Identity and Access Management 角色之一:

可部署的映像

您可以部署的容器映像没有大小限制。

您可以使用任何容器注册表中的容器,例如 Docker Hub。如需了解如何部署 Container Registry 或 Artifact Registry 以外的其他注册表中的私有映像,请参阅部署其他容器注册表中的私有容器映像

部署新的服务

您可以使用标记(例如 gcr.io/my-project/my-image:latest)或确切摘要(例如 gcr.io/my-project/my-image@sha256:41f34ab970ee...)指定容器映像。

首次部署到服务时会创建第一个修订版本。请注意,修订版本是不可变的。如果使用容器映像标记进行部署,则该标记会被解析为摘要,并且修订版本将始终提供此特定摘要。

您可以使用 Google Cloud 控制台、Google Cloud CLI 或从 YAML 配置文件部署容器。

点击相应标签页即可获取有关所选工具的使用说明。

默认 gcloud 位置配置

如果您之前在 Google Cloud CLI 的 default 配置中配置了位置,则 gcloud 命令默认使用这些值,包括:

  • compute/region
  • compute/zone
  • run/cluster
  • run/cluster_location
  • run/platform
  • run/region

运行以下 gcloud config 命令查看 default 配置的设置:

gcloud config configurations describe default

控制台

要部署容器映像,请执行以下操作:

  1. 在 Google Cloud 控制台中前往 Knative serving:

    前往 Knative serving

  2. 点击创建服务以显示“创建服务”页面

    在此表单中执行以下操作:

    1. 从下拉菜单中,为您的服务选择一个可用的 GKE 集群。

    2. 输入所需的服务名称。服务名称在每个地区和项目或每个集群必须是唯一的。服务名称一旦指定便无法更改。

    3. 在“连接”下

      • 如果您想将访问仅限于对其他 Knative serving 服务或集群中使用 Istio 的服务的访问,请选择内部
      • 如需允许对服务的外部访问,请选择外部

      请注意,您可以随时更改连接选项,具体说明请参阅更改服务连接设置

    4. 点击下一步以前往服务创建表单的第二页。

      在此表单中执行以下操作:

      1. “容器映像网址”文本框中,提供受支持的注册表中的映像的网址,例如:us-docker.pkg.dev/cloudrun/container/hello:latest

      2. (可选)点击显示高级设置,然后点击后续标签页以设置:

      3. 点击创建以将映像部署到 Knative serving,然后等待部署完成。

    您刚刚将一个服务部署到启用 Knative serving 的集群。

命令行

要部署容器映像,请执行以下操作:

  1. 运行 gcloud run deploy 命令:

    gcloud run deploy SERVICE --image IMAGE_URL

    • SERVICE 替换为要部署到的服务的名称。如果指定的服务不存在,则会创建一个新服务。

    • IMAGE_URL 替换为对容器映像的引用,例如 gcr.io/cloudrun/hello

    • 其他部署选项:

      • 如需部署到非默认命名空间,必须使用 --namespace 参数指定该命名空间。

      • 如需部署到默认配置以外的位置,必须使用 --cluster--cluster-location 参数指定集群的 namelocation

        gcloud run deploy SERVICE --cluster CLUSTER-NAME --cluster-location CLUSTER-LOCATION
      • 您可以使用 --connectivity 标志设置连接选项,以指定内部或外部访问(请参阅更改服务连接设置)。

      • 对于 Knative serving on VMware,您必须添加 --kubeconfig 参数并指定配置文件:

        gcloud run deploy SERVICE --image IMAGE_URL --kubeconfig KUBECONFIG-FILE

  2. 等待部署完成。成功完成后,系统将显示一条成功消息以及已部署服务的网址。

YAML

您可以将服务规范存储在 YAML 文件中,然后使用 Google Cloud CLI 进行部署。

  1. 使用以下内容创建新的 service.yaml 文件:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        spec:
          containers:
          - image: IMAGE

    替换

    • SERVICE 替换为您的 Knative serving 服务的名称
    • IMAGE 替换为容器映像的网址。

    您还可以指定更多配置,例如环境变量或内存限制。

  2. 使用以下命令部署新服务:

    gcloud run services replace service.yaml

部署现有服务的新修订版本

您可以使用 Google Cloud 控制台、gcloud 命令行或 YAML 配置文件部署新的修订版本。

请注意,更改任何配置设置都会导致新修订版本的创建,即使容器映像没有变化也是如此。创建的每个修订版本都是不可变的。

点击相应标签页即可获取有关所选工具的使用说明。

控制台

要部署现有服务的新修订版本,请执行以下操作:

  1. 在 Google Cloud 控制台中前往 Knative serving:

    前往 Knative serving

  2. 在服务列表中找到要更新的服务,然后点击该服务以打开其详细信息。

  3. 点击修改和部署新修订版本。此时会显示修订版本部署表单:

  4. 如果需要,请提供要部署的新容器映像的网址。

  5. 根据需要设置:

  6. 如需将所有流量都发送到新修订版本,请选中“立即支持此修订版本”复选框。如需逐步发布新修订版本,请取消选中该复选框:这样在部署中,系统将不会向新修订版本发送任何流量(在部署之后,请按照适用于逐步发布的说明进行操作)。

  7. 点击部署并等待部署完成。

命令行

要部署容器映像,请执行以下操作:

  1. 运行 gcloud run services update 命令:

    gcloud run services update SERVICE --image IMAGE_URL
    • 系统会自动为每个修订版本分配修订版本后缀。如果您要指定自己的修订版本后缀,请添加 --revision-suffix 参数。

    • SERVICE 替换为要部署到的服务的名称。如果指定的服务不存在,则会创建一个新服务。

    • IMAGE_URL 替换为对容器映像的引用,例如 gcr.io/cloudrun/hello

    • 其他部署选项:

      • 如需部署到非默认命名空间,必须使用 --namespace 参数指定该命名空间。

      • 如需部署到默认配置以外的位置,必须使用 --cluster--cluster-location 参数指定集群的 namelocation

        gcloud run deploy SERVICE --cluster CLUSTER-NAME --cluster-location CLUSTER-LOCATION
      • 您可以使用 --connectivity 标志设置连接选项,以指定内部或外部访问(请参阅更改服务连接设置)。

      • 对于 Knative serving on VMware,您必须添加 --kubeconfig 参数并指定配置文件:

        gcloud run deploy SERVICE --image IMAGE_URL --kubeconfig KUBECONFIG-FILE

  2. 等待部署完成。成功完成后,系统将显示一条成功消息以及已部署服务的网址。

YAML

您可以使用 gcloud run services describe 命令和 --format=export 标志将现有服务的配置下载到的 YAML 文件中。然后,您可以使用 gcloud run services replace 命令修改该 YAML 文件并部署这些更改。您必须确保仅修改指定的属性。

  1. 将服务配置下载到本地工作区上名为 service.yaml 的文件中:

    gcloud run services describe SERVICE --format export > service.yaml

    SERVICE 替换为您的 Knative serving 服务的名称。

    1. 在本地文件中,更新 spec.template 的任意子属性中的修订版本设置

    2. 部署新修订版本:

      gcloud run services replace service.yaml

从其他 Google Cloud 项目中部署映像

如果您设置了正确的 IAM 权限,则可以从其他 Google Cloud 项目中部署容器映像:

  1. 在 Google Cloud 控制台中,打开 Knative serving 服务的项目。

  2. 转到 IAM 页面

  3. 获取服务账号信息:

  4. 打开您要使用的容器注册表所属的项目。

  5. 进入 IAM 页面

  6. 点击添加以添加新的主账号。

  7. 新的主账号文本框中,粘贴您之前复制的服务账号的电子邮件。

  8. 在“选择角色”下拉列表中,选择可从仓库读取的角色:

  9. 将容器映像部署到您的 Knative serving 服务所属的项目。

为了提高安全性,您可以限制授予的访问权限:

  • Artifact Registry:授予存储容器映像的仓库的角色。
  • Container Registry:授予存储容器映像的 Cloud Storage 存储桶的角色。

从其他容器注册表中部署私有容器映像

本部分介绍如何设置正确的权限,以将容器映像从任意私有注册表部署到 Knative serving。私有容器注册表需要凭据才能访问容器映像。 请注意,您无需执行如下步骤,即可将私有容器映像从 Container Registry(已弃用)或 Artifact Registry 部署到您的集群所在的项目中。

如需部署私有容器映像,您必须创建一个 imagePullSecret 类型的 Kubernetes Secret 并将其与服务账号相关联:

  1. 创建一个名为 container-registryimagePullSecret Secret:

    kubectl create secret docker-registry container-registry \
      --docker-server=DOCKER_REGISTRY_SERVER \
      --docker-email=REGISTRY_EMAIL \
      --docker-username=REGISTRY_USER \
      --docker-password=REGISTRY_PASSWORD
    • DOCKER_REGISTRY_SERVER 替换为您的私有注册表 FQDN(例如:对于 Container Registry,替换为 https://gcr.io/;对于 DockerHub,则替换为 https://hub.docker.com)。
    • REGISTRY_EMAIL 替换为您的电子邮件地址。
    • REGISTRY_USER 替换为您的容器注册表用户名。

      如果您使用的是 Container Registry 或 Artifact Registry,并且想要存储和拉取长期凭据,而不是传递短期访问令牌,请参阅《身份验证方法:JSON 密钥文件》

    • REGISTRY_PASSWORD 替换为您的容器注册表密码。

  2. 打开默认服务账号:

    kubectl edit serviceaccount default --namespace default

    Kubernetes 集群中的每个命名空间都有一个名为 default 的默认服务账号。除非您在部署 Knative serving 服务时另有指定,否则系统将使用此默认服务账号拉取容器映像。

  3. 将新创建的 imagePullSecret Secret 添加到您的默认服务账号:

    imagePullSecrets:
    - name: container-registry
    

    您的服务账号现在应如下所示:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: default
      namespace: default
      ...
    secrets:
    - name: default-token-zd84v
    # The secret we just created:
    imagePullSecrets:
    - name: container-registry
    

现在,当前 default 命名空间中创建的所有新 Pod 都将定义了 imagePullSecret Secret。

在启用了自动 Sidecar 注入的情况下进行部署

如需在启用 Istio Sidecar 注入功能的情况下部署服务,请参阅 Cloud Service Mesh 文档中的启用自动 Sidecar 注入功能

在内部网络上部署服务

如需在内部网络上部署服务,您必须设置专用内部网络

后续步骤

部署新服务后,您可以执行以下操作:

您可以使用 Cloud Build 触发器实现 Knative serving 的自动构建和部署: