GitLabを使ったGitOpsのためのマルチクラウドデプロイ:デモ
マルチクラウドの互換性によるGitOpsワークフローのサポート。このデモは、共通のワークフローを使って3つのKubernetesサーバーにアプリケーションをデプロイする方法を説明します。
GitOpsワークフローでは、Gitリポジトリを信頼できる唯一の情報源として使用することでコラボレーションを可能にし、インフラストラクチャチームをまとめてソフトウェアの開発と提供を加速します。オペレーションチームがGitOpsワークフローを使用する場合、GitLabをコアリポジトリとして使用することはバージョン管理以上のメリットがあります。チームは、コラボレーティブプラットフォーム、インフラストラクチャの導入の容易さ、マルチクラウドの互換性を活用するためにGitLabを使用しています。
このデモは、共通のワークフローを使って3つのKubernetesサーバーにアプリケーションをデプロイする方法を説明します。チームはGitLab CIによって提供されるAuto DevOpsを使い、HelmとKubernetesでアプリケーションのデプロイを成功させる方法を学びます。
最初のステップはgitops-demoグループのREADME.mdファイルを開いてgitops-demoグループの構造を確認することです。いくつかのプロジェクトと、インフラストラクチャとアプリケーションという2つのサブグループがあります。
AutoDevOpsの実践
最初の例はASP.NETアプリケーションです。これはHello, Worldと同様のアプリです。 アプリケーションCIファイルには、このアプリケーションのデプロイ方法特有の複数の修正があります。
最初のステップは、いくつかの変数を設定してメインのAuto DevOpsテンプレートをインポートすることです。次に.netコードに適用しやすいいくつかのコマンドをステージ用に上書きし、最後に本番環境をAKSにデプロイするように自動的に設定することが重要となります。
include:
- template: Auto-DevOps.gitlab-ci.yml
variables:
DEPENDENCY_SCANNING_DISABLED: "true"
test:
stage: test
image: microsoft/dotnet:latest
script:
- 'dotnet test --no-restore'
license_management:
stage: test
before_script:
- sudo apt-get update
- sudo apt-get install -y dotnet-runtime-2.2 dotnet-sdk-2.2
production:
environment:
name: aks/production
url: http://$CI_PROJECT_PATH_SLUG.$KUBE_INGRESS_BASE_DOMAIN
パイプラインは自動的に実行され、正常にデプロイされます。パイプラインを表示することで、デプロイの仕組みを確認することができます。
ASP.NETアプリケーションのビルドから本番環境までのパイプラインの流れ。
{:.note.text-center}パイプラインの
内部を簡単に見ると、すべてのジョブが正常に渡されたことがわかります。 Auto DevOps機能はビルドステージを開始し、Dockerコンテナを作成して組み込みのDockerレジストリにアップロードします。テストフェーズは包括的で、コンテナスキャン、ライセンス管理、SAST、ユニットテストが含まれます。テスト結果を詳しく見るには、セキュリティタブとライセンスタブをクリックします。アプリケーションはパイプラインの最終段階で本番環境にデプロイされます。
AKSクラスターの内部
ASP.NETアプリケーションはAKSクラスターにデプロイします。「オペレーション」>「環境」の順に進み、このアプリケーション用に設定された環境を確認します。 PrometheusはすでにGitLabのKubernetesクラスターに統合されているため、HTTPエラーレート、レイテンシレート、スループットなどのメトリックが利用できます。
環境はライブURLをクリックして直接起動でき、AKSで実行されているアプリケーションを確認できます。GitLabで既に構成されているものを超えて、アプリケーションに展開方法を指示する追加のコードはほとんどありません。 Auto DevOps機能は、Helmチャートを作成し、KubernetesとAKSにデプロイします。
このデモでは、Dockerfileを使用して、SpringアプリケーションをASP.NETアプリケーションと同様に構成する方法を学習します。Dockerfileは、リポジトリのルートディレクトリに配置されます。
''' docker
ROM maven: 3 - jdk -8- alpine
WORKDIR/usr/src/app
COPY . / usr/src/app
RUN mvn package
ENV PORT 5000
EXPOSE $PORT
CMD [" sh ", "- c ", "mvn -Dserver.port=${PORT} spring-boot:run"]
'''
Springアプリケーションのデプロイは、ASP.NETアプリケーションとは1つの点で異なります。AutoDevOpsテンプレートへの上書きは必要ありません。これは、デフォルトテンプレートを使用し、AKSの代わりにGoogle Kubernetes Engine(GKE)にデプロイするためです。アプリケーションのデプロイのワークフローは、アプリケーションがどのクラウドにデプロイされているかに関係なく同じです。これにより、マルチクラウドが簡単になります。
この環境では、同様のビルド、テスト、および本番実行を生成することが重要です。このステップを実行することで、チームは同じメトリクス、エラー率、レイテンシー、スループットを得ることができます。この場合、アプリケーションはGoogle Kubernetes Engine(GKE)クラスターのKubernetes上のコンテナで自動的に実行されます。
最後の例は、EKSにデプロイするPythonアプリケーションです。コンポーネントは上記の例と似ており、gitlab-ci.ymlを使用して本番環境をEKSに変更し、Dockerfileを使用してHelmチャートを作成します。いくつかの上書きもあります。
include:
- template: Auto-DevOps.gitlab-ci.yml
test:
image: python:3.7
script:
- pip install -r requirements.txt
- pip install pylint
- pylint main.py
production:
environment:
name: eks/production
url: http://$CI_PROJECT_PATH_SLUG.$ KUBE_INGRESS_BASE_DOMAIN
'''
GitLab CIファイルは、EKSにデプロイするようにアプリケーションに指示します。
{:.note.text-center}
'```docker
FROM python:3.7
WORKDIR /app
ADD . /app/
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "/app/main.py"
DockerfileはHelmチャートを準備します。
上記の例と同様に、パイプラインは、ビルド、テスト、および本番フェーズの他のアプリケーションと同様に実行されます。アプリケーションがEKSにデプロイされると、ライブリンクを開き、ブラウザウィンドウにPythonアプリケーションを表示できます。
GitLabは、真のマルチクラウドソリューションであり、優れたGitOpsプラクティスを維持しながら、異なるワークフローなしに、使用したいクラウドプロバイダーを決定することを可能にします。これらはすべて、同じワークフローを持つ一貫したインターフェースであり、GitLabと統合されたKubernetesを実行する主要なクラウドへのデプロイを簡単にします。
GitOpsの良いプラクティスのひとつとして、Gitリポジトリをすべてのコードの信頼できる唯一の情報源にするという点があります。GitOpsの手順にはGitリポジトリで十分ですが、GitOpsの中核となるコラボレーション、プロセスの透明性、バージョン管理といったDevOpsツールはほとんどありません。
GitLabの要点であるエピック、イシュー、マージリクエストなどのツールを使用して、チーム間のコミュニケーションと透明性を促進します。インフラストラクチャチームは、GitLabでTerraformまたは[Ansibleテンプレート](/ blog/2019/07/01/using-ansible-and-gitlab-as-infrastructure -for-code/){data- ga-name="ansible" data-ga-location="body"}を使用してコードを構築し、GitLab CIを使用してクラウドにデプロイできます。GitLabは真のマルチクラウドソリューションであり、ワークフローを大幅に強化することなく、GitLab CIとKubernetesを使用してあらゆるクラウドサービスにアプリケーションをデプロイすることができます。