OpenShift Pipeline の可観測性
OpenShift Pipeline の可観測性機能
概要
第1章 OpenShift Pipelines の可観測性のために Tekton 結果を使用する
Tekton Results は、すべてのパイプライン実行とタスク実行の完全な情報をアーカイブするサービスです。必要に応じて PipelineRun
リソースと TaskRun
リソースをプルーニングし、Tekton Results API または opc
コマンドラインユーティリティーを使用して、それらの YAML マニフェストとログ情報にアクセスできます。
1.1. Tekton Results の概念
Tekton Results は、パイプラインの実行とタスクの実行を結果とレコードの形式でアーカイブします。
実行が完了した PipelineRun
および TaskRun
カスタムリソース (CR) ごとに、Tekton Results は レコード を作成します。
結果 には、1 つまたは複数のレコードを含めることができます。レコードは、常に 1 つの結果に含まれています。
結果はパイプライン実行に対応し、PipelineRun
CR 自体のレコードと、パイプライン実行の一部として開始されたすべての TaskRun
CR のレコードが含まれます。
タスク実行がパイプライン実行を使用せずに直接開始された場合、このタスク実行の結果が作成されます。この結果には、同じタスク実行のレコードが含まれます。
各結果には、PipelineRun
または TaskRun
CR が作成された namespace と CR の UUID が含まれる名前が付けられます。結果名の形式は <namespace_name>/results/<parent_run_uuid>
です。この形式では、<parent_run_uuid>
はパイプライン実行の UUUD、または直接開始されたタスク実行の UUUD です。
結果名の例
results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed
各レコードには、レコードを含む結果の名前と、レコードが対応する PipelineRun
または TaskRun
CR の UUID を含む名前が付いています。結果名の形式は <namespace_name>/results/<parent_run_uuid>/results/<run_uuid>
です。
レコード名の例
results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/records/e9c736db-5665-441f-922f-7c1d65c9d621
レコードには、実行完了後に存在していた TaskRun
または PipelineRun
CR の完全な YAML マニフェストが含まれます。このマニフェストには、実行の仕様、実行に指定されたアノテーションのほか、完了時刻や実行が成功したかどうかなど、実行の結果に関する特定の情報が含まれます。
TaskRun
または PipelineRun
CR が存在している間は、次のコマンドを使用して YAML マニフェストを表示できます。
$ oc get pipelinerun <cr_name> -o yaml
Tekton Results は、TaskRun
または PipelineRun
CR が削除された後もこのマニフェストを保存し、表示および検索できるようにします。
完了後に実行されるパイプラインの YAML マニフェストの例
kind: PipelineRun spec: params: - name: message value: five timeouts: pipeline: 1h0m0s pipelineRef: name: echo-pipeline taskRunTemplate: serviceAccountName: pipeline status: startTime: "2023-08-07T11:41:40Z" conditions: - type: Succeeded reason: Succeeded status: "True" message: 'Tasks Completed: 1 (Failed: 0, Cancelled 0), Skipped: 0' lastTransitionTime: "2023-08-07T11:41:49Z" pipelineSpec: tasks: - name: echo-task params: - name: message value: five taskRef: kind: Task name: echo-task-pipeline params: - name: message type: string completionTime: "2023-08-07T11:41:49Z" childReferences: - kind: TaskRun name: echo-pipeline-run-gmzrx-echo-task apiVersion: tekton.dev/v1 pipelineTaskName: echo-task metadata: uid: 62c3b02e-f12b-416c-9771-c02af518f6d4 name: echo-pipeline-run-gmzrx labels: tekton.dev/pipeline: echo-pipeline namespace: releasetest-js5tt finalizers: - chains.tekton.dev/pipelinerun generation: 2 annotations: results.tekton.dev/log: releasetest-js5tt/results/62c3b02e-f12b-416c-9771-c02af518f6d4/logs/c1e49dd8-d641-383e-b708-e3a02b6a4378 chains.tekton.dev/signed: "true" results.tekton.dev/record: releasetest-js5tt/results/62c3b02e-f12b-416c-9771-c02af518f6d4/records/62c3b02e-f12b-416c-9771-c02af518f6d4 results.tekton.dev/result: releasetest-js5tt/results/62c3b02e-f12b-416c-9771-c02af518f6d4 generateName: echo-pipeline-run- managedFields: - time: "2023-08-07T11:41:39Z" manager: kubectl-create fieldsV1: f:spec: .: {} f:params: {} f:pipelineRef: .: {} f:name: {} f:metadata: f:generateName: {} operation: Update apiVersion: tekton.dev/v1 fieldsType: FieldsV1 - time: "2023-08-07T11:41:40Z" manager: openshift-pipelines-controller fieldsV1: f:metadata: f:labels: .: {} f:tekton.dev/pipeline: {} operation: Update apiVersion: tekton.dev/v1 fieldsType: FieldsV1 - time: "2023-08-07T11:41:49Z" manager: openshift-pipelines-chains-controller fieldsV1: f:metadata: f:finalizers: .: {} v:"chains.tekton.dev/pipelinerun": {} f:annotations: .: {} f:chains.tekton.dev/signed: {} operation: Update apiVersion: tekton.dev/v1 fieldsType: FieldsV1 - time: "2023-08-07T11:41:49Z" manager: openshift-pipelines-controller fieldsV1: f:status: f:startTime: {} f:conditions: {} f:pipelineSpec: .: {} f:tasks: {} f:params: {} f:completionTime: {} f:childReferences: {} operation: Update apiVersion: tekton.dev/v1 fieldsType: FieldsV1 subresource: status - time: "2023-08-07T11:42:15Z" manager: openshift-pipelines-results-watcher fieldsV1: f:metadata: f:annotations: f:results.tekton.dev/log: {} f:results.tekton.dev/record: {} f:results.tekton.dev/result: {} operation: Update apiVersion: tekton.dev/v1 fieldsType: FieldsV1 resourceVersion: "126429" creationTimestamp: "2023-08-07T11:41:39Z" deletionTimestamp: "2023-08-07T11:42:23Z" deletionGracePeriodSeconds: 0 apiVersion: tekton.dev/v1
すべての結果とレコードにその名前でアクセスできます。Common Expression Language (CEL) クエリーを使用して、YAML マニフェストなど、そのクエリーに含まれる情報によって結果とレコードを検索することもできます。
また、Tekton Results を設定して、パイプラインまたはタスクの一部として実行されたすべてのツールのログ情報を LokiStack に転送できるようにすることもできます。その後、Tekton Results を照会して、Tekton Results レコードに関連付けられたタスク実行のログ情報を取得できます。
1.2. Tekton の結果の設定
OpenShift Pipelines をインストールすると、Tekton Results がデフォルトで有効になります。
ただし、パイプライン実行とタスク実行のログ情報を保存してアクセスする場合は、この情報を LokiStack に転送するように設定する必要があります。
オプションで、Tekton Results の追加設定を完了できます。
1.2.1. ログ情報の LokiStack 転送の設定
Tekton Results を使用してタスク実行のログ情報を照会する場合は、OpenShift Container Platform クラスターに LokiStack と OpenShift ロギングをインストールし、ログ情報を LokiStack に転送するように設定する必要があります。
ログ情報の LokiStack 転送が設定されていない場合、Tekton Results でこの情報は保存されず、コマンドラインインターフェイスまたは API からも提供されません。
前提条件
-
OpenShift CLI (
oc
) ユーティリティーがインストールされている。 - クラスター管理者ユーザーとして OpenShift Container Platform クラスターにログインした。
手順
LokiStack 転送を設定するには、次の手順を実行します。
- OpenShift Container Platform クラスターで、Loki Operator を使用して LokiStack をインストールし、さらに OpenShift Logging Operator もインストールします。
OpenShift Logging バージョン 6 またはバージョン 5 のどちらをインストールしたかに応じて、次のいずれかの YAML マニフェストを使用して、
ClusterLogForwarder
カスタムリソース (CR) のClusterLogForwarder.yaml
マニフェストファイルを作成します。OpenShift Logging バージョン 6 をインストールしている場合の
ClusterLogForwarder
CR の YAML マニフェストapiVersion: observability.openshift.io/v1 kind: ClusterLogForwarder metadata: name: collector namespace: openshift-logging spec: inputs: - application: selector: matchExpressions: - key: app.kubernetes.io/managed-by operator: In values: ["tekton-pipelines", "pipelinesascode.tekton.dev"] name: only-tekton type: application managementState: Managed outputs: - lokiStack: labelKeys: application: ignoreGlobal: true labelKeys: - log_type - kubernetes.namespace_name - openshift_cluster_id authentication: token: from: serviceAccount target: name: logging-loki namespace: openshift-logging name: default-lokistack tls: ca: configMapName: openshift-service-ca.crt key: service-ca.crt type: lokiStack pipelines: - inputRefs: - only-tekton name: default-logstore outputRefs: - default-lokistack serviceAccount: name: collector
OpenShift Logging バージョン 5 をインストールしている場合の
ClusterLogForwarder
CR の YAML マニフェストapiVersion: "logging.openshift.io/v1" kind: ClusterLogForwarder metadata: name: instance namespace: openshift-logging spec: inputs: - name: only-tekton application: selector: matchLabels: app.kubernetes.io/managed-by: tekton-pipelines pipelines: - name: enable-default-log-store inputRefs: [ only-tekton ] outputRefs: [ default ]
次のコマンドを入力して、
openshift-logging
namespace にClusterLogForwarder
CR を作成します。$ oc apply -n openshift-logging ClusterLogForwarder.yaml
次のコマンドを使用して、
TektonConfig
カスタムリソース (CR) を編集します。$ oc edit TektonConfig config
result
仕様に次の変更を加えます。apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: result: loki_stack_name: logging-loki 1 loki_stack_namespace: openshift-logging 2
1.2.2. 外部データベースサーバーの設定
Tekton Results は、PostgreSQL データベースを使用してデータを保存します。デフォルトでは、インストールには内部 PostgreSQL インスタンスが含まれます。デプロイメント内にすでに存在する外部 PostgreSQL サーバーを使用するようにインストールを設定できます。
手順
次のコマンドを入力して、PostgreSQL サーバーに接続するための認証情報を含むシークレットを作成します。
$ oc create secret generic tekton-results-postgres \ --namespace=openshift-pipelines \ --from-literal=POSTGRES_USER=<user> \ --from-literal=POSTGRES_PASSWORD=<password>
次のコマンドを使用して、
TektonConfig
カスタムリソース (CR) を編集します。$ oc edit TektonConfig config
result
仕様に次の変更を加えます。apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: result: is_external_db: true db_host: database.example.com 1 db_port: 5342 2
1.2.3. Tekton Results の保持ポリシーの設定
デフォルトでは、Tekton Results はパイプラインの実行、タスクの実行、イベント、およびログを無期限に保存します。これにより、ストレージリソースが不必要に使用され、データベースのパフォーマンスに影響する可能性があります。
クラスターレベルで Tekton Results の保持ポリシーを設定して、古い結果とそれに関連するレコードおよびログを削除できます。
手順
次のコマンドを使用して、
TektonConfig
カスタムリソース (CR) を編集します。$ oc edit TektonConfig config
result
仕様に次の変更を加えます。apiVersion: operator.tekton.dev/v1alpha1 kind: TektonConfig metadata: name: config spec: result: options: configMaps: config-results-retention-policy: data: runAt: "3 5 * * 0" 1 maxRetention: "30" 2
1.3. opc コマンドラインユーティリティーを使用した Tekton Results のクエリー
opc
コマンドラインユーティリティーを使用して、Tekton Results に結果とレコードを問い合わせることができます。opc
コマンドラインユーティリティーをインストールするには、tkn
コマンドラインユーティリティーのパッケージをインストールします。このパッケージのインストール手順は、tkn のインストール を参照してください。
レコードと結果の名前を使用して、その中に含まれるデータを取得できます。
Common Expression Language (CEL) クエリーを使用して結果とレコードを検索できます。これらの検索では、結果またはレコードの UUID が表示されます。提供された例を使用して、一般的な検索タイプのクエリーを作成できます。参照情報を使用して他のクエリーを作成することもできます。
1.3.1. Tekton Results をクエリーするための opc ユーティリティー環境の準備
Tekton Results をクエリーする前に、opc
ユーティリティーの環境を準備する必要があります。
前提条件
-
opc
ユーティリティーがインストールされている。
手順
次のコマンドを入力して、
RESULTS_API
環境変数を Tekton Results API へのルートに設定します。$ export RESULTS_API=$(oc get route tekton-results-api-service -n openshift-pipelines --no-headers -o custom-columns=":spec.host"):443
次のコマンドを入力して、Tekton Results API の認証トークンを作成します。
$ oc create token <service_account>
このコマンドが出力する文字列を保存します。
オプション: Tekton Results API による自動認証用に
~/.config/tkn/results.yaml
ファイルを作成します。ファイルには次の内容が含まれている必要があります。address: <tekton_results_route> 1 token: <authentication_token> 2 ssl: roots_file_path: /home/example/cert.pem 3 server_name_override: tekton-results-api-service.openshift-pipelines.svc.cluster.local 4 service_account: namespace: service_acc_1 5 name: service_acc_1 6
- 1
- Tekton Results API へのルート。
RESULTS_API
に設定したものと同じ値を使用します。 - 2
oc create token
コマンドによって作成された認証トークン。このトークンを指定すると、service_account
設定がオーバーライドされ、opc
はこのトークンを使用して認証します。- 3
- API エンドポイント用に設定した SSL 証明書を含むファイルの場所。
- 4
- OpenShift Pipelines のカスタムターゲット namespace を設定した場合は、
openshift-pipelines
をこの namespace の名前に置き換えます。 - 5 6
- Tekton Results API で認証するためのサービスアカウントの名前。認証トークンを指定した場合は、
service_account
パラメーターを指定する必要はありません。
あるいは、
~/.config/tkn/results.yaml
ファイルを作成しない場合は、--authtoken
オプションを使用して各opc
コマンドにトークンを渡すことができます。
1.3.2. 名前による結果とレコードのクエリー
名前を使用して、結果とレコードをリスト表示したり、クエリーを実行したりできます。
前提条件
-
opc
ユーティリティーをインストールし、Tekton Results をクエリーするための環境を準備している。 -
jq
パッケージがインストールされている。 - (ログ情報を照会する場合) LokiStack へのログ転送が設定されている。
手順
namespace で作成されたパイプライン実行およびタスク実行に対応するすべての結果の名前をリストします。以下のコマンドを実行します。
$ opc results list --addr ${RESULTS_API} <namespace_name>
コマンドの例
$ opc results list --addr ${RESULTS_API} results-testing
出力例
Name Start Update results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed 2023-06-29 02:49:53 +0530 IST 2023-06-29 02:50:05 +0530 IST results-testing/results/ad7eb937-90cc-4510-8380-defe51ad793f 2023-06-29 02:49:38 +0530 IST 2023-06-29 02:50:06 +0530 IST results-testing/results/d064ce6e-d851-4b4e-8db4-7605a23671e4 2023-06-29 02:49:45 +0530 IST 2023-06-29 02:49:56 +0530 IST
次のコマンドを入力して、結果内のすべてのレコードの名前をリスト表示します。
$ opc results records list --addr ${RESULTS_API} <result_name>
コマンドの例
$ opc results records list --addr ${RESULTS_API} results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed
出力例
Name Type Start Update results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/records/e9c736db-5665-441f-922f-7c1d65c9d621 tekton.dev/v1.TaskRun 2023-06-29 02:49:53 +0530 IST 2023-06-29 02:49:57 +0530 IST results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/records/5de23a76-a12b-3a72-8a6a-4f15a3110a3e results.tekton.dev/v1alpha2.Log 2023-06-29 02:49:57 +0530 IST 2023-06-29 02:49:57 +0530 IST results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/records/57ce92f9-9bf8-3a0a-aefb-dc20c3e2862d results.tekton.dev/v1alpha2.Log 2023-06-29 02:50:05 +0530 IST 2023-06-29 02:50:05 +0530 IST results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/records/e9a0c21a-f826-42ab-a9d7-a03bcefed4fd tekton.dev/v1.TaskRun 2023-06-29 02:49:57 +0530 IST 2023-06-29 02:50:05 +0530 IST results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/records/04e2fbf2-8653-405f-bc42-a262bcf02bed tekton.dev/v1.PipelineRun 2023-06-29 02:49:53 +0530 IST 2023-06-29 02:50:05 +0530 IST results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/records/e6eea2f9-ec80-388c-9982-74a018a548e4 results.tekton.dev/v1alpha2.Log 2023-06-29 02:50:05 +0530 IST 2023-06-29 02:50:05 +0530 IST
次のコマンドを入力して、レコードからパイプライン実行またはタスク実行の YAML マニフェストを取得します。
$ opc results records get --addr ${RESULTS_API} <record_name> \ | jq -r .data.value | base64 -d | \ xargs -0 python3 -c 'import sys, yaml, json; j=json.loads(sys.argv[1]); print(yaml.safe_dump(j))'
コマンドの例
$ opc results records get --addr ${RESULTS_API} \ results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/records/e9c736db-5665-441f-922f-7c1d65c9d621 | \ jq -r .data.value | base64 -d | \ xargs -0 python3 -c 'import sys, yaml, json; j=json.loads(sys.argv[1]); print(yaml.safe_dump(j))'
オプション: ログレコード名を使用して、レコードから実行されたタスクのログ情報を取得します。ログレコード名を取得するには、レコード名の
records
は、logs
に置き換えます。以下のコマンドを実行します。$ opc results logs get --addr ${RESULTS_API} <log_record_name> | jq -r .data | base64 -d
コマンドの例
$ opc results logs get --addr ${RESULTS_API} \ results-testing/results/04e2fbf2-8653-405f-bc42-a262bcf02bed/logs/e9c736db-5665-441f-922f-7c1d65c9d621 | \ jq -r .data | base64 -d
1.3.3. 結果の検索
Common Expression Language (CEL) クエリーを使用して結果を検索できます。たとえば、成功しなかったパイプライン実行の結果を見つけることができます。ただし、関連情報のほとんどは結果オブジェクトには含まれていません。名前、完了時間、その他のデータで検索するには、レコードを検索します。
前提条件
-
opc
ユーティリティーをインストールし、Tekton Results をクエリーするための環境を準備している。
手順
次のコマンドを入力して、CEL クエリーを使用して結果を検索します。
$ opc results list --addr ${RESULTS_API} --filter="<cel_query>" <namespace-name>
<namespace_name>
は、パイプラインの実行またはタスクの実行が作成された namespace に置き換えます。
目的 | CEL クエリー |
---|---|
失敗したすべての実行の結果 |
|
アノテーション |
|
1.3.4. レコードの検索
Common Expression Language (CEL) クエリーを使用してレコードを検索できます。各レコードにはパイプライン実行またはタスク実行に関する完全な YAML 情報が含まれるため、さまざまな基準でレコードを検索できます。
前提条件
-
opc
ユーティリティーをインストールし、Tekton Results をクエリーするための環境を準備している。
手順
次のコマンドを入力して、CEL クエリーを使用してレコードを検索します。
$ opc results records list --addr ${RESULTS_API} --filter="<cel_query>" <namespace_name>/result/-
<namespace_name>
は、パイプラインの実行またはタスクの実行が作成された namespace に置き換えます。または、次のコマンドを入力して、単一の結果内のレコードを検索します。$ opc results records list --addr ${RESULTS_API} --filter="<cel_query>" <result_name>
<result_name>
は、結果の完全名に置き換えます。
目的 | CEL クエリー |
---|---|
失敗したすべてのタスク実行またはパイプライン実行のレコード |
|
|
|
|
|
|
|
|
|
|
|
完了までに 5 分以上かかったすべてのパイプライン実行のレコード |
|
2023 年 10 月 7 日に完了したすべてのパイプライン実行とタスク実行のレコード |
|
3 つ以上のタスクを含むすべてのパイプライン実行のレコード |
|
|
|
|
|
1.3.5. 検索結果の参考情報
結果の共通表現言語 (CEL) クエリーでは次のフィールドを使用できます。
CEL フィールド | 説明 |
---|---|
|
|
| 結果の一意識別子。 |
|
|
| 結果の概要。 |
| 結果の作成時間。 |
| 結果の最終更新時刻。 |
summary.status
フィールドを使用して、パイプラインの実行が成功したかどうかを判断できます。このフィールドには次の値を指定できます。
-
UNKNOWN
-
SUCCESS
-
FAILURE
-
TIMEOUT
-
CANCELLED
このフィールドの値を指定する場合は、"
や '
などの引用符を使用しないでください。
1.3.6. レコード検索の参考情報
レコードの Common Expression Language (CEL) クエリーでは次のフィールドを使用できます。
CEL フィールド | 説明 | 値 |
---|---|---|
| レコード名 | |
| レコードタイプ識別子 |
|
| タスク実行またはパイプライン実行の YAML データ。ログレコードでは、このフィールドにはログ出力が含まれます。 |
data
フィールドにはタスク実行またはパイプライン実行の YAML データ全体が含まれるため、このデータのすべての要素を CEL クエリーで使用できます。たとえば、data.status.completionTime
には、タスク実行またはパイプライン実行の完了時間が含まれます。