以前は、アプリケーションの CI/CD プロセスを完了するために Tekton を使用していましたが、CD は Tekton タスク内で完了していました。ここで、GitOps アプローチを使用してパイプラインを変換し、Argo CD を使用して CD 部分を完了します。 ここで、前回の Tekton 実践部分の内容を復習する必要があります。パイプライン全体には、クローン、テスト、ビルド、Docker、デプロイ、ロールバックなどのタスクが含まれます。最終的なデプロイとロールバックは CD 部分に属します。この部分を構築するには、Argo CD を使用するだけです。 まず、プロジェクトの http://git.k8s.local/course/devops-demo.git リポジトリから Helm Chart テンプレートを抽出し、Argo CD とのドッキングに便利な別のリポジトリ http://git.k8s.local/course/devops-demo-deploy に配置します。プロジェクト全体には、アプリケーション展開用の Helm Chart テンプレートのみが含まれます。 まず、Argo CD にリポジトリを追加します。 次に、新しいアプリケーションを作成します。まず、プロジェクトを作成します。 Argo CD には、アプリケーションの論理グループを表す AppProject CRD があります。次の主要なプロパティで構成されます。 - sourceRepos: プロジェクト内のアプリケーションがマニフェストを取得できるリポジトリ参照
- 宛先: プロジェクト内のアプリケーションをデプロイできるクラスターと名前空間
- ロール: プロジェクト内のリソースアクセス用に定義されたロール
- apiバージョン: argoproj.io/v1alpha1
- 種類: AppProject
- メタデータ:
- # プロジェクト名
- 名前: デモ
- 名前空間: argocd
- 仕様:
- # ターゲット
- 目的地:
- # このプロジェクト内のサービスがデプロイできる名前空間。ここにすべての名前空間があります。
- - 名前空間: '*'
- # このプロジェクトでは、クラスターの展開が可能です。これは、Argo CDによって現在展開されているデフォルトのクラスターです。
- サーバー: https: //kubernetes.default.svc
- # 許可されたデータソース
- ソースリポジトリ:
- - http://git.k8s.ローカル/course/devops-demo-deploy.git
詳細な構成情報については、ドキュメント https://argo-cd.readthedocs.io/en/stable/operator-manual/declarative-setup/ を参照してください。プロジェクトが作成されたら、環境にデプロイされたアプリケーション インスタンスを表すアプリケーションをプロジェクトの下に作成します。 - apiバージョン: argoproj.io/v1alpha1
- 種類: アプリケーション
- メタデータ:
- 名前: devops-demo
- 名前空間: argocd
- 仕様:
- 行き先:
- 名前空間:デフォルト
- サーバー: 'https://kubernetes.default.svc'
- プロジェクト: デモ
- ソース:
- path: helm # Helmリポジトリからアプリケーションを作成する場合、チャートはパスを指定する必要があります
- リポジトリ URL: 'http://git.k8s.local/course/devops-demo-deploy.git'
- ターゲットリビジョン: HEAD
- 舵:
- パラメータ:
- -名前: レプリカ数
- 値: '2'
- 値ファイル:
- - 私の- values.yaml
ここでは、devops-demo という名前のアプリケーションを定義します。アプリケーション ソースは helm パスから取得され、my-values.yaml ファイルを使用します。さらに、source.helm.parameters を通じてパラメータを構成することもできます。私たちは依然として手動同期戦略を使用することを選択します。 Tekton タスクで同期を手動でトリガーできます。上記のリソース オブジェクトが作成された後、アプリケーションはクラスターにデプロイされていないため、OutOfSync 状態になります。 ここで、以前の Tekton パイプラインを変更してみましょう。以前の Pipeline パイプラインは次のとおりです。 - # パイプライン.yaml
- apiバージョン: tekton.dev/v1beta1
- 種類: パイプライン
- メタデータ:
- 名前: パイプライン
- 仕様:
- ワークスペース: # ワークスペースを宣言する
- -名前: go-repo-pvc
- パラメータ:
- # コードリポジトリを定義する
- -名前: git_url
- -名前: リビジョン
- タイプ: 文字列
- デフォルト: "master"
- # 画像パラメータを定義する
- -名前:画像
- -名前: レジストリURL
- タイプ: 文字列
- デフォルト: "harbor.k8s.local"
- -名前: registry_mirror
- タイプ: 文字列
- デフォルト: "https://ot2k4d59.mirror.aliyuncs.com/"
- # Helmチャートパラメータを定義する
- -名前:charts_dir
- -名前:リリース名
- -名前: リリース名前空間
- デフォルト: "デフォルト"
- -名前: 上書き値
- デフォルト: ""
- -名前: values_file
- デフォルト: "values.yaml"
- タスク: #パイプラインにタスクを追加する
- -名前:クローン
- タスク参照:
- 名前: git-clone
- ワークスペース:
- -名前:出力
- ワークスペース: go-repo-pvc
- パラメータ:
- -名前: URL
- 値: $(params.git_url)
- -名前: リビジョン
- 値: $(params.revision)
- -名前: テスト
- タスク参照:
- 名前: テスト
- - name : build # バイナリプログラムをコンパイルする
- タスク参照:
- 名前: ビルド
- runAfter: # テストタスクの実行後にビルドタスクを実行する
- - テスト
- - クローン
- ワークスペース: # ワークスペースを渡す
- -名前: go-repo
- ワークスペース: go-repo-pvc
- - name : docker # Dockerイメージをビルドしてプッシュする
- タスク参照:
- 名前: docker
- 実行後:
- - 建てる
- ワークスペース: # ワークスペースを渡す
- -名前: go-repo
- ワークスペース: go-repo-pvc
- params: # パラメータを渡す
- -名前:画像
- 値: $(params.image)
- -名前: レジストリURL
- 値: $(params.registry_url)
- -名前: registry_mirror
- 値: $(params.registry_mirror)
- - name : deploy # アプリケーションをデプロイする
- タスク参照:
- 名前: デプロイ
- 実行後:
- - ドッカー
- ワークスペース:
- -名前: ソース
- ワークスペース: go-repo-pvc
- パラメータ:
- -名前: charts_dir
- 値: $(params.charts_dir)
- -名前:リリース名
- 値: $(params.release_name)
- -名前: リリース名前空間
- 値: $(params.release_namespace)
- -名前: 上書き値
- 値: $(params.overwrite_values)
- -名前: values_file
- 値: $(params.values_file)
- -名前:ロールバック# ロールバック
- タスク参照:
- 名前:ロールバック
- いつ:
- - 入力: "$(tasks.deploy.results.helm-status)"
- 演算子: in
- 値: [ "失敗" ]
- パラメータ:
- -名前:リリース名
- 値: $(params.release_name)
- -名前: リリース名前空間
- 値: $(params.release_namespace)
ここで、最後の 2 つのタスク (デプロイとロールバック) を削除する必要があります。 Docker イメージがビルドされてプッシュされたら、デプロイメント コード リポジトリ内の values ファイルを変更し、Argo CD 同期ステータスを手動でトリガーするだけです (自動同期が有効になっている場合は、この手順は省略できます)。ロールバック操作は、別のタスクを定義せずに Argo CD で直接実行できます。 以下のように Taks タスクを定義します。 - apiバージョン: tekton.dev/v1alpha1
- 種類: タスク
- メタデータ:
- 名前: 同期
- 仕様:
- ボリューム:
- -名前: argocd-secret
- 秘密:
- シークレット名: $(inputs.params.argocd_secret)
- パラメータ:
- -名前: argocd_url
- 説明: 「ArgoCD サーバーの URL」
- -名前: argocd_secret
- 説明: 「Tekton タスクが argo に接続するためのユーザー名とパスワードを含むシークレット」
- -名前:コミットID
- 説明: 「更新するコミット ID」
- -名前: アプリ名
- 説明: 「更新する argo アプリの名前」
- -名前: app_revision
- デフォルト: "HEAD"
- 説明: 「アップデートする argo アプリのリビジョン」
- 手順:
- -名前: デプロイ
- 画像: argoproj/argocd
- ボリュームマウント:
- -名前: argocd-secret
- マウントパス: /var/secret
- 指示:
- -sh
- 引数:
- - -ce
- - |
- セット-e
- echo "コミットIDを更新"
- argocd ログイン
- argocd アプリ同期 $(params.app_name)
- argocd アプリは $(params.app_name) を待機します
Helm Chart の Values ファイル内の image.tag パラメータを変更するだけでよいので、もちろん、タスク内の values.yaml ファイルを変更し、それを Repo リポジトリにコミットするのが最善の方法です。もちろん、簡単にするために、Argo CD のアプリケーション側でパラメータを直接構成することもできます。たとえば、argocd app set コマンドを使用してアプリケーションのパラメータを設定し、argocd app sync コマンドを使用して同期操作を手動でトリガーできます。実際にはここには多くの操作があります。たとえば、特定の条件に基づいてデプロイメントが必要かどうかを判断し、条件が満たされたときに同期操作を実行できます。最後に、wait コマンドを使用して、アプリケーションのデプロイが完了するまで待機します。 argocd アプリ セットを介してパラメータを手動で構成することに加えて、Repo リポジトリ内の値を直接変更する方がよい場合があります。このようにして、ソース コード リポジトリにバージョン レコードが存在します。値を変更するには、以下に示すようにタスクを作成します。 - apiバージョン: tekton.dev/v1beta1
- 種類: タスク
- メタデータ:
- 名前: 変更マニフェスト
- 仕様:
- パラメータ:
- -名前: git_url
- 説明: マニフェストファイルを含むGitリポジトリ アップデート
- -名前: git_email
- デフォルト: [email protected]
- -名前: git_name
- デフォルト: Tekton パイプライン
- -名前: git_manifest_dir
- 説明: マニフェストファイルディレクトリ
- -名前: ツールイメージ
- デフォルト: cnych/helm-kubectl-curl-git-jq-yq
- -名前:画像タグ
- 説明: Dockerイメージタグをデプロイする
- 手順:
- -名前: git-push
- 画像: $(params.tool_image)
- 環境:
- -名前: GIT_USERNAME
- 値:
- シークレットキーリファレンス:
- 名前: gitlab-auth
- キー: ユーザー名
- オプション: true
- -名前: GIT_PASSWORD
- 値:
- シークレットキーリファレンス:
- 名前: gitlab-auth
- キー:パスワード
- オプション: true
- コマンド: [ "/bin/bash" ]
- 引数:
- - -c
- - |
- セット-eu
- echo前のステップから環境変数をロードする
- ソース /workspace/env-config
- git config
- git config
- git clone
- cd "リポジトリ/$(params.git_manifest_dir)"
- ls -l
- 古い値をエコーします:
- cat my- values .yaml | yq r - '画像タグ'
- 新しい値に置き換えてエコーします:
- $(params.image_tag) をエコーします
- yq w
- 新しい値を検証するエコー
- yq r my- values .yaml 'image.tag'
- !git diff-インデックスの場合
- git ステータス
- gitを追加します。
- git commit -m "change-manifests タスクで Tekton パイプラインによって更新された helm 値"
- gitプッシュ
- それ以外
- echo "変更なし、git リポジトリは最新です"
- フィ
これで、パイプラインは次のリストになります。 - # パイプライン.yaml
- apiバージョン: tekton.dev/v1beta1
- 種類: パイプライン
- メタデータ:
- 名前: パイプライン
- 仕様:
- ワークスペース: # ワークスペースを宣言する
- -名前: go-repo-pvc
- パラメータ:
- # コードリポジトリを定義する
- -名前: git_url
- -名前: git_infra_url
- -名前: リビジョン
- タイプ: 文字列
- デフォルト: "master"
- # 画像パラメータを定義する
- -名前:画像
- -名前:画像タグ
- -名前: レジストリURL
- タイプ: 文字列
- デフォルト: "harbor.k8s.local"
- -名前: registry_mirror
- タイプ: 文字列
- デフォルト: "https://ot2k4d59.mirror.aliyuncs.com/"
- -名前: git_manifest_dir
- デフォルト: "helm"
- # argocdパラメータを定義する
- -名前: argocd_url
- -名前: argocd_secret
- -名前: アプリ名
- -名前: app_revision
- タイプ: 文字列
- デフォルト: "HEAD"
- タスク: #パイプラインにタスクを追加する
- -名前:クローン
- タスク参照:
- 名前: git-clone
- ワークスペース:
- -名前:出力
- ワークスペース: go-repo-pvc
- パラメータ:
- -名前: URL
- 値: $(params.git_url)
- -名前: リビジョン
- 値: $(params.revision)
- -名前: テスト
- タスク参照:
- 名前: テスト
- - name : build # バイナリプログラムをコンパイルする
- タスク参照:
- 名前: ビルド
- runAfter: # テストタスクの実行後にビルドタスクを実行する
- - テスト
- - クローン
- ワークスペース: # ワークスペースを渡す
- -名前: go-repo
- ワークスペース: go-repo-pvc
- - name : docker # Dockerイメージをビルドしてプッシュする
- タスク参照:
- 名前: docker
- 実行後:
- - 建てる
- ワークスペース: # ワークスペースを渡す
- -名前: go-repo
- ワークスペース: go-repo-pvc
- params: # パラメータを渡す
- -名前:画像
- 値: $(params.image):$(params.image_tag)
- -名前: レジストリURL
- 値: $(params.registry_url)
- -名前: registry_mirror
- 値: $(params.registry_mirror)
- -名前: マニフェスト
- タスク参照:
- 名前: 変更マニフェスト
- 実行後:
- - ドッカー
- パラメータ:
- -名前: git_url
- 値: $(params.git_infra_url)
- -名前: git_manifest_dir
- 値: $(params.git_manifest_dir)
- -名前:画像タグ
- 値: $(params.image_tag)
- -名前: 同期
- タスク参照:
- 名前: 同期
- 実行後:
- - 顕現する
- パラメータ:
- -名前: argocd_url
- 値: $(params.argocd_url)
- -名前: argocd_secret
- 値: $(params.argocd_secret)
- -名前: アプリ名
- 値: $(params.app_name)
- -名前: app_revision
- 値: $(params.app_revision)
最後に、Argo CD ログイン用の Secret オブジェクトを作成します。 - APIバージョン: v1
- 種類: 秘密
- メタデータ:
- 名前: argocd-auth
- タイプ: 不透明
- 文字列データ:
- ユーザー名: admin
- パスワード: admin321
最後に、Tekton Triggers のテンプレートを次のように変更します。 - # gitlab-テンプレート.yaml
- apiバージョン: triggers.tekton.dev/v1alpha1
- 種類: トリガーテンプレート
- メタデータ:
- 名前: gitlab-template
- 仕様:
- params: #TriggerBinding と一致するパラメータを定義します
- -名前: gitrevision
- -名前: gitリポジトリURL
- resourcetemplates: #リソーステンプレートを定義する
- - apiバージョン: tekton.dev/v1beta1
- kind: PipelineRun # パイプラインテンプレートを定義する
- メタデータ:
- generateName: gitlab-run- # TaskRun 名のプレフィックス
- 仕様:
- サービスアカウント名: tekton-build-sa
- パイプライン参照:
- 名前: パイプライン
- ワークスペース:
- -名前: go-repo-pvc
- 永続ボリュームクレーム:
- クレーム名: go-repo-pvc
- パラメータ:
- -名前: git_url
- 値: $(tt.params.gitrepositoryurl)
- -名前: git_infra_url
- 値: git.k8s。ローカル/course/devops-demo-deploy.git
- -名前:画像
- 値: "harbor.k8s.local/course/devops-demo"
- -名前:画像タグ
- 値: "$(tt.params.gitrevision)"
- -名前: argocd_url
- 値: argocd.k8s.local
- -名前: argocd_secret
- 値: argocd-auth
- -名前: アプリ名
- 値: devops-demo
今ではパイプライン全体がさらに合理化されました。これで、アプリケーション リポジトリ内のソース コードを変更して送信することで、パイプラインをトリガーできるようになりました。 コードを送信すると、パイプライン ビルド全体が最後の同期タスクで停止することがわかります。これは、アプリケーションが正常になるまで待機してから終了する必要がある argocd app wait $(params.app_name) --health コマンドを実行したためです。 - $ curl devops- demo.k8s.localを実行します。
- { "msg" : "GitLab 上の Hello Tekton + ArgoCD" }
しかし実際には、アプリケーションは正常にデプロイされましたが、Argo CD のヘルスチェックは合格しませんでした。 Argo CD は、いくつかの標準 Kubernetes リソースに対して組み込みのヘルス ポリシーを提供し、アプリケーションのヘルス ステータスにこれらのポリシー全体を提示します。たとえば、レプリカの数が正常かどうか、PVC がバインドされているかどうかなどをチェックします。Ingress リソースの場合、status.loadBalancer.ingress リストが空でないかどうかをチェックします。これには少なくとも 1 つのホスト名または IP 値が必要ですが、ここでデプロイした Ingress の値は空です。 - $ kubectl get ingress devops-demo -o yaml
- apiバージョン: extensions/v1beta1
- 種類: イングレス
- ......
- 仕様:
- ルール:
- - ホスト: devops-demo.k8s。地元
- http:
- パス:
- - バックエンド:
- サービス名: devops-demo
- サービスポート: http
- パス: /
- パスタイプ: 実装固有
- 状態:
- ロードバランサー: {}
つまり、ヘルスチェックは合格しなかったということです。 Argo CD ページでも、Ingress が原因でヘルス チェックが失敗したことが確認されています。 このとき、Ingress リソースの監視および検査方法をカスタマイズする必要があります。 Argo CD は、Lua での検査ルールの記述と、Argo CD の Configmap 構成ファイルの変更をサポートしています。 - $ kubectl edit cm -n argocd argocd-cm
- # 以下のオブジェクトを編集してください。 ' #'で始まる行は無視されます。
- # ファイルが空の場合、編集は中止されます。このファイルの保存中にエラーが発生した場合は、
- #関連する失敗を伴って再開されました。
- #
- APIバージョン: v1
- データ:
- リソースのカスタマイズ: | # Ingressリソースのヘルスチェック方法をカスタマイズする
- 拡張機能/Ingress:
- 健康.lua: |
- s = {}
- hs.status = "健康"
- 戻るhs
- ......
変更が完了すると、アプリケーションは正常になります。 ロールバックする必要がある場合は、Argo CD ページで [履歴とロールバック] を直接クリックして、展開履歴を表示し、ロールバックするバージョンを選択できます。 Tekton パイプライン全体のステータスを表示できます。 - $ tkn pr gitlab-run-vdlm6 を記述します
- 名前: gitlab-run-vdlm6
- 名前空間:デフォルト
- パイプライン参照: パイプライン
- サービスアカウント: tekton-build-sa
- タイムアウト: 1時間0分0秒
- ラベル:
- tekton.dev/pipeline=パイプライン
- トリガー.tekton.dev/eventlistener=gitlab-listener
- triggers.tekton.dev/トリガー=gitlab-push-events-トリガー
- triggers.tekton.dev/triggers-eventid=eeda9157-5eb3-4399-be4b-88955cb56764
-
- 🌡️ ステータス
-
- 開始期間ステータス
- 4分前 2分 成功
-
- 📦 リソース
-
- リソースなし
-
- ⚓ パラメータ
-
- 名前値
- ∙ git_url http://git.k8s.ローカル/course/devops-demo.git
- ∙ git_infra_url git.k8s。ローカル/course/devops-demo-deploy.git
- ∙ 画像 harbor.k8s。ローカル/course/devops-demo
- ∙ 画像タグ 332798d9e28422341fd64704ab9b54b944d77084
- ∙ argocd_url argocd.k8s.local
- ∙ argocd_secret argocd-auth
- ∙ アプリ名 devops-demo
-
- 📝 結果
-
- 結果なし
-
- 📂 ワークスペース
-
- 名前サブパス ワークスペース バインディング
- ∙ go-repo-pvc
-
- 🗂 タスクラン
-
- 名前タスク名開始 所要時間 ステータス
- ∙ gitlab-run-vdlm6-sync-svmxl 同期 3 分前 42 秒 成功
- ∙ gitlab-run-vdlm6-manifests-d297d マニフェスト 3 分前 26 秒 成功
- ∙ gitlab-run-vdlm6-docker-g2tqx docker 4分前 48秒 成功
- ∙ gitlab-run-vdlm6-build-mkcrd ビルド 4 分前 9 秒 成功
- ∙ gitlab-run-vdlm6-test-gjr4c テスト 4 分前 4 秒 成功
- ∙ gitlab-run-vdlm6-clone-57vpw クローン 4 分前 8 秒 成功
最後に、Tekton と Argo CD を使用して GitOps ワークフローを実装する方法を図でまとめてみましょう。 |