Tekton Pipelineを触ってみた on GKE Autopilot
はじめに
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のインストールを行います。
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を作りました。
こちらをビルドして、以下のようにコンテナを起動させて実行すれば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にデプロイするだけなので簡単です。
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