[Tekton Pipelines] Kubernetes-nativeなCI/CDツールのインストールとタスクの実行例を紹介します!

この記事は公開されてから半年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Kubernetes-nativeなCI/CDツールをお探しでしょうか?Tekton Pipelinesは、Kuernetes上で実行するCI/CD形式のパイプラインツールです。Kubernetes Nativeなオープンソースとして開発されています。 TektonはThe Continuous Delivery Foundation(CDF)のプロジェクトとして採用されています。

Tekton PilpeliesはCloud Nativeの思想に基づいて設計されています。Tekton PipelinesはKubernetes上で実行され、Cloud NativeなCI/CDパイプラインを簡単に作成できるように、ベストプラクティスがあらかじめ導入されています。またビルド、テスト、デプロイはVM、サーバレス、Kubernetesなどの複数の環境やマルチクラウドやハイブリッドクラウドでも利用することができます。

本記事ではTekton Pipelinesのインストールとチュートリアルの実行を紹介します。

対象読者

  • Kubernetes-nativeなCI/CDツールを探している人
  • Cloud Delivery Foundation(CDF)に興味がある人
  • Cloud Nativeの思想に興味がある人

もくじ

  1. 検証環境
  2. Kubernetesクラスタの作成
  3. Tekton Pipelinesのインストール
  4. Taskの作成
  5. Docker Hub認証情報の作成
  6. TaskRunの定義
  7. Taskの実行
  8. さいごに

検証環境

GKE環境で検証を行いました。検証に利用したKubernetesのクライアントおよびサーバのバージョンは以下の通りです。

Kubernetesクラスタの作成

GKEにKubernetesクラスタを作成します。

クラスタの作成完了まで数分かかります。クラスタの作成が完了したら、デフォルトのコンテキストが切り替わっているか確認をしておきます。

作成したクラスタのCURRENTに*がついているかを確認してください。

Tekton Pipelinesのインストール

Tekton PipelinesをKubernetes上にインストールします。kubectl applyコマンドで最新のマニフェストファイルを指定します。

Tekton Pipelinesはtekton-pipelinesというネームスペースにインストールされます。ネームスペースを指定してPodの起動を確認してみます。

tekton-pipelines-contorollerとtekton-pipelines-webhookの2つのPodが起動しました。

Taskの作成

TaskはCIのフローの一部として実行したい処理の集まりです。TaskはPod(コンテナ)の中で実行されます。TaskにはInputs、Outputs、Stepsを定義することができます。 InputsはTaskへの入力、OutputsはTaskからの出力を定義します。StepsはTaskで実行する処理(コマンド)を実行される順番に定義します。Stepごとにコンテナ内で実行されるので、Stepごとにコンテナイメージを指定する必要があります。

今回のチュートリアルでは、以下の一連の処理を行うTaskを作成します。

  1. Git Hubからアプリケーションソースをcloneする。
  2. docker buildでコンテナイメージを作成する。
  3. docker pushでDocker Hubにコンテナイメージをプッシュする。

PipelineResourceの定義

はじめにInputsとOutputsを使うために、利用するリソースをPipelineResourceとして定義します。利用できるリソースタイプは以下の5つがあります(v0.5)。

リソースタイプ 説明
Git Gitリポジトリ
Pull Request ソースコントロールシステムへのプルリクエスト
Image コンテナイメージ
Cluster Kubernetesクラスタ
Storage オブジェクトストレージ。GCSのみサポート(v0.5)

今回のチュートリアルでは、以下の2つのPipelineResouceを作成します。

  1. Input: Git HubからCloneしたアプリケーションソース
  2. Output: Cloneしたアプリケーションを含むコンテナイメージ

Inputs: Git Resource

InputsとしてGit Hub上のアプリケーションソースを利用するので、Gitリソースを定義します。

paramsのurlにはcloneするGitリポジトリを指定します。revisionにはcloneするGitリビジョン(ブランチ、タグなど)を指定します。上記の例では、https://github.com/sumomo-99/TektonSample.gitのmasterブランチのcloneを行います。

Outputs: Image Resource

Outputsとしてコンテナイメージを出力するので、Imageリソースを定義します。

paramsのurlにはコンテナイメージの格納先を指定します。上記の例では、Docker Hubのeasydoggie/testappにコンテナイメージを格納します。

Taskの定義

実行する処理を定義するTaskを作成します。Inputsにはgit、Outputsにはimageを指定しますが、nameは先ほど作成したPipelineResourceと同じである必要はありません。TaskとPipelineResourceの紐づけは、後ほど作成するTaskRunで行います。

今回のチュートリアルではKubernets上でDockerコンテナイメージのビルドを行っています。Kubernetesクラスタ上やコンテナ内でのdocker buildは一般的に安全ではないといわれています。このためdocker buildの代わりにkanikoなどを利用することが推奨されています。チュートリアル内のStepsでは、kanikoでコンテナイメージのビルドとプッシュを行っています。

Docker Hub認証情報の作成

Secretの定義

Docker Hubへイメージをプッシュするために、Docker Hubの認証情報をKubernetesのSecretに定義します。

プライベートリポジトリなど他のDockerリポジトリを参照する場合は、token.dev/docker-0のアドレスを変更してください。現在参照しているDockerリポジトリはdocker infoコマンドのRegistryに表示されます。

usernameおよびpasswordは自分のリポジトリユーザとパスワードを指定します。エンコードしていないクリアテキストで設定してください。

ServiceAccountの定義

次に先ほど定義したSecretを利用するServiceAccountの定義を行います。

TaskRunの定義

TaskRunはPipelieResourcesとして定義したリソースをTaskのInputsとOutputsに紐づけます。

  • serviceAccount: Docker Hub認証で定義したServiceAccount
  • taskRef: Task名
  • inputs.resources.resourceRef.name: 参照するPipelineResource
  • outputs.resources.resourceRef.name: 参照するPipelineResource

Taskの実行

以上ですべてのKubernetesマニフェストファイルの準備ができました。マニフェストファイルをkubectl applyコマンドで適用してみましょう。

Tekton Pipelinesで動作しているKubernetesリソースを確認するには、以下のコマンドを利用します。

TaskRunの実行結果を確認してみます。

status.typeがSucceeded、status.statusがTrueになっていれば、実行は成功しています。Docker Hubをみて、実際にコンテナイメージがプッシュされたか確認をしてみてください。

さいごに

本記事ではKubernetes-nativeなCI/CDツールである、Tekton PipelinesのインストールとTaskの実行例を紹介しました。Tekton Pipelinesではリソースとタスクを分離し実行時に紐づけています。この仕組みにより、タスクをテンプレートのように使いまわしが容易にできそうです。Cloud Nativeの思想に従ったツールでもあるので、場所を選ばずに様々な環境で利用していくこともできそうです。記事執筆時点の2019年7月時点ではpre-releaseのv0.5が最新バージョンとなっています。今後も定期的に開発状況を確認し、Tekton Pipelineの情報を提供していく予定です。

スカイアーチ ファンタジー研究室

スカイアーチ ファンタジー研究室

EasyDoggie