Развертывание образа в сервис Knative с помощью knctl/kubectl в конвейере tekton
Я просматривал официальную документацию Tekton, где он развертывает образ в Kubernetes, используяkubectl
стандартный манифест объекта развертывания. Однако я пытаюсь использовать конвейер Tekton в качестве CI/CD для развертывания в Knative-сервисе, который должен либо использоватьknctl
или kubectl
с knative service yaml вместо Deployment yaml из спецификации Knative serve
Что-то типа
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"
Как мне воспользоваться Тектоном в этом случае. Если бы мне пришлось устанавливать образы в любой случайный кластер Kubenetes, я мог бы установить любой другой инструмент CI/CD вместе с манифестом развертывания. Я считаю, что Tekton должен заменить сборку Knative, чтобы упростить ее.
2 ответа
There is no one way you could approach deploying a Knative Service with Tekton, but a couple key things to consider are as follows. These instructions assume proper installation of both Tekton/Knative Serving on a Kubernetes cluster.
ServiceAccount permissions to create a Knative Service
Tekton allows the use of Kubernetes ServiceAccounts to assign permissions (e.g. creating a Knative service) so that a TaskRun or PipelineRun (i.e. the execution of a Tekton CI/CD process) is able to create and update certain resources. In this case, the creation of a Knative Service.
In order to create a ServiceAccount with permissions to create and update a Knative Service, you would need to create a role that is similar to what is shown below:
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"]
The Role above allows for the creation and updating of Knative Services.
The Role can be associated with a ServiceAccount via a RoleBinding, which assumes the creation of a 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
Once the Role, RoleBinding, and ServiceAccount are available, you can use this ServiceAccount during a TaskRun or PipelineRun depending on how you are deploying a Knative Service. The ServiceAccount to use can be specified via the ServiceAccountName property of a TaskRun or PipelineRun.
If you are using the Tekton cli (tkn
), you can use -s
flag to specify what ServiceAccount to use when starting a PipelineRun or TaskRun:
tkn pipeline start knative-service-deploy -s tekton-sa
NOTE: The Role and RoleBinding examples are for a specific case that only allows deployment of the Knative Service to the same namespace where the TaskRun/PipelineRun is executing.
What step image to use to deploy the Knative Service
To deploy the Knative Service via a TaskRun or PipelineRun, you will need to create a Task with a Step that deploys the Knative Service. There is no one tool that you could use in this case as you mention as far as using kubectl
, kn
, or any other tool to deploy to Kubernetes.
The important things for Tekton to know is the Task definition, the image used by the Step, and the command to run to deploy the Knative Service. An example using kn
is shown below:
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"]
In the example above, a Task is defined with one Step called kn
. The Step uses the official kn
image; specifies to run the kn
корневая команда; а затем передает аргументы вkn
команда для создания Knative Service с именем knative-service
, используйте образ Knative Service с именем gcr.io/knative-samples/helloworld-go
, а --force
флаг, обновляющий Knative Service, если он уже существует.
РЕДАКТИРОВАТЬ: добавление примера kubectl
Вопрос спрашивает об использовании kubectl
, поэтому я добавляю пример использования kubectl
в задаче Tekton для развертывания Knative Service из файла YAML:
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.
Я хотел добавить, что "быстрый старт" для создания 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"
...
То же самое можно сказать и о kubectl, используя эту задачу каталога.