CNDT2020シリーズ:CAのインフラエンジニアが解説する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を解説した。
青山氏は冒頭から、Kubernetesの動作原理とも言えるControllerについて解説を始めた。これは宣言的なインフラストラクチャーとも言われるKubernetesの根幹とも言える部分で、マニフェストで宣言された「あるべき状態」を維持するためにKubernetesが自動的にリソースを管理する部分である。分散ストレージであるetcdに格納されたリソースの定義と、実際にクラスターの中に存在するリソースの状態を比較し、異なっているのであればそれをクラスターに反映するというループの解説だ。リソースの宣言が「Custom Resource」それを実現するアクターが「Controller」である。
ここでカスタムリソースの中に実行されるアプリケーションだけではなく、インフラストラクチャーの定義を格納することで、インフラストラクチャーを操作ではなく定義として表現する「Infrastructure-as-code」が実装できるとして、すべてをKubernetesのリソースとして定義するKubernetes-nativeになると説明した。
しかし原理としては理解してもそれを現実に体感することは小規模なデモ環境では難しいと語り、そのためのテストベッド環境の設置を予定していると述べた。そしてこのセッションでは、その環境の中からCI/CDに関する部分だけを解説すると語った。
まずGitOpsによるCI/CDの実装例として、Gitにソースコードの変更がPushされた後にCIが回り、その後、KubernetesのマニフェストとしてCDのワークフローの定義がPushされることで、すべての構成情報がGit上に存在する仕組みを解説した。
ここではソースコードの入れ物としてのGitと、Kubernetesの構成情報(インフラストラクチャーの構成、ワークフローの定義)の入れ物としてのGitの2つが存在することを強調した。こうすることでインフラストラクチャー構成のためのすべての情報がGit上で管理されることを目指すのがGitOpsであると説明した。
ソースコード用のGitとマニフェスト用のGitを分けて管理することは、この後に解説されるArgo CDのブログでも推奨されている方法となっている。
このスライドではCIのために使われるツールをプロセスごとに解説するもので、パイプラインの定義と実行はTekton、アプリケーションのテストはIDEやxUnitなどのツール(ここは利用する言語によって異なる)、ビルドにはKaniko、生成されたコンテナのリポジトリーにはHarborを使う例が紹介された。
ここからは、Tektonを使ったパイプラインの定義について解説が行われた。
実際にマニフェストの定義がパイプラインのどの要素に対応しているのか? を説明し、TektonにおけるTask、Params、Resourceなどの用語の解説を行った。
実際に定義されたPipelineを実行するのはPipelineRunであり、ここで具体的なリポジトリーなどの実体を指定することを解説。また実行開始の契機となるイベント(ここではGitHubから送られてくるとする)を使って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にホストされたとして派手なパーティを行っていたことが記憶に残っている。
単なるリポジトリーという役目だけではなく、脆弱性をスキャンするTrivy(Aqua Securityが開発)やClair(Red Hatが買収したCoreOSが開発)というコンテナスキャナーとの連携や、レプリケーションの機能などをトピックとして紹介した。
これでCIの部分の解説が一通り終わったとして、ここからはArgo CDを使ったCDのプロセスについての解説に移った。
Argo CDはIntuitがApplatixを買収した後に公開したソフトウェアだ。Intuitと言えば、北米では絶大なシェアを誇る小規模企業向け会計ソフトウェアとしてとしてご存知の方も多いだろう。IntuitはArgo CDを、自社がクラウドネイティブなシステムに移行する際に必要なパーツであったとブログでも紹介している。ちなみにArgoは、2020年4月にCNCFのインキュベーションプロジェクトとして採用されている。
ここではArgo CDのデリバリーの依存関係の概要、Gitからデリバリーを行う際のリトライなどの機能を紹介した。
ここまででCI/CDの一連の流れを解説したことになるが、ここからはこのフローにセキュリティを追加するコンポーネントの説明を行った。
最初は、コンテナイメージのスキャナー、ポリシーに基づいてコンテナイメージの実行の可否を判断するOpen Policy Agent(OPA)の解説である。
Harborに格納されたコンテナイメージのスキャンを行うのがTrivy/Clairである。一方OPAは、ArgoからインフラストラクチャーであるKubernetesに変更が加えられる前に、それが事前に定義したセキュリティポリシーに合致しているのかをチェックするものである。
OPAにおいて、ポリシーチェックはRegoという言語で記述すること、2段階でチェックを行う構成が好ましいことを説明した。KubernetesのマニフェストをGitに格納する前のチェック、そして実際にそれを適用する際のチェックの2段階だ。
特に横断的にマニフェストをチェックできるとして、複数のマニフェストファイルを指定することを、より高度な使い方として紹介した。
またコンテナイメージスキャンについてはTrivyとClairのそれぞれについて解説したほか、Sysdigが開発しているOPA Image Scanning Admission Controllerについても簡単に紹介した。
SysdigのImage Scanning Admission Controllerについては以下を参照されたい。
参考:Performing Image Scanning on Admission Controller with OPA
またPodの実行などに必要となるユーザー名やパスワード、OAuthのトークン、sshのキーなどのシークレット情報の扱い方についても複数の方法があることを紹介し、その中でOAuth2 Proxyによる認証機能などを紹介した。
ここまででKubernetesとGitを中心としたCI/CDのプロセスをセキュアにした形での解説を終えた青山氏だったが、あくまでもこのフローとツーリングは一例であって、CIの部分にはGitHub ActionsやCircleCIなども使えるだろうし、CDにおいてもSpinnakerなどのツールで置き換えることが可能であることを強調してセッションを終えた。
CI/CDに限定したとは言うものの各ツールにおけるTipsもあり、かなり高度な内容となった。全体を理解するには、GitOpsに関する知識も必要だろう。セッションの紹介ページでは「初級者」というタグが付いているが、初級者には相当にハードな内容だったと感じた。
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- Oracle Cloud Hangout Cafe Season4 #3「CI/CD 最新事情」(2021年6月9日開催)
- CNDT2020シリーズ:オススメのGitOpsツールをCAのインフラエンジニアが解説
- OpenShift Commons Gatheringで語られたOpenShiftに最適なCI/CDとは
- CNDT2021、クラスター運用自動化をGitOps的に行う方法論をサイバーエージェントのエンジニアが解説
- CNSC 2022からOSSの脆弱性スキャンツールであるTrivyの作者が語るTrivyの最新情報を紹介
- 「GitOps」を活用して、アプリケーションを効率的かつ自動的にデプロイする
- CNDT 2022、NTTコムのエンジニアがマニフェストレスを実現したIaCのためのSaaSを解説
- CNDT 2022、ChatworkのSREがコンテナセキュリティのための新しいツールを紹介
- Red Hatがセキュリティ強化と自動化がポイントのOpenShift 4.3をリリース
- CNDT2021、NTTComのアーキテクトがDevOpsに繋がるフィードバックループを解説