首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tekton管道中的knctl/kubectl将镜像部署到Knative服务

使用tekton管道中的knctl/kubectl将镜像部署到Knative服务
EN

Stack Overflow用户
提问于 2020-06-04 21:06:16
回答 2查看 313关注 0票数 0

我正在浏览官方Tekton documentation,它使用kubectl标准部署对象manifest将映像部署到Kubernetes。但是,我正在尝试使用Tekton pipeline作为CI/CD来部署到一个knative服务中,它应该使用knctl或带有knative service yaml的kubectl,而不是部署knative serving spec的yaml。

就像这样

代码语言:javascript
复制
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构建,以使其更容易。

EN

回答 2

Stack Overflow用户

发布于 2020-08-21 23:36:27

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

创建Knative服务的ServiceAccount权限

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

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

代码语言:javascript
复制
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相关联,该via假定创建了ServiceAccount:

代码语言:javascript
复制
---
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

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

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

代码语言:javascript
复制
tkn pipeline start knative-service-deploy -s tekton-sa 

注意:角色和RoleBinding示例是针对特定情况的,该示例仅允许将Knative服务部署到执行任务运行/管道运行的相同命名空间。

用于部署Knative服务的步骤映像

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

Tekton要知道的重要事情是任务定义、步骤使用的映像以及要运行以部署Knative服务的命令。使用kn的示例如下所示:

代码语言:javascript
复制
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服务,使用名为gcr.io/knative-samples/helloworld-go的Knative服务的映像,以及更新Knative服务的--force标志(如果已存在)。

编辑:添加kubectl示例

这个问题是关于使用kubectl的,所以我添加了一个在Tekton Task中使用kubectl从YAML文件部署Knative服务的示例:

代码语言:javascript
复制
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中使用某些工具。

票数 2
EN

Stack Overflow用户

发布于 2020-08-24 22:47:01

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

代码语言:javascript
复制
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"
...

使用that Catalog Task的kubectl也是如此。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62195356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档