我正在经历官方的Tekton documentation,它使用kubectl
标准部署对象manifest将映像部署到Kubernetes。但是,我尝试使用Tekton管道作为CI / CD来部署在knative服务中,该服务应该使用knctl
或kubectl
以及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版本来简化操作。
答案 0 :(得分:2)
没有一种方法可以使用Tekton部署Knative服务,但是要考虑的几个关键事项如下。这些说明假定在Kubernetes集群上正确安装了Tekton / Knative服务。
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的同一名称空间。
要通过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服务,为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也可以这样说。