「Tekton」は、KubernetesネイティブなCI/CDツールです。KubernetesのCRD(Custom Resource Definitions)やControllerとして動作し、Kuberentes環境にデプロイするアプリケーションとの相性が良いのが特徴です。元々サーバレスツールである「Knative」のbuild-pipelineとして開発されていましたが、その後Cloud Delivery Foundation(CDF)のツールの一つとなっています。
2020年11月4日時点の最新バージョンはv0.17.3ですが、非常に活発にバージョンアップが実施されています。OpenshiftのCI/CDツール「OpenShift Pipelines」がTektonをベースとしていることも含め、注目度の高いツールです。
チュートリアルをやってみる
早速、Tektonに触れてみるため、チュートリアルをやってみましょう。KatacodaによるWeb上でのチュートリアルが用意されており、パブリッククラウド環境を用意する必要もなければ、ローカルの環境を汚す心配もなく、手軽に学習することができます。
一般的なCI/CDツールと同様、パイプラインとタスクを1:nで作成し、CI/CDを実現します。チュートリアルを実施するにあたり、最低限以下の2つのTekton固有の用語を押さえておきましょう。
- パイプライン:PipelineResource
- タスク:Task
このチュートリアルでは、PipelineResource1つと、以下の2つのTask(ビルドとデプロイ)を構築します。
- build-docker: docker buildコマンドでイメージの作成
- deploy-kubectl: Deployment、Serviceリソースの作成
チュートリアル環境の起動
トップページの「Get started with interactive tutorials.」のリンクをクリックします。
「Monitor with Tekton dashboard」をクリックします。
「START SCENARIO」をクリックします。
以下のような画面が表示され、後は左側ペインの指示内容に沿って作業を進められます。しかも、コマンドを手入力をする必要がなく、該当のコマンドをクリックするのみです。例では、左側ペインの「kubectl cluster-info」をクリックするだけで、右側ペインにコマンドが入力され、kubectlコマンドを実行することができました。
以降、どんどん作業を進めていきましょう。キャプチャは掲載せず、コマンド部分のみ掲載していきます。
Tekton Dashboardのインストール
「release.yaml」をkubectlコマンドでapplyします。これにより、「namespace」が作成されたり、「PodSecurityPolicy」や「ServiceAccount」などのリソースが作成されていることがわかります。
controlplane $ kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.10.1/release.yaml
namespace/tekton-pipelines created
podsecuritypolicy.policy/tekton-pipelines created
clusterrole.rbac.authorization.k8s.io/tekton-pipelines-admin created
serviceaccount/tekton-pipelines-controller created
clusterrolebinding.rbac.authorization.k8s.io/tekton-pipelines-controller-admin created
customresourcedefinition.apiextensions.k8s.io/clustertasks.tekton.dev created
~後略~
「kubectl get pods」を実行すると、以下のPodが作成されていることがわかります。
controlplane $ kubectl get pods -n tekton-pipelines
NAME READY STATUS RESTARTS AGE
tekton-pipelines-controller-65459f5b4d-rsnr7 1/1 Running 0 3m13s
tekton-pipelines-webhook-84d67645d-fzgpc 1/1 Running 0 3m13s
次は、「Tekton Dashboard」を作成しましょう。
controlplane $ kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/previous/v0.5.3/tekton-dashboard-release.yaml
customresourcedefinition.apiextensions.k8s.io/extensions.dashboard.tekton.dev created
serviceaccount/tekton-dashboard created
clusterrole.rbac.authorization.k8s.io/tekton-dashboard-minimal created
clusterrolebinding.rbac.authorization.k8s.io/tekton-dashboard-minimal created
service/tekton-dashboard created
deployment.apps/tekton-dashboard created
pipeline.tekton.dev/pipeline0 created
task.tekton.dev/pipeline0-task created
「kubectl get pods」を実行すると、以下のPodが作成されていることが分かります。
controlplane $ kubectl get pods -n tekton-pipelines
NAME READY STATUS RESTARTS AGE
tekton-dashboard-6d99595f98-qp7sz 1/1 Running 0 60s
tekton-pipelines-controller-65459f5b4d-rsnr7 1/1 Running 0 7m
tekton-pipelines-webhook-84d67645d-fzgpc 1/1 Running 0 7m
続いて、Ingressコントローラを構築します。
controlplane $ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml
namespace/ingress-nginx created
serviceaccount/ingress-nginx created
configmap/ingress-nginx-controller created
clusterrole.rbac.authorization.k8s.io/ingress-nginx created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
role.rbac.authorization.k8s.io/ingress-nginx created
rolebinding.rbac.authorization.k8s.io/ingress-nginx created
service/ingress-nginx-controller-admission created
service/ingress-nginx-controller created
deployment.apps/ingress-nginx-controller created
serviceaccount/ingress-nginx-admission created
clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
role.rbac.authorization.k8s.io/ingress-nginx-admission created
rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
job.batch/ingress-nginx-admission-create created
job.batch/ingress-nginx-admission-patch created
error: unable to recognize "https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud/deploy.yaml": no matches for kind "ValidatingWebhookConfiguration" in version "admissionregistration.k8s.io/v1"
controlplane $ kubectl get pods -n ingress-nginx
NAME READY STATUS RESTARTS AGE
ingress-nginx-admission-create-s88s2 0/1 Completed 0 8m12s
ingress-nginx-controller-86dd8c479f-f6n6g 1/1 Running 0 8m13s
ここで、Serviceリソースのポートを確認します。
controlplane $ kubectl get svc tekton-dashboard -n tekton-pipelines
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
tekton-dashboard ClusterIP 10.97.24.100 <none> 9097/TCP 2m25s
9097番であることがわかりました。この9097番ポートを指定して、Ingressリソースを作成します。
controlplane $ cat << EOF | kubectl apply -f -
> apiVersion: networking.k8s.io/v1beta1
> kind: Ingress
> metadata:
> name: tekton-dashboard
> namespace: tekton-pipelines
> spec:
> backend:
> serviceName: tekton-dashboard
> servicePort: 9097
> EOF
ingress.networking.k8s.io/tekton-dashboard created
チュートリアルの左側ペインに表示されている以下のようなリンクをクリックし、ダッシュボードを開きます。
Tektonリソースのインポート
ダッシュボード上で「Import Tekton resources」のリンクをクリックします。以下の情報を入力し、「Import and Apply」ボタンをクリックしてください。
- Repository URL
- Namespace
- Repository directory
- Service Account
すると、「Triggered PipelineRun to apply Tekton resources」と表示されます。「View status of this run」のリンクをクリックします。
これで、作成されたパイプラインが表示されていることがわかります。
PipelineResourceの作成
「PipelineResources」メニューをクリックし「Create +」ボタンをクリックします。
以下の通り入力し、「Create」ボタンをクリックします。
「myapp」という名前でPipelineResourceが作成されていることがわかります。
ビルド&デプロイ
「PipelineRuns」メニューを開き、「Create +」ボタンをクリックします。
以下の通り入力し、「Create」ボタンをクリックします。
- Pipeline:myapp
- PipelineResources source:myapp
これで、PipelineRunが作成されました。
PipelineRunの実行結果と、デプロイされたアプリケーションの確認
作成されたPipelineRun(myapp-run-1600701417148)を選択し、実行ログを確認します。「build」および「deploy」タスクが完了していることがわかります。
以下のようなURLにアクセスし、デプロイされたアプリケーションを確認します。
* * *
いかがでしたか? インターネットアクセス可能なアプリケーションを簡単にデプロイできることがおわかりいただけたのではないかと思います。興味がある方は「TaskRun」メニューをたどることで、ビルドパイプラインにおける個別のTaskの実行結果も確認できます。
このように、Tektonを使うとCI/CDにおけるパイプラインや実行結果を非常に簡単に実行/理解することができます。また、Katacoda環境を活用したチュートリアルも充実しているので、手元に環境がない方も含め、ぜひ一度Tektonを試してみてはいかがでしょうか。