我正在浏览官方Tekton documentation,它使用kubectl标准部署对象manifest将映像部署到Kubernetes。但是,我正在尝试使用Tekton pipeline作为CI/CD来部署到一个knative服务中,它应该使用knctl或带有knative service yaml的kubectl,而不是部署knative serving spec的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构建,以使其更容易。
发布于 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,您需要创建一个类似如下所示的角色:
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:
---
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:
tkn pipeline start knative-service-deploy -s tekton-sa 注意:角色和RoleBinding示例是针对特定情况的,该示例仅允许将Knative服务部署到执行任务运行/管道运行的相同命名空间。
用于部署Knative服务的步骤映像
要通过TaskRun或PipelineRun部署Knative服务,您需要创建一个任务,其中包含一个部署Knative服务的步骤。在您提到的使用kubectl、kn或任何其他工具部署到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服务,使用名为gcr.io/knative-samples/helloworld-go的Knative服务的映像,以及更新Knative服务的--force标志(如果已存在)。
编辑:添加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中使用某些工具。
发布于 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
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也是如此。
https://stackoverflow.com/questions/62195356
复制相似问题