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の思想に興味がある人
もくじ
検証環境
GKE環境で検証を行いました。検証に利用したKubernetesのクライアントおよびサーバのバージョンは以下の通りです。
1 2 3 |
$ kubectl version --short Client Version: v1.14.1 Server Version: v1.12.8-gke.10 |
Kubernetesクラスタの作成
GKEにKubernetesクラスタを作成します。
1 |
$ gcloud container clusters create tekton -m g1-small |
クラスタの作成完了まで数分かかります。クラスタの作成が完了したら、デフォルトのコンテキストが切り替わっているか確認をしておきます。
1 2 3 4 5 |
$ 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
コマンドで最新のマニフェストファイルを指定します。
1 |
$ kubectl apply --filename https://storage.googleapis.com/tekton-releases/latest/release.yaml |
Tekton Pipelinesはtekton-pipelines
というネームスペースにインストールされます。ネームスペースを指定してPodの起動を確認してみます。
1 2 3 4 |
$ 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を作成します。
- Git Hubからアプリケーションソースをcloneする。
- docker buildでコンテナイメージを作成する。
- docker pushでDocker Hubにコンテナイメージをプッシュする。
PipelineResourceの定義
はじめにInputsとOutputsを使うために、利用するリソースをPipelineResource
として定義します。利用できるリソースタイプは以下の5つがあります(v0.5)。
リソースタイプ | 説明 |
---|---|
Git | Gitリポジトリ |
Pull Request | ソースコントロールシステムへのプルリクエスト |
Image | コンテナイメージ |
Cluster | Kubernetesクラスタ |
Storage | オブジェクトストレージ。GCSのみサポート(v0.5) |
今回のチュートリアルでは、以下の2つのPipelineResouce
を作成します。
- Input: Git HubからCloneしたアプリケーションソース
- Output: Cloneしたアプリケーションを含むコンテナイメージ
Inputs: Git Resource
InputsとしてGit Hub上のアプリケーションソースを利用するので、Gitリソースを定義します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# 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リソースを定義します。
1 2 3 4 5 6 7 8 9 10 11 |
# 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で行います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# 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に定義します。
1 2 3 4 5 6 7 8 9 10 11 |
# 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に表示されます。
1 2 3 4 5 6 |
$ docker info ... Username: xxxx Registry: https://index.docker.io/v1/ Labels: ... |
username
およびpassword
は自分のリポジトリユーザとパスワードを指定します。エンコードしていないクリアテキストで設定してください。
ServiceAccountの定義
次に先ほど定義したSecretを利用するServiceAccountの定義を行います。
1 2 3 4 5 6 7 |
# serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata: name: build-bot secrets: - name: basic-user-pass |
TaskRunの定義
TaskRunはPipelieResources
として定義したリソースをTaskのInputsとOutputsに紐づけます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
# 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
コマンドで適用してみましょう。
1 2 3 4 5 6 7 |
$ 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リソースを確認するには、以下のコマンドを利用します。
1 |
$ kubectl get tekton-pipelines |
TaskRunの実行結果を確認してみます。
1 2 3 4 5 6 7 8 9 10 11 |
$ 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の情報を提供していく予定です。
投稿者プロフィール
最新の投稿
- AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
- セキュリティ2021年7月14日ゼロデイ攻撃とは
- セキュリティ2021年7月14日マルウェアとは
- WAF2021年7月13日クロスサイトスクリプティングとは?