[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のクライアントおよびサーバのバージョンは以下の通りです。

$ kubectl version --short
Client Version: v1.14.1
Server Version: v1.12.8-gke.10

Kubernetesクラスタの作成

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

$ gcloud container clusters create tekton -m g1-small

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

$ kubectl config get-contexts
CURRENT   NAME                               CLUSTER                            AUTHINFO                           NAMESPACE
          docker-for-desktop                 docker-for-desktop-cluster         docker-for-desktop
*         gke_easydoggie_us-west1-c_tekton   gke_easydoggie_us-west1-c_tekton   gke_easydoggie_us-west1-c_tekton
          tekton                             docker-for-desktop-cluster         tekton

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

Tekton Pipelinesのインストール

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

$ kubectl apply --filename https://storage.googleapis.com/tekton-releases/latest/release.yaml

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

$ kubectl get pods --namespace tekton-pipelines
NAME                                           READY   STATUS    RESTARTS   AGE
tekton-pipelines-controller-5ffccc5d94-p5xgj   1/1     Running   0          2m
tekton-pipelines-webhook-79c7bbd77b-ddgs5      1/1     Running   0          2m

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リソースを定義します。

# gitResource.yaml
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
  name: easydoggie-git
  namespace: default
spec:
  type: git
  params:
    - name: url
      value: https://github.com/sumomo-99/TektonSample.git
    - name: revision
      value: master

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

Outputs: Image Resource

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

# imageResource.yaml
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
  name: easydoggie-test-image
  namespace: default
spec:
  type: image
  params:
    - name: url
      value: easydoggie/testapp

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

Taskの定義

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

# task.yaml
apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: test-doker-image
spec:
  inputs:
    resources:
      - name: app
        type: git
    params:
      - name: dockerfile
        default: /workspace/app/Dockerfile
      - name: context
        default: /workspace/app
  outputs:
    resources:
      - name: builtImage
        type: image
  steps:
    - name: build-and-push
      image: gcr.io/kaniko-project/executor
      command:
        - /kaniko/executor
      args:
        - --dockerfile=${inputs.params.dockerfile}
        - --destination=${outputs.resources.builtImage.url}
        - --context=${inputs.params.context}

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

Docker Hub認証情報の作成

Secretの定義

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

# secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: basic-user-pass
  annotations:
    tekton.dev/docker-0: https://index.docker.io/v1/
type: kubernetes.io/basic-auth
stringData:
  username: <username>
  password: <password>

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

$ docker info
...
Username: xxxx
Registry: https://index.docker.io/v1/
Labels:
...

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

ServiceAccountの定義

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

# serviceaccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: build-bot
secrets:
  - name: basic-user-pass

TaskRunの定義

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

# taskrun.yaml
apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
  name: test-taskrun
spec:
  serviceAccount: build-bot
  taskRef:
    name: test-doker-image
  inputs:
    resources:
      - name: app
        resourceRef:
          name: easydoggie-git
  outputs:
    resources:
      - name: builtImage
        resourceRef:
          name: easydoggie-test-image
  • serviceAccount: Docker Hub認証で定義したServiceAccount
  • taskRef: Task名
  • inputs.resources.resourceRef.name: 参照するPipelineResource
  • outputs.resources.resourceRef.name: 参照するPipelineResource

Taskの実行

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

$ kubectl apply -f gitResource.yaml -f imageResource.yaml -f task.yaml -f secret.yaml -f serviceaccount.yaml -f taskrun.yaml
pipelineresource.tekton.dev/easydoggie-git created
pipelineresource.tekton.dev/easydoggie-test-image created
task.tekton.dev/test-doker-image created
secret/dockerhub-user-pass created
serviceaccount/build-bot created
taskrun.tekton.dev/test-taskrun created

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

$ kubectl get tekton-pipelines

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

$ kubectl get taskruns/test-taskrun -o yaml
...
status:
  completionTime: "2019-07-18T06:22:50Z"
  conditions:
  - lastTransitionTime: "2019-07-18T06:22:50Z"
    message: All Steps have completed executing
    reason: Succeeded
    status: "True"
    type: Succeeded
...

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

投稿者プロフィール

石川 淳
スカイアーチネットワークスで、新しいサービスの企画を行っています。
元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。
https://github.com/easydoggie
コメントを頂けると嬉しいです。

ABOUTこの記事をかいた人

スカイアーチネットワークスで、新しいサービスの企画を行っています。 元SIer、元スマフォ向けゲームインフラの経験を生かして、新しいサービスをリリースしていきます。現在企画中のサービスはこちら。 https://github.com/easydoggie コメントを頂けると嬉しいです。