Tektonシリーズの実用記事 私の最初のパイプライン

Tektonシリーズの実用記事 私の最初のパイプライン

上記ではTektonのインストールと理論的知識を紹介しました。この記事を注意深く読めば、何か得られるものがあると信じています。

この記事では主に、最初の組立ラインを実際に練習して完成させる方法について説明します。

パイプラインの全体的なプロセスは次のとおりです。

全体のプロセスは非常に簡単ですか?はい、これが最も基本的なプロセスです。実際には、最も基本的なものだけを理解すればよく、残りはこの基礎に基づいた拡張です。

以下はテスト用に Go で書かれた簡単なコードです。アドレスは https://gitee.com/coolops/devops-hello-world.git です。

Jenkins を使用して上記の機能を実装する場合は、Jenkinsfile を記述し、その中に 4 つのステージを記述するだけで済みます。ここで、Tekton を使用して、上記の手順を 4 つのタスクとして定義し、それらを Pipeline を通じて連結する必要があります。以下では、まずタスクを定義し、次にタスクをパイプラインに結合します。

プルコード

コードは配信の基礎であり、その後のすべてのアクションの道を開きます。コードを取得するためのタスクを作成する必要があります。

ただし、このタスクを自分で記述する必要はありません。 Tekton Hub で他の人が書いたものを直接使用できます。アドレスは https://hub.tekton.dev/tekton/task/git-clone です。このタスクは、幅広い機能と多くのパラメータをサポートします。具体的なパラメータについては、上記のアドレスで確認して確認できます。

インストールには、kubectl と tkn クライアントの 2 つの方法があります。

(1)kubectlを使用してインストールします。

 kubectl apply -f https://raw.githubusercontent.com/tektoncd/catalog/main/task/git-clone/0.5/git-clone.yaml

(2)tknクライアントを使用してインストールします。

 tkn hub インストールタスクgit - クローン

ここでは 2 番目のインストール方法を使用します。インストール後に特定のタスクを確認できます。

 # tkn hub インストールタスク git-clone
タスクgit - clone ( 0.5 ) がデフォルトの名前空間インストールされました
# kubectl タスクを取得 | grep gitクローン
git - クローン54 s

このタスクは私たちのニーズを満たすことができますか?次のように、TaskRun を作成してテストすることができます (コード リポジトリを取得するためのユーザー名とパスワードが設定されていないため、ここでは最初にパブリック リポジトリを使用してテストします)。

 apiバージョン: tekton.dev/v1beta1
種類: タスク実行
メタデータ:
名前: テスト- git - クローン
名前空間: デフォルト
仕様:
ワークスペース:
- 名前: 出力
空のディレクトリ: {}
パラメータ:
- 名前: URL
: "https://gitee.com/coolops/tekton-install.git"
- 名前: リビジョン
: "マスター"
- 名前: gitInitImage
: "registry.cn-hangzhou.aliyuncs.com/coolops/tekton-git-init:v0.29"
タスク参照:
名前: git - クローン

実行後、コードが正常にプルされていることがわかります。

ユニットテスト

ユニット テストは比較的簡単で、基本的には、たとえば go test ./... コマンドを実行するだけです。

 > テストを実行します / .  
okdevops - hello - world 0.313
ok devops - hello - world / pkg ( キャッシュ済み)

したがって、このタスクには、次のように Go コマンドを実行できる Go 環境のみが必要です。

 apiバージョン: tekton.dev/v1beta1
種類: タスク
メタデータ:
名前: ユニットテスト
仕様:
ワークスペース:
- 名前: ソース
手順:
- 名前: ユニット- テスト
作業ディレクトリ: $ ( ワークスペース. ソース. パス)
イメージ: golang : 1.17.5
環境:
- 名前: GOPROXY
: https://goproxy.cn
コマンド: [ 'go' ]
引数:
- "テスト"
- 「./...」

イメージのビルド/プッシュ

ここでアプリケーション構築用の個別のタスクがないのはなぜですか?主な理由は、ここでは多段階の建物を使用しているためです。アプリケーションのビルドイメージを Dockerfile にパッケージ化できるため、ここで記述する必要があるのは 1 つのタスクだけです。

 apiバージョン: tekton.dev/v1beta1
種類: タスク
メタデータ:
名前: ビルド- プッシュ- イメージ
仕様:
パラメータ:
- 名前: Dockerファイルへのパス
説明: ビルドするdockerfile パス( コンテキストに対する相対パス)
デフォルト: Dockerfile
- 名前: イメージURL
説明: 画像リポジトリURL
- 名前: イメージタグ
説明: ビルドされたイメージ適用するタグ
デフォルト: 最新
ワークスペース:
- 名前: ソース
- 名前: dockerconfig
マウントパス: / kaniko / docker # config json マウントディレクトリ
手順:
- 名前: ビルドプッシュ
画像: レジストリ cn - 杭州 アリユンクス com / coolops / kaniko - エグゼキューター: v1 .5 .0
作業ディレクトリ: $ ( ワークスペース. ソース. パス)
指示
- / カニコ/ 執行者
引数:
--dockerfile = $ ( params . pathToDockerfile )
-- destination = $ ( params.imageUrl ) : $ ( params.imageTag )
-- context = $ ( ワークスペース. ソース. パス)

ここでは、kaniko を使用してイメージを構築します。この方法では、docker.sock ファイルをマウントする必要はありませんが、docker 構成を /kaniko/.docker ディレクトリに保存する必要があります。次のコマンドを使用してシークレットを作成できます。

 kubectl でシークレットdocker - registry dockerhub --docker -server = https : //index.docker.io/v1/ --docker-username=[ユーザー名] --docker-password=[パスワード] --dry-run=client -o json | を作成します jq -r '.data.".dockerconfigjson"' | base64 -d > /tmp/config.json && kubectl はシークレットジェネリック docker-config を作成します --from-file=/tmp/config.json && rm -f /tmp/config.json

上記コマンドを実行した際にjqコマンドがない場合はインストールする必要があります。

 yum インストールjq -y

アプリケーションをデプロイする

ここで使用されるデプロイメント方法はアプリケーションをデプロイすることなので、デプロイするには kubectl を使用するだけで済みます。

ただし、kubectl を使用する場合は /root/.kube/config ファイルが必要なので、構成ファイルは引き続き secret を通じてコン​​テナーにマウントされます。

次のようにシークレットを作成します。

 kubectl  ジェネリックkubernetes - config シークレット作成ます--from - file = /root/.kube/config 

次に、次のようにタスクを作成します。

 apiバージョン: tekton.dev/v1alpha1
種類: タスク
メタデータ:
名前: deploy - to - k8s
仕様:
ワークスペース:
- 名前: ソース
- 名前: kubernetesconfig
マウントパス: / root / キューブ
パラメータ:
- 名前: YamlFileへのパス
説明: Git ソースデプロイするyaml ファイルパス
デフォルト: デプロイメント ヤム
- 名前: 画像
- 名前: タグ
手順:
- 名前: 実行- kubectl
画像: レジストリ cn - 杭州 アリユンクス com / coolops / kubectl : 1.19.16
作業ディレクトリ: $ ( ワークスペース. ソース. パス)
スクリプト: |
sed -i s #IMAGE # $ ( params.IMAGE ) #g $ ( params.pathToYamlFile )
sed -i s #TAG #$ ( params . TAG ) #g $ ( params . pathToYamlFile )
kubectl apply -f $ ( パラメータ.YamlFile パス )

パイプラインに統合

上記の各ステップをタスクに整理しました。ここで、次のように Pipeline を結合し、必要な変数を宣言する必要があります。

 apiバージョン: tekton.dev/v1beta1
種類: パイプライン
メタデータ:
名前: devops - hello - world - パイプライン
仕様:
ワークスペース: # ワークスペースを宣言する
- 名前: go - リポジトリ- pvc
- 名前: docker - 設定
- 名前: kubernetes - 設定
パラメータ:
- 名前: git_url
- 名前: リビジョン
タイプ: 文字列
デフォルト: "master"
- 名前: gitInitImage
タイプ: 文字列
デフォルト: "registry.cn-hangzhou.aliyuncs.com/coolops/tekton-git-init:v0.29"
- 名前: Dockerファイルへのパス
説明: ワークスペース内でKaniko 使用するビルドコンテキストパス
デフォルト
- 名前: イメージURL
説明: 画像リポジトリURL
- 名前: イメージタグ
説明: ビルドされたイメージ適用するタグ
デフォルト: 最新
タスク: # パイプラインにタスクを追加する
- 名前: クローン
タスク参照:
名前: git - クローン
ワークスペース:
- 名前: 出力
ワークスペース: go - repo - pvc
パラメータ:
- 名前: URL
: $ ( params . git_url )
- 名前: リビジョン
: $ ( パラメータ. リビジョン)
- 名前: gitInitImage
: $ ( params . gitInitImage )
- 名前: ユニット- テスト
ワークスペース: #pass ワークスペース
- 名前: ソース
ワークスペース: go - repo - pvc
タスク参照:
名前: ユニットテスト
実行後:
- クローン
- 名前: ビルド- プッシュ- イメージ
パラメータ:
- 名前: Dockerファイルへのパス
: $ ( params . pathToDockerfile )
- 名前: イメージURL
: $ ( params . imageUrl )
- 名前: イメージタグ
: $ ( params . imageTag )
タスク参照:
名前: ビルド- プッシュ- イメージ
実行後:
-ユニット- テスト
ワークスペース: #pass ワークスペース
- 名前: ソース
ワークスペース: go - repo - pvc
- 名前: dockerconfig
ワークスペース: docker - config
- 名前: デプロイ: k8s
タスク参照:
名前: deploy - to - k8s
パラメータ:
- 名前: YamlFileへのパス
: デプロイメント ヤム
- 名前: 画像
: $ ( params . imageUrl )
- 名前: タグ
: $ ( params . imageTag )
ワークスペース:
- 名前: ソース
ワークスペース: go - repo - pvc
- 名前: kubernetesconfig
ワークスペース: kubernetes - 構成
実行後:
- ビルド- プッシュ- イメージ

テストの実行

テストを実行するには PipelineRun を作成しますが、作成する前に、まず必要な認証情報を作成します。

 APIバージョン: v1
種類: 秘密
メタデータ:
名前: gitlab - auth
注釈:
tekton.dev/git-0:https://gitee.com/ # ここで使用されているgitee リポジトリ
タイプ: kubernetes .io / basic - auth
文字列データ:
ユーザー名: xxxx
パスワード: xxxx
---
APIバージョン: v1
種類: サービスアカウント
メタデータ:
名前: テクトン- ビルド- sa
秘密:
- 名前: gitlab - 認証
---
apiバージョン: rbac 承認 k8s io / v1
種類: ClusterRoleBinding
メタデータ:
名前: tekton - clusterrole - binding
ロールリファレンス:
apiグループ: rbac 承認 k8s io
種類: ClusterRole
名前: 編集
科目:
- 種類: サービスアカウント
名前: テクトン- ビルド- sa
名前空間: デフォルト

次に、次のように PipelineRun を作成します。

 apiバージョン: tekton.dev/v1beta1
種類: PipelineRun
メタデータ:
名前: devops - hello - world - パイプライン- 実行
仕様:
パイプライン参照:
名前: devops - hello - world - パイプライン
パラメータ:
- 名前: リビジョン
: マスター
- 名前: git_url
: https://gitee.com/coolops/devops-hello-world.git
- 名前: イメージURL
: レジストリ cn - 杭州 アリユンクス com / coolops / devops - hello - world
- 名前: イメージタグ
: 最新
- 名前: Dockerファイルへのパス
: Dockerfile
ワークスペース:
- 名前: go - リポジトリ- pvc
ボリュームクレームテンプレート:
仕様:
アクセスモード:
-ReadWriteOnce
ストレージクラス名: openebs - ホストパス
リソース
リクエスト:
ストレージ: 1 Gi
- 名前: docker - 設定
秘密
secretName : docker - config
- 名前: kubernetes - 設定
秘密
secretName : kubernetes - config
サービスアカウント名: tekton - build - sa

次に、Tekton ダッシュボードでパイプラインが正常に実行されていることを確認します。

アプリケーションも正常に起動しました。

 # kubectl get po | grep http
httpserver - 696479 dd5d - qplnx 2 / 2 実行中0 2 分18秒

ページにアクセスして通常の状態に戻ります。

 # カール10.102.140.2:8080
{ "データ" : 300"言う" : "Hello World" }

しかし、上には固定ミラー TAG があります。実際の作業では固定のものが多いので修正していきます。 Tekton Hub の git-clone タスクはコミット結果を出力します。コミット ID をイメージ タグとして使用できます。変更されたパイプラインは次のとおりです。

 apiバージョン: tekton.dev/v1beta1
種類: パイプライン
メタデータ:
名前: devops - hello - world - パイプライン
仕様:
ワークスペース: # ワークスペースを宣言する
- 名前: go - リポジトリ- pvc
- 名前: docker - 設定
- 名前: kubernetes - 設定
パラメータ:
# コードリポジトリを定義する
- 名前: git_url
- 名前: リビジョン
タイプ: 文字列
デフォルト: "master"
- 名前: gitInitImage
タイプ: 文字列
デフォルト: "registry.cn-hangzhou.aliyuncs.com/coolops/tekton-git-init:v0.29"
# ミラーパラメータを定義する
- 名前: Dockerファイルへのパス
説明: ワークスペース内でKaniko 使用するビルドコンテキストパス
デフォルト
- 名前: イメージURL
説明: 画像リポジトリURL
- 名前: イメージタグ
説明: ビルドされたイメージ適用するタグ
デフォルト: 最新
タスク: # パイプラインにタスクを追加する
- 名前: クローン
タスク参照:
名前: git - クローン
ワークスペース:
- 名前: 出力
ワークスペース: go - repo - pvc
パラメータ:
- 名前: URL
: $ ( params . git_url )
- 名前: リビジョン
: $ ( パラメータ. リビジョン)
- 名前: gitInitImage
: $ ( params . gitInitImage )
- 名前: ユニット- テスト
ワークスペース: #pass ワークスペース
- 名前: ソース
ワークスペース: go - repo - pvc
タスク参照:
名前: ユニットテスト
実行後:
- クローン
- 名前: ビルド- プッシュ- イメージ
パラメータ:
- 名前: Dockerファイルへのパス
: $ ( params . pathToDockerfile )
- 名前: イメージURL
: $ ( params . imageUrl )
- 名前: イメージタグ
: $ ( タスク. クローン. 結果. コミット)
タスク参照:
名前: ビルド- プッシュ- イメージ
実行後:
-ユニット- テスト
ワークスペース: #pass ワークスペース
- 名前: ソース
ワークスペース: go - repo - pvc
- 名前: dockerconfig
ワークスペース: docker - config
- 名前: デプロイ: k8s
タスク参照:
名前: deploy - to - k8s
パラメータ:
- 名前: YamlFileへのパス
: デプロイメント ヤム
- 名前: 画像
: $ ( params . imageUrl )
- 名前: タグ
: $ ( タスク. クローン. 結果. コミット)
ワークスペース:
- 名前: ソース
ワークスペース: go - repo - pvc
- 名前: kubernetesconfig
ワークスペース: kubernetes - 構成
実行後:
- ビルド- プッシュ- イメージ

$(tasks.clone.results.commit) を使用すると、後続のタスクで前のタスクの出力を参照できます。

パイプラインを再実行すると、ビルドされたイメージのタグは次のようにコミット ID になります。

コード リポジトリ内の最後のコミットのコミット ID。

要約する

パイプライン全体は単純に見えますが、定義されたパラメータが渡されたり指定し忘れられたりすることがあるため、デバッグには多少の労力がかかります。そのため、継続的なデバッグが必要になります。

<<:  従来の集中型クラウド コンピューティング アーキテクチャに挑戦する、分散型クラウドの本質とは何でしょうか?

>>:  クラウドでのビッグデータの詳細な分析の実装

推薦する

百度の調整は将来の検索エンジン開発の傾向を明らかにする

百度は6月22日から大規模な調整を行っており、6月末まで続いた。最も大きな変化は28日に起きた。当初...

10か月間のウェブサイトBaiduの重み値8の例図

以前、あるウェブマスターのウェブサイトで、そのウェブサイトのウェイトが 8 で、わずか 10 か月で...

Yuehuai SEO: ウェブサイトのスナップショットのロールバックを回避するテクニックの簡単な分析

SEO を行うウェブマスターは、Baidu スナップショットの更新頻度に特に注意を払います。スナップ...

ハイブリッド、マルチクラウド IT 環境を強化し、保護するにはどうすればよいでしょうか?

今日の急速に変化する環境において、ビジネス固有のニーズを満たし、競争力を維持するために、同時に多くの...

Baidu と Google の包含、ランキング、PR 更新時間の予測 - Google 検索エンジン最適化、SEO チュートリアル、SEO 知識

Google 更新時間<br /> 更新時間は7日ごとに更新されます(ランキングへの影響...

Pacificrack: 米国クラスター VPS、32 C セグメント、無料スナップショット + フルバックアップ、月額 4 ドルから

Pacificrack は、まったく新しい「サイト クラスター VPS」を導入しました。これは、デフ...

evobilling - 年間 13 USD/1GB メモリ/15GB SSD/1TB トラフィック/シアトル (10GB ポート)/ロサンゼルス

EvoBurst は、実は 1 年以上前から出ています。主にローエンドの OVZ 仮想 VPS を提...

分散システムの噂

[[259783]] Redis、Cassandra、Amazon S3、BitTorrent など...

検索最適化ランキング要因の概要

1. キーワードの最適化1. URLに最適化するキーワードが含まれている2. ウェブページのタイトル...

タグ: ソーシャル ネットワーキング サイト、見つけやすい、分析

大手ソーシャル ネットワーキング サイトと比較すると、Yixun は小規模で新興のソーシャル ネット...

あなたについて話しているんです! SEO のためのフレンドリー リンクの交換に関するよくある誤解がいくつかあります。

フレンドリー リンクは、ウェブサイトの最適化において非常に重要な部分です。SEO の日常業務は、すべ...

企業ウェブサイトの SEO 診断プランの書き方

みなさんこんにちは。私はShi Touです。昨日の記事「企業ウェブサイトの SEO 診断におけるいく...

広東省電子商取引業界のCXOがファーウェイを訪問し、クラウドネイティブ2.0時代の電子商取引業界の革新動向を探る

4月25日午後、「ファーウェイクラウド広東専属月例電子商取引業界ハイエンドCXOプライベートミーティ...

中国語のキーワードを検索すると、英語のウェブサイトがホームページで 2 番目にランクされるのはなぜですか?

記事のタイトルは、私が百度知道で見た質問です。質問したネットユーザーは非常に困惑しており、回答を求め...