在tekton管道中使用knctl / kubectl将映像部署到Knative服务

时间:2020-06-04 13:06:15

标签: kubernetes knative knative-serving tekton tekton-pipelines

我正在经历官方的Tekton documentation,它使用kubectl标准部署对象manifest将映像部署到Kubernetes。但是,我尝试使用Tekton管道作为CI / CD来部署在knative服务中,该服务应该使用knctlkubectl以及knative服务yaml,而不是knative serving spec

类似

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版本来简化操作。

2 个答案:

答案 0 :(得分:2)

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

创建原始服务的ServiceAccount权限

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

为了创建具有创建和更新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服务。

角色可以通过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

一旦角色,角色绑定和ServiceAccount可用,您就可以在TaskRun或PipelineRun期间使用此ServiceAccount,这取决于您部署Knative服务的方式。可以通过TaskRun或PipelineRun的ServiceAccountName property指定要使用的ServiceAccount。

如果您使用的是Tekton cli(tkn),则可以使用-s标志来指定启动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要了解的重要事项是任务定义,步骤使用的映像以及运行以部署Knative服务的命令。下面显示了使用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的步骤。步骤使用官方kn图片;指定运行kn根命令;然后将参数传递给kn命令以创建名为knative-service的Knative服务,为Knative服务使用名为gcr.io/knative-samples/helloworld-go的图像,并使用--force标志更新Knative服务(如果已经存在)。

编辑:添加kubectl示例

该问题询问有关使用kubectl的问题,因此我添加了一个在Tekton Task中使用kubectl来从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中使用某些工具的考虑。

答案 1 :(得分:0)

我想添加一种“快速启动”方式来获得在管道中创建的基础服务的方法是将现有的kn目录任务https://github.com/tektoncd/catalog/tree/master/task/kn/0.1应用于您的集群,然后构建一个{{1 }} / TaskRun运行带有所需选项的创建。 https://github.com/knative/client/blob/master/docs/cmd/kn_service_create.md

PipelineRun

使用that Catalog Task对于kubectl也可以这样说。