0

我正在阅读官方Tekton 文档kubectl,它使用标准部署对象清单将映像部署到 Kubernetes 。但是,我正在尝试使用 Tekton 管道作为 CI/CD 来部署在 knative 服务中,该服务应该使用knctlkubectl使用 knative 服务 yaml 而不是knative 服务规范的部署 yaml

就像是

apiVersion: serving.knative.dev/v1 # Current version of Knative
kind: Service
metadata:
  name: helloworld-go # The name of the app
  namespace: default # The namespace the app will use
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/helloworld-go # The URL to the image of the app
          env:
            - name: TARGET # The environment variable printed out by the sample app
              value: "Go Sample v1"

在这种情况下,我如何利用 Tekton。如果我要将镜像安装到任何随机的 Kubenetes 集群,我可以使用任何其他 CI/CD 工具以及部署清单。我相信 Tekton 应该会取代 Knative 构建以使其变得简单。

4

2 回答 2

2

没有一种方法可以使用 Tekton 部署 Knative 服务,但需要考虑的几个关键事项如下。这些说明假设在 Kubernetes 集群上正确安装了 Tekton/Knative Serving。

ServiceAccount 创建 Knative Service 的权限

Tekton 允许使用 Kubernetes ServiceAccounts 来分配权限(例如创建 Knative 服务),以便 TaskRun 或 PipelineRun(即执行 Tekton CI/CD 流程)能够创建和更新某些资源。在这种情况下,创建一个 Knative Service。

为了创建具有创建和更新 Knative 服务的权限的 ServiceAccount,您需要创建一个类似于下图所示的角色:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: create-knative-service
  namespace: default
rules:
  # Create and update Knative Service
  - apiGroups: ["serving.knative.dev"]
    resources: ["services"]
    verbs: ["get", "create", "update"]

上面的角色允许创建和更新 Knative 服务。

Role 可以通过 RoleBinding 与 ServiceAccount 关联,这假定创建了一个 ServiceAccount:

---
kind: ServiceAccount
apiVersion: v1
metadata:
  name: tekton-sa
  namespace: default
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: create-knative-service-binding
subjects:
  - kind: ServiceAccount
    name: tekton-sa
    namespace: default
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: create-knative-service

一旦 Role、RoleBinding 和 ServiceAccount 可用,您就可以在 TaskRun 或 PipelineRun 期间使用此 ServiceAccount,具体取决于您部署 Knative 服务的方式。可以通过TaskRun 或 PipelineRun的ServiceAccountName 属性指定要使用的 ServiceAccount。

如果您使用的是 Tekton cli ( tkn),您可以使用-sflag 来指定启动 PipelineRun 或 TaskRun 时要使用的 ServiceAccount:

tkn pipeline start knative-service-deploy -s tekton-sa 

注意: Role 和 RoleBinding 示例适用于仅允许将 Knative Service 部署到 TaskRun/PipelineRun 正在执行的同一命名空间的特定情况。

使用什么步骤镜像来部署 Knative 服务

要通过 TaskRun 或 PipelineRun 部署 Knative 服务,您需要创建一个包含部署 Knative 服务的步骤的任务。在这种情况下,没有任何一种工具可以使用,正如您所提到的,使用kubectlkn或任何其他工具来部署到 Kubernetes。

Tekton 需要了解的重要事项是 Task 定义、Step 使用的映像以及部署 Knative Service 运行的命令。使用示例kn如下所示:

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: deploy-knative-service
spec:
  # Step to create Knative Service from built image using kn. Replaces service if it already exists.
  steps: 
    - name: kn
      image: "gcr.io/knative-releases/knative.dev/client/cmd/kn:latest"
      command: ["/ko-app/kn"]
      args: ["service", 
        "create", "knative-service", 
        "--image", "gcr.io/knative-samples/helloworld-go:latest", 
        "--force"]

在上面的示例中,任务定义为一个名为 的步骤kn。Step使用官方kn图片;指定运行knroot命令;然后将参数传递给kn命令以创建名为 的 Knative 服务,为名为 的 Knative 服务knative-service使用映像gcr.io/knative-samples/helloworld-go,以及--force更新 Knative 服务(如果已存在)的标志。

编辑:添加 kubectl 示例

该问题询问有关 using 的问题kubectl,因此我添加了一个kubectl在 Tekton Task 中使用以从 YAML 文件部署 Knative 服务的示例:

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: deploy-knative-service
spec:
  # Step to create Knative Service from YAML file using kubectl.
  steps:
    - name: kubectl
      image: "bitnami/kubectl"
      command: ["kubectl"]
      args: ["apply", "-f", "https://raw.githubusercontent.com/danielhelfand/lab-knative-serving/master/knative/service.yaml"]

概括

没有确切的方法来回答这个问题,但希望这些示例和要点有助于考虑有关 PipelineRun 或 TaskRun 的权限以及如何将某些工具与 Tekton 一起使用。

于 2020-08-21T15:36:27.050 回答
0

我想补充一点,在管道中创建 knative 服务的“快速启动”方法是将现有kn目录任务https://github.com/tektoncd/catalog/tree/master/task/kn/0.1应用到您的集群,然后使用您需要的选项制作TaskRun/PipelineRun以运行创建。 https://github.com/knative/client/blob/master/docs/cmd/kn_service_create.md

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  generateName: kn-create-
spec:
  serviceAccountName: kn-account
  taskRef:
    name: kn
  params:
  - name: ARGS
    value:
    - "service"
    - "create"
    - "something"
    - "--image=something"
...

kubectl 也可以这样说,使用那个 Catalog Task

于 2020-08-24T14:47:00.717 回答