2024/12/17
新規作成
概要
過去に作成したパイプラインを再実行した際に、git clone タスク実行時のsecretが原因でstepエラーとなったことを切掛に、secretの参照関係を調査しました。
状況としては、再実行時に該当のsecretが参照パスがなくなっていたことが原因でした。また、project間でyamlをコピーした際など、別projectのsecretを参照することは出来ないことも注意点です。
前提・環境など
- OCP 14.16 (IBM Managed Openshift /ROKS)
- RedHat Enterprise Linux 8.6 (踏み台サーバー)
前提知識
- tekton の基礎知識 (PipeLine、Taskなど)
- OpenShiftの基礎知識 (ConfigMap、Secret、deployment、Dockerfile、podなど)
1. Pipeline実行時の参照secretについて
secretの参照関係を図にしてみました。各コンポーネントの概要は以下の表の通りです。
# | コンポーネント | 概要 |
---|---|---|
(1) | Pipelines | パイプライン定義 実行予定のTaskの順序や関連性を定義する |
(2) | Tasks | タスク定義 実行するコンテナイメージや、コンテナ稼働後のbash処理などを定義する |
(3) | PipelineRuns | 実行後のパイプラインのインスタンス。結果やログなどのstatus情報を含む |
(4) | TaskRuns | 実行後のタスクのインスタンス。結果やログなどのstatus情報を含む |
(5) | Secret | basic認証や、key-value変数などを定義 (Taskに直接記載せずに分離する) |
(6) | ServiceAccount | パイプライン実行時のユーザー。Pipeline実行権限(Role)を持つ必要がある |
(7) | TectonConfig | パイプライン実行時のdefault Service Account(pipeline)を定義している |
以下、よく見るパイプライン実行時のGUIから情報をたどってみます。
1-1.実行時UI (認証情報オプション)
Pipelineの起動時には、認証情報オプションという欄があります。
この一覧で参照できているものが、パイプライン/タスク内でのGitアクセスなどに利用可能な Secretとなります。
1-2.(Service Account)pipeline からみる参照Secret
先の1-1の参照Secretは、どこで定義されているのかを辿ってみます。
結論から記載すると、今回は pipelineという名前のServiceAccountから紐づいていました。このpipelineは、パイプラインを実行する際のデフォルトServiceAccountに相当します。(後述)
画像のsecrets:
定義を見ていただくと、先の認証情報オプションにもあった git250225-pipeline
と pipelinetestsecret
が指定されていることがわかります。ServiceAccountは、これらのsecretをproject内部で探して、パイプライン実行時に参照するというワケです。(ちなみに、github-erimというgit認証用のbasic認証Secretは、別projectに存在し参照スコープ外のため、先の実行時画面で表示されていません)
1-2.PipelineRuns / TaskRunsからみる service account
実際、パイプライン実行時にどのServiceAccountを指定しているのか見てみます。
Pipelines、Tasks自体にはServiceAccountの指定はありません。その代わりに、PipelineRuns、TaskRunsの各インスタンスで実行時に指定されていることがわかります。(下図:例)
spec.serviceAccountName変数として、pipeline
というServiceAccountリソースをTaskRunで指定していることがわかります。
ちなみに、このインスタンス実行時のServiceAccountですが、デフォルト定義としては、config というTektonConfigs
に記載があります。TektonConfigs
は、CustonResourceDefinitions
一覧から参照することができるカスタムリソースです。(configはTektonConfigsのインスタンス名)
この、config というTektonConfigsリソースに default-service-account: pipeline
という記載があるため、tekton パイプラインの実行サービスアカウントが (SA)pipeline
となり、 (SA)pipeline
から参照可能なSecretを参照して、Gitアクセスができる、という流れになります。
2. 各変数のスコープについて
改めてではありますが、各コンポーネントのスコープを整理しておきます。Pipelineを実行する際、リソースはprojectスコープとなります。
つまり、Pipeline実行時に参照するServiceAccount、Secretは、同一projectで定義してある必要があります。(当たり前と言えば当たり前)
ただし、Pipeline実行時のdefault ServiceAccountを管理しているTektonConfigsはprojectのリソースではありません。
コンポーネント | スコープ | 備考 |
---|---|---|
Pipeline / PipelineRuns | project | |
Task / TaskRuns | project | |
ServiceAccount | project | |
Secret | project | |
TektonConfigs | 共通 |
おわりに
ここまで読んでくださって有難うございました。認識違い等、お気づきの点ありましたらコメント頂けますと幸いです。