Kubernetes マイクロサービス自動リリース システム

Kubernetes マイクロサービス自動リリース システム

[[340132]]

この記事はWeChatの公開アカウント「Invincible Coder」から転載したもので、著者はInvincible Coderです。この記事を転載する場合は、Wudi Coder の公開アカウントにご連絡ください。

オリジナルリンク: https://mp.weixin.qq.com/s/WPwoRi240rKaWeIs0yNZ2g

マイクロサービス アーキテクチャを実装すると、元の単一システム構造が多数のマイクロサービス アプリケーションになり、開発、テスト、運用、保守の展開で多くの課題に直面することになります。マイクロサービス アーキテクチャの下でエンジニアリングの研究開発効率を向上させ、開発、テスト、運用、保守の展開などのプロセスを円滑に進めることが、マイクロサービス テクノロジー システムを真に定着させ、メリットを生み出すための鍵となります。

上記の目標を達成するためには、開発者がいつでもどこでもコードをビルドし、指定された動作環境に公開できる、DevOps(開発と運用)のコンセプトに基づいた高度に自動化されたリリースシステムを構築する必要があります。このプロセスは、通常、CI/CD (継続的インテグレーション/継続的デリバリー) プロセスと呼ばれます。

DevOps の具体的な実践に関しては、一般的に各企業が自社の開発段階や実際のニーズに基づいて具体的な実装計画を選択します。資格のある企業は機能豊富なビジュアル パブリッシング システムを開発できますが、条件が限られているスタートアップは、オープン ソースまたは既存の技術コンポーネント (GitLab、Jenkins など) を使用して、比較的シンプルでありながら完全に機能する自動パブリッシング システムを実装できます。

この記事では、Spring Cloud マイクロサービス技術システムを背景に、GitLab 独自の CI/CD メカニズムと Kubernetes コンテナ化技術を使用して、比較的充実した CI/CD プロセスを備えた自動リリース システムを実装します。

CI/CD プロセスの概要

実際、DevOps はマイクロサービス アーキテクチャの普及後に登場した概念ではなく、長年のソフトウェア開発の実践を通じて業界が蓄積した理論とツールの集合体です。この記事で説明する自動リリース システムは、実際には、CI/CD パイプラインを構築することで、アプリケーションの構築、テスト、パッケージ化、リリースを効率的に自動化する方法を確立することです。 CI (継続的インテグレーション)/CD (継続的デリバリー) の概念は、特定のテクノロジーを指すのではなく、ソフトウェア エンジニアリング文化と一連の運用原則および特定のプラクティスを指します。

CI (継続的インテグレーション) の主な目的は、一貫した自動ビルド方法を確立してプログラム コードをパッケージ化することです。これにより、チーム メンバーはコードをより頻繁に送信し、コードをより早く統合し、コード内の問題を迅速に発見して解決できるため、共同開発の効率とソフトウェア配信の品質が向上します。継続的インテグレーション (CI) の基本的なプロセスを図に示します。

実装プロセスの観点から見ると、CI の主なプロセスは、開発者が送信したコードを、特定のインフラストラクチャ環境で高度に自動化された方法で実行できるプログラム パッケージ (Docker イメージなど) にパッケージ化することです。このプロセスは、GitLab Runner (CI パイプライン)、Sonar (コードチェックツール) などのツールセットによって完了することができ、CI プロセスを構築するときに実際のニーズに応じて統合および適用できます。

継続的デリバリー (CD) の主なロジックは、CI プロセスで構築されたプログラム イメージをイメージ リポジトリから特定のインフラストラクチャ環境 (テスト/本番 Kubernetes クラスターなど) に自動的に公開することです。 CD を実装するための主なツールとしては、GitLab Runner (CD パイプライン)、Helm (Kubernetes パッケージ管理ツール) などが挙げられます。

実際、CD の核心は、さまざまなユーザー入力パラメータ (yaml ファイル、環境構成パラメータなど) を通じて特定のリリース指示 (Helm 指示など) を自動的に生成し、パラメータに設定された対応する情報に従ってプログラムの特定の実行環境を構成することです。持続可能なデリバリー(CD)の基本的な運用プロセスを次の図に示します。

上記は CI/CD の基本的な概念とプロセスであり、自動リリース システムの実装の基礎でもあります。以下のコンテンツでは、主にこれら 2 つの段階に焦点を当てて、自動公開システムの基本的なプロセス ロジックを実装します。

システムの基本コンポーネント

この記事で解説する自動リリースシステムは、主に GitLab が提供する GitLab CI メカニズムを利用して、コードの送信やマージなどのイベントが発生したときに、あらかじめ設定された CI/CD プロセスを自動的にトリガーします。 CI プロセスには、主に基本的なコードのコンパイル、構築、パッケージ化などの段階が含まれます。上記の手順を完了すると、パッケージ化されたアプリケーションの Docker イメージがイメージ ウェアハウスに公開されます。

CD ステージでは、イメージ リポジトリからアプリケーション Docker イメージをプルし、設定された CD プロセスに従って、指定された Kubernetes クラスターにアプリケーションを公開します。具体的なシステム構造を下図に示します。

上図に示すように、自動リリースシステムは主に GitLab、Harbor イメージ リポジトリ、Kubernetes クラスターで構成されています。 GitLab は主にコードのバージョン管理、CI/CD プロセスの定義とトリガーを担当し、Harbor はアプリケーション Docker イメージの保存と配布を担当し、Kubernetes クラスターはアプリケーション コンテナを動作させるためのインフラストラクチャ環境です。

GitLab-CI自動リリースシステムの主要実装

先ほど、GitLab-CI メカニズムに基づく自動リリース システムの基本コンポーネントについて説明しました。このシステムを実装するには、GitLabサーバーをインストールしてデプロイし、GitLab Runner機能、プライベートイメージリポジトリサービス(HarborまたはJFrog)、Kubernetesクラスターを構成する必要があります(詳細についてはこのコラムの他の記事を参照してください)。

GitLab サーバーは CI/CD プロセス実行の主なキャリア ポイントであるため、サービスが Maven に基づいて構築された Java サービスである場合は、ビルド速度を上げるために、GitLab サーバーに Maven クライアントをインストールし、Maven プライベート サーバーのアドレスを構成する必要もあります。さらに、GitLab サーバーは、CI/CD プロセス中に Docker イメージのパッケージ化とビルドを実行し、イメージを Docker イメージ リポジトリにプッシュし、プライベート リポジトリから Kubernetes クラスターに Docker イメージを公開します。したがって、GitLab サーバーには Docker 環境と kubelet クライアントもインストールする必要があります。

環境が問題なければ、Gitlab プロジェクトのルート ディレクトリ コードに「.gitlab-ci.yml」ファイルを作成し、特定の CI/CD プロセスを定義できます。ただし、具体的な定義の前に、次のように、Maven プロジェクトにアプリケーション Docker イメージ パッケージのプラグイン構成と Dockerfile ファイル定義を追加する必要があります。

  1. <! --Docker イメージ Maven パッケージング プラグインを追加-->  
  2. <プラグイン>
  3. <groupId>com.spotify</groupId>
  4. <artifactId>dockerfile-maven-plugin</artifactId>
  5. <バージョン>1.4.13</バージョン>
  6. <処刑>
  7. <実行>
  8. <id>ビルドイメージ</id>
  9. <phase>パッケージ</phase>
  10. <目標>
  11. <goal>ビルド</goal>
  12. </目標>
  13. </実行>
  14. </処刑>
  15. <構成>
  16. <! --Dockerfileファイルの場所を指定します-->  
  17. <dockerfile>docker/Dockerfile</dockerfile>
  18. <! --Docker イメージ リポジトリ パスを指定します -->  
  19. <リポジトリ>${docker.repository}/springcloud- action /${app.名前}</リポジトリ>
  20. <ビルド引数>
  21. <! -- Dockerfile に渡すパラメータを指定します -->  
  22. <JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
  23. </buildArgs>
  24. </構成>
  25. </プラグイン>

プロジェクトの pom.xml ファイルに「dockerfile-maven-plugin」プラグインを追加します。このプラグインは、以前の「docker-maven-plugin」プラグインの代わりであり、Maven プロジェクト ビルドを Docker イメージとしてパッケージ化することをサポートします。上記の構成では、Dockerイメージの具体的な構築方法は、これは、タグで Dockerfile ファイルを指定することによって行われます。具体的には、プロジェクト内に docker ディレクトリを作成し、次の内容の Dockerfile ファイルを作成します。

  1. openjdk:8u191-jre-alpine3.9から
  2. ENTRYPOINT [ "/usr/bin/java" "-jar" "/app.jar" ]
  3. 引数 JAR_FILE
  4. ${JAR_FILE} /app.jar を追加します
  5. エクスポーズ8080

Maven パッケージング プラグインを構成した後、Maven パッケージング コマンドを使用してアプリケーション コードを Docker イメージにパッケージ化できるようになります。この時点で、「.gitlab-ci.yml」ファイルで特定の CI/CD ビルド ステージを定義します。例は次のとおりです。

  1. #環境パラメータ情報
  2. 変数:
  3. #Docker イメージ リポジトリ アドレスとアカウント パスワード情報
  4. DOCKER_REPO_URL: "10.211.55.11:8088"  
  5. DOCKER_REPO_USERNAME: 管理者
  6. DOCKER_REPO_パスワード: Harbor12345
  7. #Kubernetes関連情報の設定(スペースとサービスポート)
  8. K8S_NAMESPACE: "ウディマノン"  
  9. ポート: "8080"  
  10.  
  11. #CI/CDステージを定義する
  12. ステージ:
  13. - テスト
  14. - 建てる
  15. - 押す
  16. - 展開する
  17.  
  18. #ユニットテストフェーズを実行する
  19. mavenテスト:
  20. ステージ: テスト
  21. スクリプト:
  22. - mvnクリーンテスト
  23.  
  24. #コードのコンパイルとイメージのパッケージ化段階
  25. Mavenビルド:
  26. ステージ: ビルド
  27. スクリプト:
  28. -mvn パッケージをクリーンアップ -DskipTests
  29.  
  30. #パッケージ化されたDockerイメージをプライベートイメージリポジトリにアップロードする
  31. docker-push:
  32. ステージ: プッシュ
  33. スクリプト:
  34. #パッケージ化されたイメージにタグを付ける
  35. - docker タグ $DOCKER_REPO_URL/$CI_PROJECT_PATH $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
  36. #プライベートイメージリポジトリにログイン
  37. - docker ログイン $DOCKER_REPO_URL -u $DOCKER_REPO_USERNAME -p $DOCKER_REPO_PASSWORD
  38. #アプリケーションイメージをイメージリポジトリにアップロードする
  39. - docker push $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
  40. - docker rmi $DOCKER_REPO_URL/$CI_PROJECT_PATH/$CI_BUILD_REF_NAME:${CI_COMMIT_SHA:0:8}
  41. - docker rmi $DOCKER_REPO_URL/$CI_PROJECT_PATH
  42.  
  43. #Kubernetes テスト クラスターにアプリケーションを公開します (ここでは手動確認を指定します)
  44. デプロイテスト:
  45. ステージ: デプロイ
  46. いつ:手動
  47. スクリプト:
  48. - kubectl config 使用コンテキスト kubernetes-admin@kubernetes
  49. - sed -e "s/__REPLICAS__/1/; s/__PORT__/$PORT/; s/__APP_NAME__/$CI_PROJECT_NAME/; s/__PROFILE__/test/; s/__IMAGE__/$DOCKER_REPO_URL\/${CI_PROJECT_PATH//\//\\//\/${CI_BUILD_REF_NAME//\//\\/:${CI_COMMIT_SHA:0:8}/" kubernetes/deploy.yaml | kubectl -n ${K8S_NAMESPACE} を適用 -f -

前述のように、「.gitlab-ci.yml」ファイルで「テスト、ビルド、プッシュ、デプロイ」の 4 つのステージを定義しました。これらの段階の具体的な説明は次のとおりです。

  • test: ユニットテストコードを実行します。
  • build: ビルドおよびパッケージ化の指示を実行して、アプリケーションを Docker イメージにパッケージ化します。
  • プッシュ: この段階では主に、ビルドによって構築されたローカル Docker イメージをタグ処理後に Harbor イメージ リポジトリにアップロードし、成功した後にローカル イメージ ファイルをクリーンアップします。
  • デプロイ: このフェーズでは、主に Kubernetes の命令を実行し、Kubernetes によってリリースされたデプロイメント ファイルの構成に従ってコンテナ イメージを Kubernetes クラスターにデプロイします。

デプロイ フェーズでは、Docker イメージが公開され、Kubernetes クラスターに実行されます。これには、Kubernetes デプロイ リリース YAML ファイルの記述が含まれます。具体的な例は以下のとおりです。

  1. ---  
  2. APIバージョン: アプリ/v1
  3. 種類: デプロイメント
  4. メタデータ:
  5. 名前: __APP_NAME__
  6. 仕様:
  7. レプリカ: __REPLICAS__
  8. セレクタ:
  9. 一致ラベル:
  10. アプリ: __APP_NAME__
  11. 戦略:
  12. タイプ: ローリングアップデート
  13. テンプレート:
  14. メタデータ:
  15. ラベル:
  16. アプリ: __APP_NAME__
  17. 仕様:
  18. イメージプルシークレット:
  19. -名前: wudimanong-ecr
  20. コンテナ:
  21. -名前: __APP_NAME__
  22. 画像: __画像__
  23. リソース:
  24. リクエスト:
  25. メモリ: "1000M"  
  26. 制限:
  27. メモリ: "1000M"  
  28. ボリュームマウント:
  29. -名前:タイムゾーン
  30. マウントパス: /etc/localtime
  31. -名前: java-logs
  32. マウントパス: /opt/logs
  33. ポート:
  34. - コンテナポート: __PORT__
  35. 環境:
  36. -名前: SPRING_PROFILES_ACTIVE
  37. 値: __PROFILE__
  38. -名前: JAVA_OPTS
  39. 値: -Xms1G -Xmx1G -Dapp.home=/opt/
  40. ボリューム:
  41. -名前:タイムゾーン
  42. ホストパス:
  43. パス: /etc/localtime
  44. -名前: java-logs
  45. ホストパス:
  46. パス: /data/app/deployment/logs

すべての準備が整ったら、GitLab リポジトリにコードを送信するとビルド パイプラインが自動的にトリガーされ、パイプラインは「.gitlab-ci.yml」ファイルで定義した特定の CI/CD パイプライン ロジックを自動的に実行して、アプリケーションの自動リリースを実現します。

GitLab-CI メカニズムに基づく自動リリース システムは構築が比較的簡単で、多くの開発作業を必要としません。そのため、現在多くのスタートアップ企業がこのタイプのソリューションを使用して、マイクロサービスの自動構築と配信を実現しています。

以上がこの記事で私が伝えたいことの全てです。自動公開システムの実装原理を理解する一助になれば幸いです。

<<:  Huawei CloudがGaussDB(DWS)リアルタイムデータウェアハウスをリリース、技術革新により業界データの価値が向上

>>:  分散ロック、もう少し深く! !

推薦する

10日間で重み7のウェブサイトからの個人的な利益

先ほどA5 Webmaster Networkで、開設からわずか10日で百度重みが7になったという斬...

Airbnbは30億ドルの評価額で1億ドルの調達を目指す

Airbnbは30億ドルの評価額で1億ドルの調達を目指す事情に詳しい関係者によると、サンフランシスコ...

Baidu のアルゴリズムは絶えず更新されています。「トップページにランクインするには何日かかりますか?」というスローガンをどう思いますか?

最近、Baiduはさまざまなレベルで継続的にアップデートされており、多くの規則や規制が追加されていま...

Yaye Cloud: 中小企業がオンラインビジネスを展開する方法

月収10万元の起業の夢を実現するミニプログラム起業支援プラン現在、中国には 7 億 2000 万人の...

中国SEO業界の奇妙な現状についてのコメント

昨日、ロビンはDianshiのVIPメンバーとこの非常に興味深いトピックについて話し合いました。私は...

ByteDance 第2回インタビュー: 分散ロックを使用したことはありますか?分散ロック実装ソリューションは何ですか?分散ロックを使用する利点と欠点は何ですか?

導入ビジネス規模の継続的な拡大と技術アーキテクチャの進化により、分散システムは、高同時実行性と大量デ...

Gmailをブロックするのは後退だ

Googleが中国本土から正式に「撤退」してから5周年を迎える前夜、Googleの人気メールシステム...

私の国はクラウド分野では依然として後進国であるが、米国は依然として主導的な地位を維持している。

世界各国の技術競争が激化する中、企業のデジタル変革の基盤となるクラウドコンピューティングは、その強力...

革新か誇大広告か?ローコードに関する10の質問:Tencent Cloudの見解

[元記事は51CTO.comより] 2020年以降、ローコードは業界で話題となり、資本市場と企業ユー...

10月の注目アプリは何ですか?支出額によるゲームとアプリのトップ10

10月に最も人気のアプリは何ですか?どの開発会社が資金援助者ですか? App Growing は、ネ...

Docker のマルチステージイメージ構築を理解する

Docker テクノロジーは、2013 年の誕生以来 4 年以上にわたって存在しています。日常の開発...

QingCloud、エンタープライズレベルのフルスタッククラウドICTマトリックスを構築するために9つの主要ブランドを立ち上げ

エンタープライズレベルのフルスタッククラウドICTサービスプロバイダーであるQingCloud(qi...

トラフィック調査: Python がプログラマーと企業に最も多く検索されるプログラミング言語に

技術の急速な発展により、すべてのソフトウェア開発者、エンジニア、その他の技術者は、常に技術の最前線に...

Ramnode-128m メモリ openvz 簡易評価

本日、Host Cat は Ramnode から 128M メモリの VPS [Ramnode-VP...