没有一种方法可以使用 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
),您可以使用-s
flag 来指定启动 PipelineRun 或 TaskRun 时要使用的 ServiceAccount:
tkn pipeline start knative-service-deploy -s tekton-sa
注意: Role 和 RoleBinding 示例适用于仅允许将 Knative Service 部署到 TaskRun/PipelineRun 正在执行的同一命名空间的特定情况。
使用什么步骤镜像来部署 Knative 服务
要通过 TaskRun 或 PipelineRun 部署 Knative 服务,您需要创建一个包含部署 Knative 服务的步骤的任务。在这种情况下,没有任何一种工具可以使用,正如您所提到的,使用kubectl
、kn
或任何其他工具来部署到 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
图片;指定运行kn
root命令;然后将参数传递给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 一起使用。