[[407261]] 以前は、TaskRun または PipelineRun オブジェクトを作成してタスクをトリガーしていました。しかし、実際の作業では、開発者はコードを送信した後にタスクをトリガーすることがよくあります。このとき、Tekton のトリガーの概念が必要になります。 Tekton トリガーワークフロー Triggers は、次の CRD オブジェクトを通じて Tekton を拡張します。 - TriggerTemplate: PipelineResource や PipelineRun などのリソースを作成するためのテンプレート
- TriggerBinding: イベントをチェックし、関連するフィールド属性を抽出します
- ClusterTriggerBinding: TriggerBindingに似ていますが、グローバルです
- インターセプター: カスタム検証またはフィルタリングのイベントを処理する
- EventListener: TriggerBinding と TriggerTemplate をイベント レシーバーに接続し、各 TriggerBinding から抽出されたパラメーターを使用して TriggerTemplate で指定されたリソースを作成し、インターセプター フィールドを通じてイベント属性を前処理する外部サービスも指定します。
Tekton Triggers を使用するには、対応するコントローラーもインストールする必要があります。これは、次のコマンドに示すように、tektoncd/triggers の GitHub リポジトリの指示に従って直接インストールできます (バージョン v0.14.2 では、2 つのリソース リストをインストールする必要があることに注意してください)。 - kubectl apply
- kubectl apply -f https://storage.googleapis.com/tekton-releases/triggers/previous/v0.14.2/interceptors.yaml
次のコマンドを使用すると、トリガーの関連コンポーネントがすべて実行状態になるまでのインストール ステータスを表示できます。 - $ kubectl ポッドを取得します
- 名前準備完了 ステータス 再起動 年齢
- tekton-dashboard-6fcbd956f4-vvlrz 1/1 実行中 4 15d
- tekton-pipelines-controller-795dd94d96-lkbxt 1/1 実行中 5 17d
- tekton-pipelines-webhook-6b8964445d-mp4k6 1/1 実行中 5 17d
- tekton-triggers-controller-989875ff7-tlc4v 1/1 実行中 0 3h16m
- tekton-triggers-core-interceptors-6494c8cfc4-hb8sk 1/1 実行中 0 2分10秒
- tekton-triggers-webhook-787849d8db-ch28w 1/1 実行中 0 3時間16分
ここで、以前の Jenkins Pipeline パイプラインを変換して、ビルドに Tekton を使用するようにします。コードは、http://git.k8s.local/course/devops-demo.git にあるプライベート リポジトリ GitLab にプッシュされています。 まず、トリガーの設定を完了する必要があります。ソースコードを GitLab に送信するときは、Tekton タスクの実行をトリガーする必要があるため、まずこのトリガーを完了する必要があります。これは、EventListener リソース オブジェクトを通じて実行できます。 gitlab-listener という名前の EventListener リソース オブジェクトを作成します。ファイルの内容は次のとおりです。 - # gitlab-push-listener.yaml
- apiバージョン: triggers.tekton.dev/v1alpha1
- 種類: イベントリスナー
- メタデータ:
- name : gitlab-listener # このイベントリスナーはel-gitlab-listenerという名前のサービスオブジェクトを作成します
- 仕様:
- サービスアカウント名: tekton-triggers-gitlab-sa
- トリガー:
- -名前: gitlab-push-events-トリガー
- 迎撃機:
- - 参照:
- 名前: gitlab
- パラメータ:
- - name : secretRef # gitlab-secret の Secret オブジェクト内の secretToken の値を参照します
- 価値:
- シークレット名: gitlab-secret
- シークレットキー: シークレットトークン
- -名前: イベントタイプ
- 価値:
- - プッシュフック # GitLab プッシュイベントのみを受信する
- バインディング:
- - 参照: devops-demo-binding
- テンプレート:
- 参照: devops-デモテンプレート
EventListener が作成されると、イベント応答を受信するために公開されるリスナー サービスが生成されます。たとえば、上記で作成したオブジェクトの名前は gitlab-listener です。作成後、el-gitlab-listener という名前の Service オブジェクトが生成されます。 GitLab 自体はクラスター内にあるため、Service の DNS 形式を使用して EventListener にアクセスできます。クラスターの外部に公開する場合は、NodePort または Ingress を使用できます。 注目すべきもう 1 つの点は、組み込みの GitLab インターセプターを持つ上記の EventListener オブジェクトに interceptors プロパティを追加したことです。 GitLab インターセプターには、GitLab からのリクエストを検証およびフィルタリングするためのロジックが含まれています。たとえば、Secret オブジェクトを通じて導入できる WebHook の Secret Token を設定できます。 - 迎撃機:
- - 参照:
- 名前: gitlab
- パラメータ:
- - name : secretRef # gitlab-secret の Secret オブジェクト内の secretToken の値を参照します
- 価値:
- シークレット名: gitlab-secret
- シークレットキー: シークレットトークン
- -名前: イベントタイプ
- 価値:
- - プッシュフック # GitLab プッシュイベントのみを受信する
対応する Secret リソース オブジェクトは次のとおりです。1 つは WebHook の Secret Token 用で、もう 1 つは GitLab ログイン認証用です。 - # gitlab-secret.yaml
- APIバージョン: v1
- 種類: 秘密
- メタデータ:
- 名前: gitlab-secret
- タイプ: 不透明
- 文字列データ:
- シークレットトークン: '1234567'
-
- APIバージョン: v1
- 種類: 秘密
- メタデータ:
- 名前: gitlab-auth
- 注釈:
- tekton.dev/git-0: http : //git.k8s.local
- タイプ: kubernetes.io/basic-auth
- 文字列データ:
- ユーザー名: root
- パスワード: admin321
EventListener オブジェクトは他のリソース オブジェクトにアクセスする必要があるため、RBAC は次のように宣言する必要があります。 - # イベントリスナー rbac.yaml
- APIバージョン: v1
- 種類: サービスアカウント
- メタデータ:
- 名前: tekton-triggers-gitlab-sa
- 秘密:
- -名前: gitlab-secret
- -名前: gitlab-auth
- -名前: harbor-auth
-
- apiバージョン: rbac。認証.k8s.io/v1
- 種類: 役割
- メタデータ:
- 名前: tekton-triggers-gitlab-minimal
- ルール:
- #イベントリスナーは フェッチ すべての名前空間リソース
- - apiグループ: [ 'triggers.tekton.dev' ]
- リソース:
- [ 'eventlisteners' 、 'triggerbindings' 、 'triggertemplates' 、 'triggers' ]
- 動詞: [ 'get' 、 'list' 、 'watch' ]
- -apiグループ: [ '' ]
- #ログ設定を更新するにはconfigmapsが必要です
- リソース: [ 'configmaps' ]
- 動詞: [ 'get' 、 'list' 、 'watch' ]
- #権限 関連するトリガーテンプレートにリソースを作成する
- - apiグループ: [ 'tekton.dev' ]
- リソース: [ 'pipelineruns' 、 'pipelineresources' 、 'taskruns' ]
- 動詞: [ '作成する' ]
- -apiグループ: [ '' ]
- リソース: [ 'serviceaccounts' ]
- 動詞: [ 'なりすます' ]
- -apiGroups: [ 'ポリシー' ]
- リソース: [ 'podsecuritypolicies' ]
- resourceNames: [ 'tekton-triggers' ]
- 動詞: [ '使用する' ]
-
- apiバージョン: rbac。認証.k8s.io/v1
- 種類: RoleBinding
- メタデータ:
- 名前: tekton-triggers-gitlab-binding
- 科目:
- - 種類: サービスアカウント
- 名前: tekton-triggers-gitlab-sa
- ロールリファレンス:
- apiGroup : rbac.authorization.k8s.io
- 種類: 役割
- 名前: tekton-triggers-gitlab-minimal
-
- 種類: ClusterRole
- apiバージョン: rbac。認証.k8s.io/v1
- メタデータ:
- 名前: tekton-triggers-gitlab-clusterrole
- ルール:
- #イベントリスナーは フェッチ 任意のクラスタートリガーバインディング
- - apiグループ: [ 'triggers.tekton.dev' ]
- リソース: [ 'clustertriggerbindings' 、 'clusterinterceptors' ]
- 動詞: [ 'get' 、 'list' 、 'watch' ]
-
- apiバージョン: rbac。認証.k8s.io/v1
- 種類: ClusterRoleBinding
- メタデータ:
- 名前: tekton-triggers-gitlab-clusterbinding
- 科目:
- - 種類: サービスアカウント
- 名前: tekton-triggers-gitlab-sa
- 名前空間:デフォルト
- ロールリファレンス:
- apiGroup : rbac.authorization.k8s.io
- 種類: ClusterRole
- 名前: tekton-triggers-gitlab-clusterrole
次に最も重要なのは、TriggerBinding オブジェクトと TriggerTemplate オブジェクトです。上記の EventListener オブジェクトでは、2 つのオブジェクトを結合します。 - バインディング:
- - ref: gitlab-push-binding # TriggerBinding オブジェクト
- テンプレート:
- ref: gitlab-echo-template # TriggerTemplate オブジェクト
これにより、TriggerBinding 内のパラメータをテンプレート用の TriggerTemplate オブジェクトに渡すことができます。たとえば、ここでは TriggerBinding オブジェクトを以下のように定義します。 - apiバージョン: triggers.tekton.dev/v1alpha1
- 種類: トリガーバインディング
- メタデータ:
- 名前: devops-demo-binding
- 仕様:
- パラメータ:
- -名前: gitrevision
- 値: $(body.checkout_sha)
- -名前: gitリポジトリURL
- 値: $(body.repository.git_http_url)
GitLab WebHook から送信されたデータ値を $() で囲まれた JSONPath 式を通じて読み取ることで、パラメータ値を抽出することに注意してください。式の詳しい使用方法については、公式ドキュメントを参照してください。どのようなパラメータ値を抽出できるかについては、WebHookの説明を参照してください。たとえば、ここでは GitLab Webhook の Push Hook であり、対応するリクエスト本体のデータは次のようになります。 - {
- "object_kind" : "プッシュ" 、
- 「以前」 : 「95790bf891e76fee5e1747ab589903a6a1f80f22」 、
- 「後」 : 「da1560886d4f094c3e6c9ef40349f7d38b5d27d7」 、
- 「ref」 : 「refs/heads/master」 、
- "チェックアウト_sha" : "da1560886d4f094c3e6c9ef40349f7d38b5d27d7" 、
- "ユーザーID" : 4,
- 「ユーザー名」 : 「ジョン・スミス」 、
- "user_username" : "jsmith" 、
- "user_email" : "[email protected]" 、
- 「ユーザーアバター」 : 「https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80」 、
- "プロジェクトID" : 15,
- "プロジェクト" : {
- 「id」 : 15,
- 「名前」 : 「ディアスポラ」 、
- "説明" : "" 、
- 「web_url」 : 「http://example.com/mike/diaspora」 、
- "アバターURL" : null ,
- "git_ssh_url" : "[email protected]:mike/diaspora.git" 、
- "git_http_url" : "http://example.com/mike/diaspora.git" 、
- 「名前空間」 : 「マイク」 、
- "可視性レベル" :0,
- "path_with_namespace" : "mike/diaspora" 、
- "default_branch" : "マスター" 、
- 「ホームページ」 : 「http://example.com/mike/diaspora」 、
- 「url」 : 「[email protected]:mike/diaspora.git」 、
- "ssh_url" : "[email protected]:mike/diaspora.git" 、
- "http_url" : "http://example.com/mike/diaspora.git"
- },
- 「リポジトリ」 : {
- 「名前」 : 「ディアスポラ」 、
- 「url」 : 「[email protected]:mike/diaspora.git」 、
- "説明" : "" 、
- 「ホームページ」 : 「http://example.com/mike/diaspora」 、
- "git_http_url" : "http://example.com/mike/diaspora.git" 、
- "git_ssh_url" : "[email protected]:mike/diaspora.git" 、
- 「可視性レベル」 :0
- },
- 「コミット」 : [
- {
- 「id」 : 「b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327」 、
- "メッセージ" : "カタロニア語の翻訳を e38cb41 に更新しました。\n\n詳細については、https://gitlab.com/gitlab-org/gitlab を参照してください" ,
- "title" : "カタロニア語の翻訳を e38cb41 に更新します。" 、
- 「タイムスタンプ」 : 「2011-12-12T14:27:31+02:00」 、
- 「URL」 : 「http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327」 、
- "著者" : {
- 「名前」 : 「ジョルディ・マラック」 、
- 「メール」 : 「[email protected]」
- },
- 「追加」 : [ 「変更履歴」 ],
- "変更済み" : [ "app/controller/application.rb" ],
- 「削除」 : []
- },
- {
- 「id」 : 「da1560886d4f094c3e6c9ef40349f7d38b5d27d7」 、
- 「メッセージ」 : 「readme を修正しました」 、
- 「タイトル」 : 「readme を修正しました」 、
- 「タイムスタンプ」 : 「2012-01-03T23:36:29+02:00」 、
- 「URL」 : 「http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7」 、
- "著者" : {
- "name" : "GitLab 開発ユーザー" ,
- 「メール」 : 「gitlabdev@dv6700.(なし)」
- },
- 「追加」 : [ 「変更履歴」 ],
- "変更済み" : [ "app/controller/application.rb" ],
- 「削除」 : []
- }
- ]、
- 「合計コミット数」 : 4
- }
リクエスト本文内の任意の属性は、TriggerBinding のパラメータとして抽出できます。その他のフック イベントの場合、対応するリクエスト ボディ構造は GitLab ドキュメントで確認できます。 このようにして、上記の TriggerBinding で定義されたパラメータ値を TriggerTemplate オブジェクトのパラメータを通じて読み取ることができます。以下に示すように TriggerTemplate オブジェクトを定義し、TaskRun テンプレートを宣言し、非常に単純な Task タスクを定義します。コンテナ内のコードのディレクトリ構造を印刷するだけです。 - apiバージョン: triggers.tekton.dev/v1alpha1
- 種類: トリガーテンプレート
- メタデータ:
- 名前: devops-demo-template
- 仕様:
- params: #TriggerBinding と一致するパラメータを定義します
- -名前: gitrevision
- -名前: gitリポジトリURL
- resourcetemplates: #リソーステンプレートを定義する
- - apiバージョン: tekton.dev/v1beta1
- kind: TaskRun # TaskRunテンプレートを定義する
- メタデータ:
- generateName: gitlab-run- # TaskRun 名のプレフィックス
- 仕様:
- サービスアカウント名: tekton-triggers-gitlab-sa
- taskSpec: #Task タスク宣言
- リソース:
- inputs: #sourceという名前のgit入力リソースを定義します
- -名前: ソース
- タイプ: git
- 手順:
- -名前: パスを表示
- image: ubuntu # 実行ステップを定義し、コードディレクトリ構造を一覧表示します
- スクリプト: |
- #!/bin/bash
- ls -la $(リソース.入力.ソース.パス)
- リソース: #特定の入力リソースパラメータを宣言する
- 入力:
- - name : source # タスク内のリソースと同じ名前を維持します
- resourceSpec: # リソース宣言
- タイプ: git
- パラメータ:
- -名前: リビジョン
- 値: $(tt.params.gitrevision) # パラメータ値を読み取る
- -名前: URL
- 値: $(tt.params.gitrepositoryurl)
最終的なパイプラインリソース内のパラメータ値を参照するときには、tt プレフィックスが使用されることに注意してください。定義が完了したら、上記のリソース オブジェクトを直接作成します。作成が完了すると、EventListener Pod および Service オブジェクトが自動的に生成されます。
- $ kubectl get svc -leventlistener=gitlab-listener
- 名前タイプ クラスター IP 外部 IP ポート 年齢
- el-gitlab-listener ClusterIP 10.108.146.82 <なし> 8080/TCP 7分56秒
- $ kubectl get pod -leventlistener=gitlab-listener
- 名前準備完了 ステータス 再起動 年齢
- el-gitlab-listener-6b84cc6d8f-ppfhp 1/1 実行中 0 7分9秒
- $ kubectl イベントリスナーを取得する
- 名前住所 利用可能理由 準備完了理由
- gitlab-listener http://el-gitlab-listener.デフォルトは.svc.cluster です。ローカル:8080 False MinimumReplicasUnavailable False
次に、GitLab プロジェクトで WebHook を設定します。上記の Secret オブジェクトで宣言した Secret Token を設定する必要があることに注意してください。 シークレットトークン 作成が完了したら、WebHook の Push イベントをテストできます。 「テスト」をクリックするだけです (カスタム ドメイン名を使用する場合は、coredns でマッピングを追加する必要があります)。通常は、「フックが正常に実行されました: HTTP 202」というプロンプト メッセージが返されます。この時点で、Kubernetes クラスターに次のタスク Pod が表示されます。 - $ kubectl get pods -l triggers.tekton.dev/eventlistener=gitlab-listener
- 名前準備完了 ステータス 再起動 年齢
- gitlab-run-lnqzv-pod-lp8lw 0/2 完了 0 3分18秒
- $ kubectl get taskrun -l triggers.tekton.dev/eventlistener=gitlab-listener
- 名前成功 理由 開始時間 完了時間
- gitlab-run-lnqzv成功3分11秒 2分48秒
- $ tkn タスクラン ログ gitlab-run-lnqzv
- [git-source-source-hfrw6] { "level" : "info" , "ts" :1624446684.0399015, "caller" : "git/git.go:169" , "msg" : "http://git.k8s.local/course/devops-demo.git @ 581b1986b6c038ca98a362e6a0b8e9acb55893e8 (grafted、HEAD) をパス /workspace/source に正常にクローンしました" }
- [git-source-source-hfrw6] { "level" : "info" , "ts" :1624446684.0660462, "caller" : "git/git.go:207" , "msg" : "パス /workspace/source のサブモジュールが正常に初期化され、更新されました" }
-
- [show-path] 合計 36
- [show-path] drwxr-xr-x 4 root root 163 6月23日 11:11 .
- [show-path] drwxrwxrwx 3 root root 20 6月 23 11:11 ..
- [show-path] -rw-r
- [show-path] drwxr-xr-x 8 root root 177 6月23日 11:11 .git
- [show-path] -rw-r
- [show-path] -rw-r
- [show-path] -rw-r
- [show-path] -rw-r
- [show-path] -rw-r
- [show-path] -rw-r
- [show-path] drwxr-xr-x 3 root root 101 6月23日 11:11 helm
- [show-path] -rw-r
この時点で、GitLab の Push イベントを通じて Tekton をトリガーするタスクは完了しました。 GitLab プッシュイベント 次に、Tekton を使用してアプリケーションを Kubernetes クラスターに自動的にデプロイします。 |