Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
0
Help us understand the problem. What is going on with this article?
@yamagai

今日から始めるKubernetes-nativeなGitOps【CI編 ~pipeline構築~】

この記事は WESEEK Advent Calendar 2020 16日目の記事です。

こんにちは! WESEEK, Inc. で長期インターンをさせていただいております yamagaiと申します。

先日は Kubernetes の Controller についての記事を書きましたが、これから3回に分けて GitOps の構築について書いてみようと思います!

今回は、GitOps の中でも CI pipeline の構築までについて書きます。

CI/CDを導入する対象のプロジェクトは、フロントエンドが Next.jsでバックエンドが Rails のアプリです。
フロントエンドとバックエンドは一つのリポジトリにまとめています。

参考リポジトリ

使うOSS

今回は Kubernetes-native な CI ということで、Tektonを使います。
Kubernetes のカスタムリソースとしてCIパイプラインを定義していくのが特徴です。

Tektonのうち今回使うもの

  • Tekton Pipeline
    CIパイプラインを構築するもの。

  • Tekton Triggers
    githubなどからの webhook event を受け付けるもの。

  • Tekton Dashboard
    これは無くても良いですがデバッグに有用なので、今回は入れます。

  • Tekton CLI (optional)
    これもデバッグに有用ですが、今回は触れません。

とりあえずCIパイプラインを作る

目標 : image の build と push ができるようにする

各種インストール

Tekton pipeline のインストール

前提

  • cluster version 1.16以降
  • user は cluster-admin 権限を持っている
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml

とりあえず理由がない限り nightly とかじゃなくてこれでいい
これでcontrollerのpodなどができます

パイプライン内のタスク間で共有したいデータを置いておくStorageがある場合は以下を参考に設定が必要です
https://github.com/tektoncd/pipeline/blob/master/docs/install.md#configuring-pipelineresource-storage

Tekton dashboard のインストール

前提

  • cluster version 1.15.0以降
  • tekton-pipelines がインストール済み
kubectl apply --filename https://storage.googleapis.com/tekton-releases/dashboard/latest/tekton-dashboard-release.yaml

v0.6.1.4より古いのはセキュリティ上よろしくないみたいです

( |jukai:tekton-pipelines) kubectl get pod
NAME                                           READY   STATUS    RESTARTS   AGE
tekton-dashboard-6bdbc955c6-crfpt              1/1     Running   0          15s
tekton-pipelines-controller-6486ffc547-7xnwl   1/1     Running   0          16m
tekton-pipelines-webhook-77d7486ddf-hscxk      1/1     Running   0          16m

入っていそうですね

( |jukai:tekton-pipelines) kubectl --namespace tekton-pipelines port-forward svc/tekton-dashboard 9097:9097

port-forward で確認してみましょう!

スクリーンショット 2020-12-15 21.44.43.png

こんな感じで出たら Tekton dashboard のインストールはOKです!

Tekton cli のインストール

こちらを参考にしてください

パイプラインの構築

概念の説明

Tekton にはいろんな概念があってややこしいので、まずはその説明からします!

  • Task
    複数の steps を定義してそれを一連の task として定義するリソース
    task は Pod として動き、step が container として動く

  • TaskRun
    走らせる task と、そこで使う resource (Pipelineで使う要素のこと。gitリポジトリなど。)を定義するリソース
    こいつを apply すると定義した通りに task が実行される

  • PipelineResource
    pipeline で使いたいものを input / output として設定
    今回だと input が alcatraz のソース(image の作成のため)で、output が image を指す

  • Pipeline
    複数の task を定義してそれを一連の pipeline として定義するリソース
    task の上位の存在(?)と言える

  • PipelineRun
    実行する pipeline と、そこで使う resource を定義するリソース
    これを apply したら pipeline が実行される
    特に task と pipeline が似ているが異なることに注意

実際に構築

それでは、実際にそれぞれのカスタムリソースを定義していきましょう!
以下では、自分が実際に作った際の順番と同じになっています。

1. PipelineResource

リポジトリでは、tekton/pipeline-resouces に定義しています。
定義の仕方以外は特に注意点などはないです。
ちなみに自分は、ブランチ名が master から main に変わったのを忘れ revision を master にしていて時間を溶かしました。

2. Task

リポジトリでは、tekton/tasks に定義しています。

以下のように step では公式が推奨しているKanikoを使用しています。
Kaniko とは Dockerデーモンに依存することなくコンテナ内でイメージをビルドするツールです。
Kaniko については、こちらの記事がわかりやすかったです。

ちなみに、steps については Tekton 公式のチュートリアル通りに書くと動かなかったので注意してください。
理由は忘れてしまったので思い出したら追記します。。。

steps:
    - name: ui-build-push
      image: gcr.io/kaniko-project/executor:latest
      # specifying DOCKER_CONFIG is required to allow kaniko to detect docker credential
      env:
        - name: "DOCKER_CONFIG"
          value: "/tekton/home/.docker/"
      command:
        - /kaniko/executor
      args: ["--dockerfile=$(params.pathToDockerfile)",
             "--context=$(params.pathToContext)",
             "--destination=$(resources.outputs.built-ui-image.url)"]

3. Pipeline

リポジトリでは、tekton/pipeline に定義しています。

以下のように task に渡す params の値に /workspace/(repo名)-resouce が挟まっていますが、これは Kaniko の仕様です。

tasks:
    - name: api-image-build-push
      taskRef:
        name: api-image-build-push
      params:
        - name: pathToDockerfile
          value: /workspace/alcatraz-resource/api/Dockerfile
        - name: pathToContext
          value: /workspace/alcatraz-resource/api

4. PipelineRun

リポジトリでは、tekton/pipelinerun に定義しています。

以下のように、PipelineRunの際に使用する ServiceAccount が定義されています。

spec:
  serviceAccountName: image-builder

これはリポジトリ内のここで定義しています。

この ServiceAccount に紐づく Secret は Dockerhub のログイン情報で、 PipelineRun を apply する前に用意が必要です。
以下のようにして作成できます。

kubectl create secret docker-registry dockerhub-cred \
                    --docker-username=<your-name> \
                    --docker-password=<your-pword> \
                    --docker-email=<your-email>

Dockerhub 以外の registry を使用する場合は、公式ドキュメントのこちらを参考にしてください。

以上で CI Pipeline の構築は完了です!

それでは、実際に PipelineRun を apply して Pipeline を実行し、image が push されていることを確認してみましょう!

Pipeline の実行

前提として、先ほど定義した PipelineRun 以外のカスタムリソースを全て apply しておいてください。

image を push先はここです。
現時点では何も入っていないですね。
スクリーンショット 2020-12-16 20.59.34.png

それでは、PipelineRun を実行し Tekton Dashboard で確認してみましょう!

まずは Tekton Dashboard を見られるようにします

( |jukai:tekton-pipelines) kubectl port-forward svc/tekton-dashboard 9097:9097 -n tekton-pipelines

Task もキチンと定義できてますね
スクリーンショット 2020-12-16 20.42.48.png

それでは Dashboard を見つつ、以下のコマンドで PipelineRun を apply します

~/bamboooo/alcatraz-ci-cd/tekton
( |jukai:tekton-pipelines) kubectl apply -f pipelinerun

PipelineRun が実行されている様子が確認できます!
スクリーンショット 2020-12-16 20.46.54.png

完了したみたいですね
スクリーンショット 2020-12-16 21.24.39.png

dockerhub を見てみましょう
スクリーンショット 2020-12-16 21.16.54.png

image が push できています!!

次回は、github の webhook と Tekton Triggers を使って、git push されるたびに image が build & push されるようにしますのでお楽しみに!

最後に

※この記事は WESEEK Tips wiki に 2020/12/16 に投稿された記事の転載です。
Tips wiki では、IT企業の技術的な情報やプロジェクトの情報を公開可能な範囲で公開しています。

0
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
0
Help us understand the problem. What is going on with this article?