CNDT2020シリーズ:CAのインフラエンジニアが解説するKubernetesネイティブなCI/CD

2021年1月6日(水)
松下 康之 - Yasuyuki Matsushita
サイバーエージェントのインフラエンジニア青山昌也氏がKubernetesネイティブなCI/CDを解説。

今回はサイバーエージェントのインフラストラクチャーを担当するエンジニア、青山昌也氏のセッションを紹介する。青山氏はサイバーエージェントのインフラストラクチャー担当としてOpenStackからKubernetesまで幅広くカバーし、最近はKubernetesに関する書籍も執筆するなどの啓蒙活動も行うエンジニアだ。CloudNative Days Tokyo 2020の共同チェアパーソンとしてイベントの運営にも関わっている。

今回のセッションでは、クラウドネイティブなインフラストラクチャーを構築するための出発点として、CI/CDに特化してGit、Tekton、Kaniko、Harbor、Argo CDを組み合わせたワークフローを紹介した。また単なるCI/CDではなくセキュリティを組み込む必要性についても言及し、Open Policy Agent、Trivy、Clairなどのツールも使ってセキュアなCI/CDを解説した。

クラウドネイティブなCI/CDを解説する青山氏

クラウドネイティブなCI/CDを解説する青山氏

青山氏は冒頭から、Kubernetesの動作原理とも言えるControllerについて解説を始めた。これは宣言的なインフラストラクチャーとも言われるKubernetesの根幹とも言える部分で、マニフェストで宣言された「あるべき状態」を維持するためにKubernetesが自動的にリソースを管理する部分である。分散ストレージであるetcdに格納されたリソースの定義と、実際にクラスターの中に存在するリソースの状態を比較し、異なっているのであればそれをクラスターに反映するというループの解説だ。リソースの宣言が「Custom Resource」それを実現するアクターが「Controller」である。

Kubernetes Controllerの解説

Kubernetes Controllerの解説

ここでカスタムリソースの中に実行されるアプリケーションだけではなく、インフラストラクチャーの定義を格納することで、インフラストラクチャーを操作ではなく定義として表現する「Infrastructure-as-code」が実装できるとして、すべてをKubernetesのリソースとして定義するKubernetes-nativeになると説明した。

そしてすべてがKになる

そしてすべてがKになる

しかし原理としては理解してもそれを現実に体感することは小規模なデモ環境では難しいと語り、そのためのテストベッド環境の設置を予定していると述べた。そしてこのセッションでは、その環境の中からCI/CDに関する部分だけを解説すると語った。

Kubernetes-nativeなシステムにおけるCI/CDだけを解説

Kubernetes-nativeなシステムにおけるCI/CDだけを解説

まずGitOpsによるCI/CDの実装例として、Gitにソースコードの変更がPushされた後にCIが回り、その後、KubernetesのマニフェストとしてCDのワークフローの定義がPushされることで、すべての構成情報がGit上に存在する仕組みを解説した。

ここではソースコードの入れ物としてのGitと、Kubernetesの構成情報(インフラストラクチャーの構成、ワークフローの定義)の入れ物としてのGitの2つが存在することを強調した。こうすることでインフラストラクチャー構成のためのすべての情報がGit上で管理されることを目指すのがGitOpsであると説明した。

ソースコード用のGitとマニフェスト用のGitを分けて管理することは、この後に解説されるArgo CDのブログでも推奨されている方法となっている。

参考:5 GitOps Best Practices

CIの概要を解説

CIの概要を解説

このスライドではCIのために使われるツールをプロセスごとに解説するもので、パイプラインの定義と実行はTekton、アプリケーションのテストはIDEやxUnitなどのツール(ここは利用する言語によって異なる)、ビルドにはKaniko、生成されたコンテナのリポジトリーにはHarborを使う例が紹介された。

ここからは、Tektonを使ったパイプラインの定義について解説が行われた。

TektonのパイプラインはKubernetesのカスタムリソースとして実装される

TektonのパイプラインはKubernetesのカスタムリソースとして実装される

実際にマニフェストの定義がパイプラインのどの要素に対応しているのか? を説明し、TektonにおけるTask、Params、Resourceなどの用語の解説を行った。

Taskを組み合わせてPipelineを作る

Taskを組み合わせてPipelineを作る

実際に定義されたPipelineを実行するのはPipelineRunであり、ここで具体的なリポジトリーなどの実体を指定することを解説。また実行開始の契機となるイベント(ここではGitHubから送られてくるとする)を使ってGitHub上で何かのアクション(コミットやタグ付け)によってCIが自動的に実行されることを説明した。

GitHubからのイベントをきっかけにCIが実行される例を紹介

GitHubからのイベントをきっかけにCIが実行される例を紹介

またワークフローにおいては条件分岐も必要になる場合についても解説を行った。Tektonのパイプラインにおいては、ConditionリソースとCEL(Common Expression Language)の2つの方法があることを紹介した。

パイプラインの中での条件分岐の方法

パイプラインの中での条件分岐の方法

次に解説を行ったのは、コンテナイメージのビルドを行うKanikoだ。ここでは「Dockerコンテナをどのようにビルドするのか?」「セキュリティ上のリスクが低いのはどの方法か?」に着目しており、Docker in Docker、Docker outside of Dockerなどではなく、Kanikoの方式が良いことを説明した。

コンテナイメージのビルドの方法について解説

コンテナイメージのビルドの方法について解説

そしてコンテナイメージを格納するイメージリポジトリーであるHarborの解説に移った。HarborはVMware Chinaが開発したオープンソースソフトウェアで、2019年のKubeCon Chinaでは中国発のオープンソースソフトウェアがCNCFにホストされたとして派手なパーティを行っていたことが記憶に残っている。

イメージリポジトリーのHarborの紹介

イメージリポジトリーのHarborの紹介

単なるリポジトリーという役目だけではなく、脆弱性をスキャンするTrivy(Aqua Securityが開発)やClair(Red Hatが買収したCoreOSが開発)というコンテナスキャナーとの連携や、レプリケーションの機能などをトピックとして紹介した。

これでCIの部分の解説が一通り終わったとして、ここからはArgo CDを使ったCDのプロセスについての解説に移った。

CIの部分の構成図

CIの部分の構成図

Argo CDはIntuitがApplatixを買収した後に公開したソフトウェアだ。Intuitと言えば、北米では絶大なシェアを誇る小規模企業向け会計ソフトウェアとしてとしてご存知の方も多いだろう。IntuitはArgo CDを、自社がクラウドネイティブなシステムに移行する際に必要なパーツであったとブログでも紹介している。ちなみにArgoは、2020年4月にCNCFのインキュベーションプロジェクトとして採用されている。

ここではArgo CDのデリバリーの依存関係の概要、Gitからデリバリーを行う際のリトライなどの機能を紹介した。

Argo CDによるデリバリーの順序を制御する部分の解説

Argo CDによるデリバリーの順序を制御する部分の解説

ここまででCI/CDの一連の流れを解説したことになるが、ここからはこのフローにセキュリティを追加するコンポーネントの説明を行った。

CI/CDが一通り解説された

CI/CDが一通り解説された

最初は、コンテナイメージのスキャナー、ポリシーに基づいてコンテナイメージの実行の可否を判断するOpen Policy Agent(OPA)の解説である。

Trivy/ClairとOPAの位置付け

Trivy/ClairとOPAの位置付け

Harborに格納されたコンテナイメージのスキャンを行うのがTrivy/Clairである。一方OPAは、ArgoからインフラストラクチャーであるKubernetesに変更が加えられる前に、それが事前に定義したセキュリティポリシーに合致しているのかをチェックするものである。

OPAにおいて、ポリシーチェックはRegoという言語で記述すること、2段階でチェックを行う構成が好ましいことを説明した。KubernetesのマニフェストをGitに格納する前のチェック、そして実際にそれを適用する際のチェックの2段階だ。

OPAの概要

OPAの概要

特に横断的にマニフェストをチェックできるとして、複数のマニフェストファイルを指定することを、より高度な使い方として紹介した。

OPAのTipsを紹介

OPAのTipsを紹介

またコンテナイメージスキャンについてはTrivyとClairのそれぞれについて解説したほか、Sysdigが開発しているOPA Image Scanning Admission Controllerについても簡単に紹介した。

Trivy、Clairの概要を紹介

Trivy、Clairの概要を紹介

SysdigのImage Scanning Admission Controllerについては以下を参照されたい。

参考:Performing Image Scanning on Admission Controller with OPA

またPodの実行などに必要となるユーザー名やパスワード、OAuthのトークン、sshのキーなどのシークレット情報の扱い方についても複数の方法があることを紹介し、その中でOAuth2 Proxyによる認証機能などを紹介した。

Podへの通信に使えるOAuth2 Proxy

Podへの通信に使えるOAuth2 Proxy

ここまででKubernetesとGitを中心としたCI/CDのプロセスをセキュアにした形での解説を終えた青山氏だったが、あくまでもこのフローとツーリングは一例であって、CIの部分にはGitHub ActionsやCircleCIなども使えるだろうし、CDにおいてもSpinnakerなどのツールで置き換えることが可能であることを強調してセッションを終えた。

CI/CDに限定したとは言うものの各ツールにおけるTipsもあり、かなり高度な内容となった。全体を理解するには、GitOpsに関する知識も必要だろう。セッションの紹介ページでは「初級者」というタグが付いているが、初級者には相当にハードな内容だったと感じた。

著者
松下 康之 - Yasuyuki Matsushita
フリーランスライター&マーケティングスペシャリスト。DEC、マイクロソフト、アドビ、レノボなどでのマーケティング、ビジネス誌の編集委員などを経てICT関連のトピックを追うライターに。オープンソースとセキュリティが最近の興味の中心。

連載バックナンバー

クラウドイベント
第11回

CNDT2020シリーズ:サイボウズのSREが語る分散ストレージの配置問題を解決するTopoLVMとは

2021/1/13
サイボウズの森本氏によるCeph&Rookにおけるストレージ配置問題を解決するTopoLVMの解説のセッションを紹介する。
クラウドイベント
第10回

CNDT2020シリーズ:ヤフージャパンのインフラを支えるゼットラボが語るKubernetesストレージの深い話

2021/1/8
ゼットラボの坂下氏によるKubernetesのストレージの深い話が行われたセッションを紹介する。
クラウドイベント
第9回

CNDT2020シリーズ:オススメのGitOpsツールをCAのインフラエンジニアが解説

2021/1/7
サイバーエージェントのインフラエンジニア長谷川氏が、GitOpsのためのツールを比較して紹介する。

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています