(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【Tekton/Kubernetes】Taskを初回実行する際の注意点

スポンサーリンク

事象

オフライン環境で初めてTaskを起動するとPending状態となる。

$ kubectl get taskrun
NAME                        SUCCEEDED   REASON    STARTTIME   COMPLETIONTIME
taskrun-hello   Unknown     Pending   3m46s

具体的にはPodの初期化で止まっている。

$ kubectl get pod
NAME                                  READY   STATUS     RESTARTS   AGE
taskrun-hello-pod-p8lx7   0/1     Init:0/1   0          3m22s
環境
  • Windows10
  • DockerDesktop 2.4
  • pipeline.tekton.dev/release: "v0.17.0"

尚、tektonの関連リソースは以下コマンドで展開済。

$ kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
$ kubectl get all -n tekton-pipelines
...
NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                     AGE
service/tekton-pipelines-controller   ClusterIP   10.X.X.X    <none>        9090/TCP                    xxm
service/tekton-pipelines-webhook      ClusterIP   10.X.X.X   <none>        9090/TCP,8008/TCP,443/TCP   xxm
NAME                                          READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/tekton-pipelines-controller   1/1     1            1           xm
deployment.apps/tekton-pipelines-webhook      1/1     1            1           xm ...

原因

以下のエントリー用イメージの取得に失敗している。

gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint

具体的にはTaskを実行した際のPodのEvent情報は以下。

Events:
  Type    Reason     Age   From                     Message
  ----    ------     ----  ----                     -------
  Normal  Scheduled  100s  default-scheduler        Successfully assigned default/echo-hello-world-task-run-pod-p8lx7 to docker-desktop
  Normal  Pulling    100s  kubelet, docker-desktop  Pulling image "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint:v0.17.0@sha
256:3566c77d313eba5dc5ca1c015007205fc78a4141de2caa97ae5f01665cb00b42"

よって同イメージを事前にPullした状態でTaskrunを実行すると正常に終了する。

$ kubectl get taskrun
NAME                        SUCCEEDED   REASON      STARTTIME   COMPLETIONTIME
taskrun-hello   True        Succeeded   17s         7s

以下、補足です。

補足

HelloをPod内で表示するだけのTask/Taskrunで説明します。

以下のTaskを

apiVersion: tekton.dev/v1alpha1
kind: Task
metadata:
  name: task-hello
spec:
  steps:
  - name: echo
    image: ubuntu
    command:
    - echo
    args:
    - "hello world"

起動した状態で

$ kubectl get task
NAME               AGE
task-hello   xm

以下のYAMLを

apiVersion: tekton.dev/v1alpha1
kind: TaskRun
metadata:
  name: taskrun-hello
spec:
  taskRef:
    name: task-hello

作成するとtaskRefで指定したTaskが実行されます。

$ kubectl create -f taskrun-hello.yaml
taskrun.tekton.dev/taskrun-hello created

ただし、同Taskを実行する際にはTektonのDeploymentで実行される以下のイメージに加えて

gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/webhook
gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/controller

以下のentrypointイメージも一時的が必要になるのが根本原因です。

gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint

Taskrun実行時に起動するTaskのInit Containersの扱いで同イメージが動くので、このイメージ取得に時間がかかったりイメージ取得に失敗している場合は同事象が起こります。

ちなみに正常にTaskが実行できた場合のEventは以下となります。

Events:
  Type    Reason     Age   From                     Message
  ----    ------     ----  ----                     -------
  Normal  Scheduled  3m7s  default-scheduler        Successfully assigned default/taskrun-hello-pod-mhmgp to docker-desktop
  Normal  Pulled     3m6s  kubelet, docker-desktop  Container image "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint:v0.17.0@s
ha256:3566c77d313eba5dc5ca1c015007205fc78a4141de2caa97ae5f01665cb00b42" already present on machine
  Normal  Created    3m6s  kubelet, docker-desktop  Created container place-tools
  Normal  Started    3m6s  kubelet, docker-desktop  Started container place-tools
  Normal  Pulling    3m6s  kubelet, docker-desktop  Pulling image "ubuntu"
  Normal  Pulled     3m1s  kubelet, docker-desktop  Successfully pulled image "ubuntu"
  Normal  Created    3m1s  kubelet, docker-desktop  Created container step-echo
  Normal  Started    3m1s  kubelet, docker-desktop  Started container step-echo

Tektonの実行に必要な同イメージの存在は、意識することが少ないので覚えておくとトラブルシューティングに役立ちます。