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。

要約する

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

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

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

推薦する

Weibo ライブストリーミングはどのようにして人々の「拡散」を助けるのでしょうか?

一方、業界は本格的に発展しており、写真、テキスト、音声、短編動画、中・長編動画、ライブ放送など、さま...

Kubernetes コンテナ ランタイムを Docker から Containerd にスムーズに切り替える方法

[[418144]]先ほど、containerd の開発履歴と基本的な使用方法について学習しました。...

ウェブサイトの起動速度が遅いと、ウェブサイトのインクルージョンが低下する

過去 1 週間、ウェブサイトのエントリー数は減少し続けています。理由を探していましたが、まだわかりま...

老ウェブマスターが、ウェブサイトのコンバージョン率の低さを改善する方法を教えます

多くのウェブマスターが私と同じだと思います。彼らのウェブサイトには多かれ少なかれトラフィックがありま...

大手企業はクラウドコンピューティング業界での競争に力を入れている

4月10日、テンセントやアリババなどのインターネット大手が投資を増やし続けることで、クラウドコンピュ...

玉橋動画:目立つCMのコピーライティングはこうやって生まれるんですか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています最近人気の...

企業がクラウドリソースをより有効活用するための4つのステップ

多くの企業にとって、クラウド リソースの活用は戦略の一部ではなく、個々のチームがニーズを満たすために...

クリエイティブマーケティングを刺激する4つのアイデアを共有

マーケティングの創造性は、マーケティングの専門家だけの特権ではありません。誰にでもできるし、どんなこ...

#ニュース# BandwagonHost: KVM シリーズ VPS は CN2 回線を含むコンピュータ ルームを自由に切り替えることができます

BandwagonHost がなぜ KVM 仮想 VPS を異なるコンピュータ ルーム間で自由に切り...

Salesfunnel は、数百 TB のデータを「移動」する際に、サービスを中断することなく、どのようにしてクラウド間の移行を実現するのでしょうか?

国内のSaaS業界は急速な発展期を迎えています。 SaaS ベンダーが市場機会を獲得するには、製品の...

K8s Nginx Lngress の 9 つの一般的な構成 (アノテーション)、いくつ知っていますか?

前回の記事では、ingress vhost アノテーションの使用について紹介しました。鉄は熱いうちに...

ユーザーエクスペリエンスを向上させ、ウェブサイトをユーザーに人気のあるものにする

ユーザー エクスペリエンスは、インターネットのエコシステムが常に重視してきたものです。現在のネットワ...

オフサイト ウェブサイトの構築プロセスに関する簡単な説明 (パート 1)

東莞SEO業界の発展と応用が遅れる中、知識格差の欠点が再び明らかになった。この短い8日間で、適応、認...