TektonのWorkspace機能

Tekton Pipelinesはk8sコンテナ上で動作するCIワークフローであるため、データは揮発します。
順序については Tekton Pipelinesの制御フローで解説していますが、コンテナ間でディレクトリ内のフラットファイルを共有するには Workspaces機能を利用します。

Workspaceはtaskで利用を宣言しpipelineruntaskrunから供給する、という構造になっています。
ストレージの種類はkubernetesが提供するストレージ機能を利用でき、pipelinerunspec.workspacesに指定します。

Task内のワークスペース

単一Taskは複数のstepsを定義でき、各stepは個別のコンテナが起動します。
このsteps間で共有するWorkspaceにはemptyDirを利用できます。

apiVersion: tekton.dev/v1beta1
kind: PipelineRun
spec:
  workspaces:
  - name: workdir
    emptyDir: {}

emptyDirはオプションが乏しいため、使い方に注意はとくにありません。
ただし、emptyDirが後続のタスクでクリアされていない事象に遭遇することがあります。

この場合、Tektonの機能ではなくkubernetes標準のvolumesemptyDirをセットアップすると安定します。

Pipelineのワークスペース

Pipeline内の複数タスク間でもWorkspaceを利用してファイル共有できます。
ただし、この構成の場合にはemptyDirではなく、PersistentVolumeを利用する必要があります。emptyDirのワークスペースを用いると、後続タスクから参照した際に空になっています。

よって、この構成では公式のガイドに沿ってPersistentVolumeClaimのワークスペースを指定します。
PersistentVolumeはwrite可能なコンテナを1つに限定しているケースが多いため、sidecarなどでフィットしない構成もあります。

PersistentVolumeは、多くの場合、各クラウドプロバイダのディスクサービスを要求する挙動となるでしょう。サーバーノードの空き容量を利用するような挙動ではないことには注意が必要です。

PVCの挙動が実装依存であるため、ドキュメント記載のとおりに動作するとは限りません。

GoogleCloudの場合、Pipeline終了時にPVディスクを削除せず、ディスクが増えていきます。また、PersistentVolumeClaimのワークスペースがクリアされていない事象に遭遇することがあります。
この場合、良い対処法はないため手動削除するしかないでしょう。

CSIワークスペースが安定するまで、事実上Pipelineではワークスペースを利用できないような感触です。

ワークスペースを利用すると、単機能のコンテナを定義しやすくなりTaskの共通化に効果的ではありますが、動作安定とのトレードオフがあるため、検証にもとづいて構成を決定する必要があります。

ConfigMap / Secret

ここまでの用途とは異なり、設定をreadonlyで供給する目的で、ConfigMapSecretもworkspace経由で指定できます。
これらは各タスクのvolumesにも定義できますが、設定変更により異なる用途に活用できるケースではWorkspace経由の供給が意味を持ちます。

⁋ 2022/12/03↻ 2024/11/07
中馬崇尋
Chuma Takahiro