🧪

Tekton Pipelineを触ってみた on GKE Autopilot

2022/05/01に公開

はじめに

Tekton PipelineというCI/CDツールがあります。これは元々KNative Buildとして開発されていたk8sネイティブのCIです。

またKNativeは元々Googleが始めたOSSプロジェクトでGoogleのCloud Run等の元になっているプロダクトでもあります。そのせいかTektonもどことなくCloud Buildに似ている気がします。k8sがあればオンプレミスからクラウド、ローカル環境までどこでも動くのとスケールが簡単そうなのが大きな魅力です。

なんとなく手慣れたCloudBuildに似てるし、ちょっと興味があったのでGKE Autopilotを使ってとりあえず環境構築してみました

GKE Autopilotを構築

環境準備

それではGKEをAutopilotで構築します。ちなみに手元の環境はWindows 11 + WSL2 + Ubuntuです。

まず、こちらを参考にCloud SDKをインストールします。
続いてkubectlをインストールします。

sudo apt-get install kubectl

これでローカル環境の準備は整ったのでGCPにGKEクラスタ作成の準備をします。

gcloud services enable container.googleapis.com
gcloud services enable containerregistry.googleapis.com

クラスタの構築

クラスタ名をmycluster, リージョンをus-central1にしています。好みの名前を選べばOKです。clusters create-autoでautopilotになります。NodeはGoogleの管理課で運用されるのでPod数等に応じて自動的に最適化されます。

PROJECT_ID=$(gcloud config configurations list | grep True | awk '{print $4}')
CLUSTER=mycluster
REGION=us-central1

gcloud container clusters create-auto mycluster --create-subnetwork name=gke --region us-central1
gcloud container clusters get-credentials $CLUSTER --region $REGION --project $PROJECT_ID
gcloud auth configure-docker

とりあえず、何か適当なコンテナをデプロイしてみます。

$ kubectl create deployment mycluster --image=hello-world
$ kubectl get pods -w
NAME                         READY   STATUS    RESTARTS   AGE
mycluster-64d6548b76-9m4b4   0/1     Pending   0          10s
$ $ kubectl get nodes
NAME                                       STATUS     ROLES    AGE    VERSION
gk3-mycluster-default-pool-293f6faa-ccqv   Ready      <none>   4m1s   v1.21.6-gke.1500
gk3-mycluster-default-pool-8c110b9e-fgpw   NotReady   <none>   3s     v1.21.6-gke.1500
gk3-mycluster-default-pool-8c110b9e-lqsw   Ready      <none>   4m1s   v1.21.6-gke.1500

nodeがよしなに作られているのが分かりますね。PodのステータスがCompletedになったらログを確認してみます。

$ kubectl logs pod/mycluster-64d6548b76-9m4b4

Hello from Docker!
This message shows that your installation appears to be working correctly.
~ 略

無事にHello Worldが出力されていますね。これでGKE Autopilotの構築及び基本的な動作確認は完了です。

Tektonのインストール

Tektonには複数のプロダクトがありますが、今回はメインとなるTekton Pipelineと管理ツールであるTekton CLI、Web UIであるTekton Dashboardをインストールします。

Pipelineのインストール

まずは下記を参考にPipelineのインストールを行います。
https://tekton.dev/docs/getting-started/

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

これだけTekton Pipelineのインストールは完了です! 簡単ですね。とはいえ1分程度はAutopilotがNodeを増減させたりと時間が掛かるので以下のコマンドを打ってRunningになるまで待ちましょう。

$ kubectl get pods --namespace tekton-pipelines --watch
NAME                                           READY   STATUS    RESTARTS   AGE
tekton-pipelines-controller-598cbbf84d-wnh7r   1/1     Running   0          4m5s
tekton-pipelines-webhook-7bcc5b9b69-9z5qf      1/1     Running   0          4m5s

Tekton CLIのインストール

続いて、管理コマンドであるTekton CLIをインストールします。Setup CLIを参考にしました。
私はWSL2 + Ubuntuなのでapt-getで導入してみました。

sudo apt update;sudo apt install -y gnupg
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3EFE0E0A2F2F60AA
echo "deb http://ppa.launchpad.net/tektoncd/cli/ubuntu eoan main"|sudo tee /etc/apt/sources.list.d/tektoncd-ubuntu-cli.list
sudo apt update && sudo apt install -y tektoncd-cli

これでOK! と思って実行したら何やらエラーが。。。

$ tkn version
tkn: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by tkn)
tkn: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by tkn)

どうやらGLIBCのバージョンが合わない様です。手持ちの環境のバージョンを確認してみます。

$ ldd --version
ldd (Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31

2.3.1ですね。WSL2でデフォルトでインストールされるUbuntuは20.4なのでバージョンが合わない様です。最新のUbuntu 21.10とかにアップグレードしても良かったのですが、面倒なので下記のように開発環境用のDokcerfileを作りました。
https://github.com/koduki/example-tekton/blob/main/env_dev/Dockerfile

こちらをビルドして、以下のようにコンテナを起動させて実行すればOKです。

$ docker run -it -v $HOME:/home/user -v /var/run/docker.sock:/var/run/docker.sock koduki/env-dev4tekton
user@5297fd802e46:~$ tkn version
Client version: 0.22.0
Pipeline version: v0.32.1

これによって$HOMEを被せてマウントしているのでローカル環境と同期させながら使えます。また/var/run/docker.sockもマウントしているのでDockerコマンドやkubectlも実行しホストとコンテナで共有できます。セキュリティ的にはホストへ影響があるのであまり推奨されませんが、今回はホストに影響を与えたいので問題ありません。この方法は開発環境を丸ごとパッケージング出来て結構便利なのでお勧めです。

Tekton Dashboardのインストール

管理ツールはTekton CLIだけでも足りるのですが、やはりWeb UIも欲しいですよね? それがTekton Dashboardです。
導入はやはりk8sにデプロイするだけなので簡単です。
https://tekton.dev/docs/dashboard/

kubectl apply --filename https://github.com/tektoncd/dashboard/releases/latest/download/tekton-dashboard-release.yaml

これでOKです。あとはPodの状況を眺めてデプロイが完了するのを待ちましょう。

$ kubectl get pods --namespace tekton-pipelines --watch
NAME                                           READY   STATUS    RESTARTS   AGE
tekton-pipelines-controller-598cbbf84d-wnh7r   1/1     Running   0          7h4m
tekton-pipelines-webhook-7bcc5b9b69-9z5qf      1/1     Running   0          7h4m
tekton-dashboard-757d97b48d-8xxzc              0/1     Pending   0          0s
tekton-dashboard-757d97b48d-8xxzc              0/1     Pending   0          0s

立ち上がったらkube-proxyでクラスタIPにアクセスしてみます。これは先ほど作った開発環境用のコンテナでは無くWSL2から直で実行します。

$ alias open="/mnt/c/Progra~2/Microsoft/Edge/Application/msedge.exe"
$ kubectl proxy --port=8080
$ open http://localhost:8080/api/v1/namespaces/tekton-pipelines/services/tekton-dashboard:http/proxy/

Web UIが表示されましたね? これで準備は完了です。

Tektonでビルドしてみる

Hello World

まずはチュートリアルを写経してTektonを実行してみましょう。
task-hello.yamlを以下のように作成してapplyします。

apiVersion: tekton.dev/v1beta1
kind: Task
metadata:
  name: echo-hello-world
spec:
  steps:
    - name: echo
      image: ubuntu
      command:
        - echo
      args:
        - "Hello World"
$ kubectl apply -f task-hello.yaml
task.tekton.dev/echo-hello-world created

TaskのApplyの結果をtekton-cliで見てみます。

$ tkn task describe echo-hello-world
Name:        echo-hello-world
Namespace:   default
🦶 Steps
 ∙ echo

echo-hello-worldという名前でTaskが登録され、Stepとしてechoが登録されたのが分かりますね。YAMLを見れば分かる通りecho-stepの中では引数をHello Worldにしてechoを実行しているだけです。このTaskの作成がJenkinsなんかで言えば 「ジョブの作成」 に当たるようです。続けて実行をしてみましょう。

以下のようにYAMLを書いてApplyします。

apiVersion: tekton.dev/v1beta1
kind: TaskRun
metadata:
  name: echo-hello-world-task-run
spec:
  taskRef:
    name: echo-hello-world
$ kubectl apply -f taskrun-hello.yaml
taskrun.tekton.dev/echo-hello-world-task-run created

taskRefでecho-hello-worldを指定して実行する対象のタスクを指定しています。こちらの結果をtekton-cliで見てみましょう。

$ tkn task describe echo-hello-world
Name:        echo-hello-world
Namespace:   default
🦶 Steps
 ∙ echo
🗂   Taskruns
NAME                        STARTED          DURATION   STATUS
echo-hello-world-task-run   35 minutes ago   1 minute   Succeeded

実行結果は以下のようにPodのログから確認が出来ます。

$ tkn taskrun logs echo-hello-world-task-run3
[echo] Hello World

ダッシュボードからも以下のように確認ができます。

まとめ

とりあえずこれで環境構築が出来ました。後日、以下のような項目に関してもまとめていきたいと思います。

  • Githubの連携とDockerレジストリへの登録
  • JavaのビルドしてMavenリポジトリへ登録
  • ビルドのスケール

Circle CIやGithub Actionで良いケースも多いですが、SaaSでは無い選択肢をJenkins以外にも用意はしておきたいので、今後もうちょっと遊んでおきたいと思います。少し触った感じだとArgoより自分には向いてそうだし。

それではHappy Hacking!

Discussion