昨今、もはや当たり前とも言えるCI/CD(継続的インテグレーション/継続的デプロイ)は、Kubernetesの世界でも当然必要な技術です。さまざまなツールが登場し、「それぞれどういった位置付けなのかわからない」というかたも多いのではないでしょうか。
そこで今回は、CI/CDツールについてGitOpsやIaC(Infrastructure as Code)など、さまざまな側面から紹介することで、位置付けをより深く理解していただきます。なお、個別のCI/CD系のツールの使い方などの詳細については次回以降紹介します。
標準化の動き- CDF(Continuous Delivery Foundation)
さまざまなCI/CDツール出てくるなかで、ツールに応じた記法を覚えるのは非常に大変なことでしょう。2019年3月12日にCDF(Continuous Delivery Foundation)の設立が発表され、CI/CDの標準化の動きが出てきました。
CDFには以下の4ツールが名を連ねています。パイプラインやソースへのアクセスなどを標準化し、CI/CDのベストプラクティスを構築していくことを狙っています。
- Jenkins:言わずと知れたCI/CDツールの元祖
- Jenkins X:JenkinsをgitとKubernetesの取り扱いに特化させ、自動構築の範囲を大幅に広げたもの
- Tekton:KubernetesのCRD(Custom Resource Definition)として実装されたCDツール
- Spinnaker: Netflixが開発したマルチクラウドに対応したCDツール
どんなツールがあるか
CDF以外にどんなツールがあるかをざっくりと把握するため、ここでは数あるツールのなかから筆者が特に注目しているツールをご紹介しましょう。
なお、「CIに強いツール」「CDに強いツール」といった具合に、各ツールが主眼とする領域は異なります。一方で、住み分けや交通整理が明確に行われているわけではありません。したがって、ツール間で機能重複する面もあります。
Kubernetesに対応しているCDツールは、多数存在します。
-
パブクラ系
- AWS Codeシリーズ:AWSのCI/CDツール
CodeCommit/CodeBuild/CodeDeploy/CodePipelineの機能に分かれる
- Azure DevOps Services:AzureのCI/CDツール
Azure Repos/Pipeline/Artifactsに加え、カンバンによるタスク管理を行うAzure Boardsや、探索的テストを行うAzure Test Plansがある
- Cloud Build:GCPのCI/CDツール
- AWS Codeシリーズ:AWSのCI/CDツール
-
CIに軸足
- Circle CI:Saas型のCI/CDツール
- GitHub Actions:GitHub上のCI/CDツール
-
CDに軸足
- ArgoCD:Kubernetes前提の宣言的CDツール
- FluxCD:Kubernetes前提のGitOps Operator
CIOpsからGitOpsへ(CIとCDの分離)
これまでのCI/CDの問題点を解消するため、「GitOps」と呼ばれる考え方が登場しました。従来からのCI/CDである「CIOps」と対比するかたちで、権限と管理対象の2軸で説明します。
権限 | 管理対象 | |
---|---|---|
CIOps | CIサーバに強い権限 | アプリケーションコード中心 |
GitOps | CIとCDの分離 | 基盤コードも含めて全て(Single Source of Truth) |
CIOpsの特徴は、以下の通りです。
◆権限:CIサーバに強い権限
JenkinsやCircle CIにデプロイまで任せるCIOpsの場合、本番環境へのアクセスなど、CIサーバに強い権限を与える必要がありました。CIサーバは一開発者もアクセスするため、細やかな権限管理が必要となります。何より、CIとCDの境界が曖昧になりやすくなります。
◆管理対象:アプリケーションコード中心
アプリケーションコードはGitで管理されていますが、デプロイに関わるスクリプトや、KubernetesマニフェストなどがGitで管理されていないケースもあります。
一方、GitOpsの特徴は以下の通りです。
◆権限:CIとCDの分離
CIサーバに強い権限を与えることを避けるために、CIとCDを分離することがうたわれています。アプリケーションコードを管理するCIサーバにはCircle CIを、Kubernetesのマニフェストを管理するCDサーバにはArgoCDをといった具合です。
◆管理対象:Single Source of Truth
「Single Source of Truth」と呼ばれる発想で、全てのものはコードとして管理します。IaC(Infrastructure as Code)が普及してきたことも後押ししています。
IaCとの関係
IaCは、以下の3レイヤに大別されます。CI/CDもIaCの一つと捉えることができます。- IaaSレイヤ(狭義のIaC)
- インフラレイヤ構築の自動化を行う、狭義のIaCはこのレイヤを指します。プロビジョニングは主にこの領域を指します。
- 時系列に沿って、さまざまなツールが登場しています。
Puppet(2005) → Chef(2009) → Ansible(2012) → Terraform(2014)
- コンテナレイヤ
- コンテナをどのように作っていくかに主眼を置いたものです。本連載のKubernetesそのものも、こちらに含まれます。
- コンテナ(例:Docker)
- コンテナオーケストレーション(例:Kubernetes/Docker Compose)
- コンテナオーケストレーションのオーケストレーション(例:Helm)
Chart(設定ファイル)を作成することで、Kubernetesのリソース群を作成できます。
- コンテナをどのように作っていくかに主眼を置いたものです。本連載のKubernetesそのものも、こちらに含まれます。
- IaCの進展については、Jenkinsをベースに捉えておくと理解しやすいでしょう。
- Jenkins 1.xの時代までは設定ファイルを直接書くことはあっても、積極的に勧められていたわけではありません。
- Jenkins 2.xからは「Jenkinsfile」が登場し、IaCの要素を備えてきました。
* * *
今回はCI/CDについて説明しました。IaCの考え方はCI/CDの領域にも浸透してきており、GitOpsの前提となっています。マニフェストをGitで管理し、CIとCDを分離するGitOpsを中心に理解しておくとよいでしょう。 個別のツールの利用法については次回以降紹介します。著者紹介
正野 勇嗣 (SHONO Yuji ) -
NTTデータ
課長
2011年まで開発自動化技術のR&Dに従事。その後、開発プロジェクト支援やトラブルシューティング等に主戦場を移す。「ソースコード自動生成」に加えて、JenkinsやMaven等の「ビルド自動化」、JsTestDriverやSelenium等の「テスト自動化」を扱うようになり、多様化する開発自動化技術動向に興味。
最近は第四の自動化であるInfrastructure as Code等の「基盤自動化」の魅力に惹かれている。開発自動化技術に関する雑誌・記事執筆も行う。3児のパパ。