Tektonを物理マシンに接続して構築する方法

Tektonを物理マシンに接続して構築する方法

[[396376]]

この記事はWeChatの公開アカウント「Ask Qi」から転載したもので、著者はChen Shaowenです。記事を転載する場合は公式アカウントまでご連絡ください。

1. 物理的なビルド マシンが必要なのはなぜですか?

記事「Jenkins パイプライン ビルドのためにリモート macOS 物理マシンに接続する方法」では、Jenkins に物理ビルド マシンを追加する方法について説明しました。これは私が衝動的に思いついた要望ではなく、当時、実際に ToB のビジネス クライアントからソリューションについて相談を受けていました。

マルチターミナル開発者にとって、Android、IOS、macOS、Arm、Windows、X86 アプリケーションの構築は一般的な要件です。

良いニュースとしては、GitHub Actions が macOS ビルド環境を提供し、AWS が macOS 仮想マシンを提供し、Huawei が ARM ホストを提供していることです。クラウド ネイティブのコンテキストでは、Kubernetes ランタイムがより一般的に使用されます。 Kubernetes がサポートしていないプロセッサ アーキテクチャとオペレーティング システムの場合、継続的インテグレーション (CI) は無力であるように思われます。継続的インテグレーションには、物理​​的なビルド マシンのサポートが必要です。

この記事では、Kubernetes での CI 構築のために物理マシンにアクセスする方法について説明します。この記事ではTektonを例に挙げます。他のエンジンにも同様の処理ロジックがあります。

2. Tekton は物理マシンとどのように対話しますか?

Kubernetes による物理マシンまたは仮想マシンの管理は、実際には典型的な Operator シナリオです。関連するフィールドを記述する CRD を定義し、Pod とビルダー間のロジックを処理するコントローラーを記述できます。

Tekton タスクのカプセル化を記述することもできます。この記事ではこれを使用します。これにより、別の疑問も生じます。Tekton は一部の Operator シナリオを置き換えることができますか?次回以降の記事で私の考えを述べたいと思います。

ここではプロトタイプの検証のみを行い、製品化の詳細についてはあまり注意を払いません。

Tekton では、各パイプラインは多数のタスクで構成され、タスクは並列に実行できます。タスクには、多数のコンテナを含むポッドに対応する多数のシリアル ステップが含まれます。

ここで重要なのは、Pod をビルド マシンに関連付けることです。私は、Pod とビルド マシン間でファイルを同期するために rsync を使用し、物理マシン上でビルド コマンドを実行するために Pod で sshpass を使用することを選択しました。

主に以下のステップに分かれています(以下のコマンドはすべてコンテナ内で実行されます)。

  1. クローンコード
  2. rsyncを実行してコードをビルドマシンに同期します
  3. sshpassを実行してビルドマシンでビルドコマンドを実行します。
  4. rsyncを実行して、ビルドマシン内のビルド製品をコンテナに同期します。
  5. ビルド製品をアーカイブする(この例では、この手順は省略され、ビルド製品が取得できることのみを確認します)

実際のところ、プロセス全体は Tekton に直接関係しているわけではなく、コンテナがビルド マシンに直接接続されているあらゆる環境で実行可能であることがわかります。次のデモンストレーションでは、Tekton を例に挙げます。

3. リソース準備リスト

  • Kubernetes クラスター。 Tekton を実行するために使用されます。最新のTekton 0.23ではKubernetesが1.17以上である必要があります。
  • 物理マシンまたは仮想マシン。建築アプリケーション向け

3.1 Kubernetesのバージョンを確認する

  1. kubectl バージョン
  2.  
  3. クライアント バージョン: version.Info{メジャー: "1" 、マイナー: "19" 、GitVersion: "v1.19.7" 、GitCommit: "1dd5338295409edcfff11505e7bb246f0d325d15" 、GitTreeState: "clean" 、BuildDate: "2021-01-13T13:23:52Z" 、GoVersion: "go1.15.5" 、コンパイラ: "gc" 、プラットフォーム: "darwin/amd64" }
  4. サーバー バージョン: version.Info{メジャー: "1" 、マイナー: "20" 、GitVersion: "v1.20.2" 、GitCommit: "faecb196815e248d3ecfb03c680a4507229c2a56" 、GitTreeState: "clean" 、BuildDate: "2021-01-21T01:11:42Z" 、GoVersion: "go1.15.5" 、コンパイラ: "gc" 、プラットフォーム: "linux/amd64" }

3.2 物理マシンの準備

  • オペレーティングシステムはCentOS 7.6です
  1. ユーネーム -a
  2.  
  3. Linux テスト 3.10.0-957.21.3.el7.x86_64 #1 SMP 2019 年 6 月 18 日火曜日 16:35:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
  • プリインストールされたGolangコンパイル環境

当初の計画では macOS ビルド例を選択する予定でしたが、直接ネットワーク環境を提供できなかったため、代わりに Golang ビルド例が使用されました。

  1. 移動バージョン
  2.  
  3. go バージョン go1.13 linux/amd64

4. TektonとPipelineのリソースを準備する

4.1 Tektonパイプラインのデプロイ

  • 負荷を作成する

Tekton はデフォルトで gcr.io イメージを使用します。国内環境であれば、gcr.azk8s.cn イメージに置き換えることが可能です。

  1. kubectl apply -f https://github.com/tektoncd/pipeline/releases/download/v0.23.0/release.notags.yaml
  • リソースを表示

4.2 リソース計画

  1. kubectl -n tekton-pipelines はすべてを取得します 
  2.  
  3. 名前準備完了 ステータス 再起動 年齢
  4. pod/tekton-pipelines-controller-86c487c965-p6s5t 1/1 実行中 0 51秒
  5. pod/tekton-pipelines-webhook-7b775d9cd8-fzdrq 1/1 実行中 0 51秒
  6.  
  7. 名前タイプ クラスター IP 外部 IP ポート 年齢
  8. service/tekton-pipelines-controller ClusterIP 10.233.61.46 <なし> 9090/TCP、8080/TCP 51秒
  9. service/tekton-pipelines-webhook ClusterIP 10.233.46.233 <なし> 9090/TCP、8008/TCP、443/TCP、8080/TCP 51 秒
  10.  
  11. 名前準備完了最新利用可能年齢
  12. デプロイメント.apps/tekton-pipelines-controller 1/1 1 1 51秒
  13. デプロイメント.apps/tekton-pipelines-webhook 1/1 1 1 51秒
  14.  
  15. 名前希望現在の年齢
  16. レプリカセット.apps/tekton-pipelines-controller-86c487c965 1 1 1 51s
  17. レプリカセット.apps/tekton-pipelines-webhook-7b775d9cd8 1 1 1 51s
  18.  
  19. 名前参照 ターゲット MINPODS MAXPODS レプリカ 年齢
  20. horizo​​npodautoscaler.autoscaling/tekton-pipelines-webhook Deployment/tekton-pipelines-webhook <不明>/100% 1 5 1 51秒

必要なパイプライン リソースのリスト:

  • コードを複製するタスク
  • タスク間でファイルを共有するために使用されるpv
  • コードをビルドマシンに同期し、ビルドが完了した後に再度同期するために使用されるカスタムタスク
  • パイプラインは、パイプラインを記述し、タスクを配置するために使用されます。
  • パイプラインをインスタンス化し、構築に必要なパラメータを提供するために使用されるパイプライン実行

4.2 ファイルの同期とスクリプトの実行のためのタスクの作成

上の図に示すように、ここでのタスクは、コンテナと VM 間のファイルとプロセスを接続して、クロスコンパイルのような効果を実現するために使用されます。

  1. ---  
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: タスク
  4. メタデータ:
  5. 名前: リモートシェル
  6. ラベル:
  7. app.kubernetes.io/バージョン: "0.1"  
  8. 注釈:
  9. tekton.dev/pipelines.minバージョン: "0.12.1"  
  10. tekton.dev/タグ:git
  11. tekton.dev/displayName: 「リモート シェル」  
  12. 仕様:
  13. 説明: >-
  14. このタスクはリモートマシンシェルを実行するために使用できます
  15. ワークスペース:
  16. -名前: ソース
  17. パラメータ:
  18. -名前: リモートIP
  19. タイプ: 文字列
  20. -名前: リモートポート
  21. タイプ: 文字列
  22. -名前: リモートユーザー名
  23. タイプ: 文字列
  24. -名前: リモート-パスワード 
  25. タイプ: 文字列
  26. -名前: リモートワークスペース
  27. タイプ: 文字列
  28. -名前: リモートスクリプト
  29. タイプ: 文字列
  30. 手順:
  31. -名前: リモートシェル
  32. イメージ: shaowenchen/rsync-sshpass:v1
  33. 作業ディレクトリ: $(workspaces.source.path)
  34. スクリプト: |
  35. sshpass -p "$(params.remote-password)" ssh -o StrictHostKeyChecking= no   "$(params.remote-username)" @ "$(params.remote-ip)" -p "$(params.remote-port)"   「mkdir -p $(params.remote-workspace)」  
  36.  
  37. rsync -ratlz --progress --rsh="sshpass -p $(params.remote-password) ssh -o StrictHostKeyChecking=no -l $(params.remote-username)" ./ "$(params.remote-ip)":"$(params.remote-workspace)"  
  38.  
  39. sshpass -p "$(params.remote-password)" ssh -o StrictHostKeyChecking= no   "$(params.remote-username)" @ "$(params.remote-ip)" -p "$(params.remote-port)"   "$(params.remote-script)"  
  40.  
  41. rsync -ratlz --progress --rsh="sshpass -p $(params.remote-password) ssh -o StrictHostKeyChecking=no -l $(params.remote-username)" "$(params.remote-ip)":"$(params.remote-workspace)"/ 。  

記述方法については、Tekton が提供する例を参照してください。主にいくつかのステップに分かれています。

  • パラメータの定義
  • 書き込み手順の流れ
  • スクリプトの作成

これはスクリプト文字列のプロセスですが、コンテナ イメージの助けを借りて、さまざまなツールをインストールする手順が省略されます。

4.3 Tektonパイプラインの説明の準備

  • クローンコードタスク

Tekton はタスクを共有するためのハブ サービスを正式に開始しました。ここでは https://hub.tekton.dev/tekton/task/git-clone を直接使用します。

  1. kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.3/git-clone.yaml
  • ツールボックスイメージ shaowenchen/rsync-sshpass:v1 をビルドします。

Dockerfile は次のとおりです。

  1. ARGアルパイン_ver=3.13
  2. アルパインより:${alpine_ver}.5
  3.  
  4. apkアップデートを実行\
  5. && apk アップグレード \
  6. && apk追加  --キャッシュなし\  
  7. rsync \
  8. opensshクライアント\
  9. オープンシュ\
  10. sshpass \
  11. ca証明書\
  12. && -ca-証明書を更新\
  13. && rm -rf /var/cache/apk/*
  • パイプライン
  1. apiバージョン: tekton.dev/v1beta1
  2. 種類: パイプライン
  3. メタデータ:
  4. 名前: リモートビルドパイプライン
  5. 仕様:
  6. パラメータ:
  7. -名前: リポジトリ URL
  8. タイプ: 文字列
  9. -名前: 支店 
  10. タイプ: 文字列
  11. -名前: リモートIP
  12. タイプ: 文字列
  13. -名前: リモートポート
  14. タイプ: 文字列
  15. -名前: リモートユーザー名
  16. タイプ: 文字列
  17. -名前: リモート-パスワード 
  18. タイプ: 文字列
  19. -名前: リモートワークスペース
  20. タイプ: 文字列
  21. -名前: リモートスクリプト
  22. タイプ: 文字列
  23. ワークスペース:
  24. -名前: 共有データ
  25. タスク:
  26. -名前:フェッチ-repo
  27. タスク参照:
  28. 名前: git-clone
  29. ワークスペース:
  30. -名前:出力 
  31. ワークスペース: 共有データ
  32. パラメータ:
  33. -名前: URL
  34. 値: $(params.repo-url)
  35. -名前: リビジョン
  36. 値: $(params.branch- name )
  37. -名前: リモートビルド
  38. タスク参照:
  39. 名前: リモートシェル
  40. runAfter: [ "リポジトリの取得" ]
  41. ワークスペース:
  42. -名前: ソース
  43. ワークスペース: 共有データ
  44. パラメータ:
  45. -名前: リモートIP
  46. 値: $(params.remote-ip)
  47. -名前: リモートポート
  48. 値: $(params.remote-port)
  49. -名前: リモートユーザー名
  50. 値: $(params.remote-username)
  51. -名前: リモート-パスワード 
  52. 値: $(params.remote-パスワード)
  53. -名前: リモートワークスペース
  54. 値: $(params.remote-workspace)
  55. -名前: リモートスクリプト
  56. 値: $(params.remote-script)

パイプラインには、コードを複製するタスクとリモート ビルドを実行するタスクの 2 つのタスクが含まれています。

  • パイプライン実行
  1. ---  
  2. apiバージョン: tekton.dev/v1beta1
  3. 種類: PipelineRun
  4. メタデータ:
  5. 名前: リモートビルドパイプライン実行 1
  6. 仕様:
  7. パイプライン参照:
  8. 名前: リモートビルドパイプライン
  9. ワークスペース:
  10. -名前: 共有データ
  11. ボリュームクレームテンプレート:
  12. 仕様:
  13. アクセスモード:
  14. -一度だけ読み書き可能
  15. リソース:
  16. リクエスト:
  17. ストレージ: 10Gi
  18. パラメータ:
  19. -名前: リポジトリ URL
  20. 値: https://github.com/shaowenchen/terraform-provider-qingcloud.git
  21. -名前: 支店 
  22. 値: マスター
  23. -名前: サブディレクトリ
  24. 値: terraform-provider-qingcloud-001
  25. -名前: リモートIP
  26. 値: 0.0.0.0
  27. -名前: リモートポート
  28. 値: "22"  
  29. -名前: リモートユーザー名
  30. 値: ルート
  31. -名前: リモート-パスワード 
  32. 値: パスワード
  33. -名前: リモートワークスペース
  34. 値: ~/workspaces/terraform-provider-qingcloud-001
  35. -名前: リモートスクリプト
  36. 値: |
  37. cd ~/workspaces/terraform-provider-qingcloud-001
  38. 作る

ここで、コードは pv の terraform-provider-qingcloud-001 ディレクトリにクローンされ、ビルダーの ~/workspaces/terraform-provider-qingcloud-001 ディレクトリに同期されます。つまり、これら 2 つのディレクトリ内の最終ファイルは一貫性があり、ビルドされたバイナリはビルド マシン上で生成されます。

  • Tekton リソース定義を表示

上記のすべてのリソースが適用されると、関連するリソースとパイプラインのステータスを表示できます。

  1. kubectl タスクの取得
  2.  
  3. 名前年齢
  4. git クローン 18 分
  5. リモートシェル 5分47秒
  1. kubectl パイプライン実行を取得する
  2.  
  3. 名前成功 理由 開始時間 完了時間
  4. remote-build-pipelinerun-1成功6分15秒 5分42秒

実行は成功しました。次に、機能が期待どおりであるかどうかを検証し続けます。

5. 機能検証

  • 関連する荷物を表示
  1. kubectl ポッドを取得する
  2.  
  3. 名前準備完了 ステータス 再起動 年齢
  4. remote-build-pipelinerun-1- fetch -repo-56ws8-pod-mgx77 0/1 完了 0 8分49秒
  5. remote-build-pipelinerun-1-remote-build-wxtms-pod-bcn6r 0/1 完了 0 8分35秒
  • 物理ビルドマシンでビルドディレクトリを表示する
  1. パスワード
  2.  
  3. /root/ワークスペース/terraform-provider-qingcloud-001
  4.  
  5. ls
  6.  
  7. CHANGELOG.md glide.yaml に移動します。合計main.go qingcloud スクリプト terraform-provider-qingcloud ウェブサイト
  8. dev.md go.mod LICENSE Makefile README.md terraform ベンダー
  • Kubernetes PVのビルドディレクトリを表示する
  1. kubectl PV を取得する
  2.  
  3. 名前容量 アクセスモード 回収ポリシー ステータス 請求 ストレージクラス
  4. pvc-860016bb-14b6-414a-9c5a-1a71d7290ba8 10Gi RWO削除バインドデフォルト/pvc-e7ceb0582a openebs-hostpath 2m12s
  • PVストレージパスの検索
  1. kubectl describe pv pvc-860016bb-14b6-414a-9c5a-1a71d7290ba8 |grep パス
  2.  
  3. パス: /var/openebs/ローカル/pvc-860016bb-14b6-414a-9c5a-1a71d7290ba8
  • PVディレクトリのファイル構造を表示する
  1. ls /var/openebs/ローカル/pvc-860016bb-14b6-414a-9c5a-1a71d7290ba8
  2.  
  3. CHANGELOG.md glide.yaml に移動します。合計main.go qingcloud スクリプト terraform-provider-qingcloud ウェブサイト
  4. dev.md go.mod LICENSE Makefile README.md terraform ベンダー

両方のディレクトリにビルド製品 terraform-provider-qingcloud が存在し、これは期待どおりであり、目標を達成したことを示しています。

6. 結論

従来の CICD エンジンは通常、C/S アーキテクチャです。プロセスを解析し、パイプラインをスケジュールするには S エンドが必要です。高負荷のビルドタスクを実行するには、多くの C エンドが必要になります。この方法のスケーラビリティは線形ではなく、クラウドネイティブではビジネス量が多い場合にボトルネックが発生しやすくなります。したがって、よりクラウドネイティブなビルド エンジンが必要になります。新しいエンジンではいくつかの古い問題を解決する必要があり、物理マシン ビルドのサポートもその 1 つです。

この記事では主にTektonを例に挙げ、rsyncとsshpassを使って構築用の物理マシンにアクセスするアイデアを紹介します。要点は次のとおりです。

  • rsync\sshpass を使用する主な目的は、コンテナを物理マシンにバインドし、双方向でファイルを同期し、プロセス空間を通信することです。
  • この方法は、Tekton だけでなく、どのエンジンでも使用できます。
  • これは単なるソリューションの検証です。製品に実装する場合は、キャッシュ、キーのセキュリティ、データのセキュリティ、テナントの分離などの問題を考慮する必要があります。

<<:  PingCAP は、完全な HTAP 機能を備えた分散データベースを構築する TiDB 5.0 をリリースしました。

>>:  従来のビジネスをパブリック クラウドに移行する際の落とし穴を回避するためのガイド

推薦する

ユーザーエクスペリエンスにおけるいくつかの誤解と、それを効果的に回避してコンバージョン率を向上させる方法について簡単に説明します。

今日、インターネットはユーザーエクスペリエンスにますます注目しています。一部の大規模なウェブサイトは...

エッジ AI とエッジ コンピューティングとは何ですか?

[51CTO.com クイック翻訳] エッジ AI は、人工知能の分野における新しい注目の領域の一つ...

クラウド コンピューティングの支出が増加している理由は何ですか?

昨年、業界アナリストは「クラウド コンピューティングの減速」が懸念されると警告しました。これは、予算...

アリババの5つの主要な技術成果がトップネットワーク通信会議SIGCOMM 2020に選ばれ、中国で新記録を樹立

アリババは最近、ネットワーク通信分野における最新の技術革新を発表しました。自社開発のNFC技術(近距...

百度は医学用語の編集に専門家を招き、一般ユーザーによる改変を禁止している

北京時報(記者 李斌)昨日、百度は国家衛生計画出産委員会臨床医師科学普及プロジェクト、百科名医ネット...

Baidu によってウェブサイトが降格された後にすべきこと

多くのウェブマスターは、Baidu によってウェブサイトが降格された後、自分のウェブサイトに自信を失...

ウェブサイトの最適化はユーザーツールのデータ分析から始める必要があります

ウェブサイト最適化担当者として、まずツールを使用するユーザーの割合を把握し、ツールを使用する顧客のデ...

コンテナの中に入っているシムとは一体何なのか?

この記事は、Brian Goff 氏が執筆した WeChat パブリック アカウント「Cloud N...

草の根ウェブマスターがあなたの質問に答えます: SEOはそれほど神秘的ではありません

ウェブサイトの運営とプロモーションの過程で、SEO最適化は欠かせない手段であるため、近年、多くのウェ...

マルチアクセス エッジ コンピューティング – パート 1: マルチアクセス エッジ コンピューティングはどのように機能しますか?

マルチアクセス エッジ コンピューティング (MEC) は、モバイル エッジ コンピューティングとも...

hostdare: 米国 VPS (ロサンゼルス) 最低 $10.4/年、768M メモリ/1 コア/10g NVMe/500g 帯域幅、Windows システム

Hostdare は、ロサンゼルス データ センターで「Cheap NVMe KVM VPS USA...

実践:WeChatミニプログラムを活用して教育業界を促進する3つの方法!

ミニプログラムの台頭に直面して、教育業界はどのようにその波に乗るべきでしょうか?この記事では、教育業...

Kubernetes ベースのリリースシステムの設計

背景Kubernetes クラスターへのサービス移行をデプロイする以前の作業では、CI/CD プロセ...

個々のウェブマスターが自分のウェブサイトの健全性を診断する方法について話す

古代の医学書では、病気を治療する際には、すべての医師が観察、聴診、問診、触診の 4 つの手順を踏まな...

KubernetesでのSparkのデプロイメントに関する完全なガイドをご覧ください

この記事は、Kubernetes 上で Spark クラスターを構築するためのガイドです。また、Sp...