DevOpsライフサイクルを高速回転させる「クラウドネイティブ・アプリケーションプラットフォーム(CNAP)
「Microsoft Ignite」登壇アーカイブ動画の視聴はこちら
こんにちは、ソフトバンクの渡邉です。
あまりイメージがないかもしれませんが、ソフトバンクでは成長戦略「Beyond Carrior」を掲げ、「クラウド事業」とくに「アプリケーション領域」にも力を入れています。
この記事では、「クラウドネイティブ・アプリケーションプラットフォーム(以下、CNAP)」というサービスをご紹介します。
CNAPは、「インフラ知識がないアプリケーション開発者でも、自分自身で簡単にインフラ環境準備ができるプラットフォームサービス」です。
いわばインフラのローコード化ともいうべきサービスで、リリースプロセス短縮によりDevOpsライフサイクルを高速回転させることができます。
KubernetesによるIaC
CNAPはインフラよりの視点から、IaC(infrastructure as code)とその運用を自動化することによって、DevOpsによる開発の加速をサポートするべく設計されています。
その基盤は Kubernetesを中心に据えて、様々なクラウドサービスとOSSの組み合わせによって成り立っています。
Kubernetesはコンテナを利用してサーバーノード、 ネットワーク 等のインフラを仮想化します。これらのインフラの設定は「マニフェスト」と呼ばれるyamlファイルによって定義されます。マニフェストはKubernetesクラスタに適用すると、その宣言と同期してインフラを構成し、さらに構成されたクラスタ内のリソース状態はマニフェストに同期されるため、単に定義に従って一方的に同期されるだけでなく、その状態もマニフェストから確認することができるようになります。
さらに、マニフェストはKubernetesにあらかじめ定義されているものだけではなく、外部APIの呼び出しを定義するカスタムリソース(CRDs)を利用することができます。CRDsを利用して、データベースやストレージ等Kubernetesが苦手とする分野のインフラをクラウドサービスの設定をKubernetesマニフェストで定義して、Kubernetesのインフラ定義と合わせてて扱えるようにすることができます。
CNAPはマネージドクラウドサービスのCRDsによる管理を組み合わせることによって、全てをKubernetesマニフェストを利用したIaCで管理するインフラを実現しています。
helmによるパッケージング
Kubernetesマニフェストは単なるyamlファイルなので、それ自体にテンプレート機能などはありません。適用する先のクラスタによって内容を少し変更し変更したいといったユースケースを実現するためには、完全にマニフェストを分離して、環境ごとに完全なマニフェストを用意する必要があります。
CNAPではこれに対応するため、helmを利用したマニフェストのパッケージングを行っています。helm はテンプレートを利用してマニフェストにパラメータを設定し、yaml の特定のフィールドに適用することができます。これによって、異なるクラウドプラットフォームへの対応を効率化しています。
ただし、helmはあくまでテンプレートエンジンとそれを適用するためのツール群であり、helmパッケージをクラスタに適用するためには、 helmコマンドを利用したオペレーションが必要となります。
Continuous Deployment (CD)
KubernetesマニフェストやhelmによってIaCを実現してもマニフェスト自体は単なる yaml ファイルなので、これをKubernetesクラスタに適用しなければインフラを構築することはできません。Kubecrtrlを利用して手動で適用してもDevOpsとは言えますが、無数のマニフェストを手順を追って適用しなければならないことを考えると現実的ではありません。
helmを利用すると、機能毎にマニフェストをグループ化して適用を簡略化することができます。それでも、helmパッケージ自体のインストールにはインストールというオペレーションが必要です。規模が大きくなるとパッケージ間の依存関係を考慮してインストール順を管理する必要が出てきたりと、そのオペレーションは複雑になっていきます。
このような問題を解決するには、特定のトリガによって指定した手順によってマニフェストを適用してくれるCDツールがあると便利です。CNAPではGitのリモートリポジトリに発生したイベントを監視し、Gitリポジトリで管理されているマニフェストを適用する flux CDを採用しています。
fluxを利用すると、これらのオペレーション自体をCRDsによって定義することができ、kubernetesだけでCD環境を構成することができるようになります。
fluxはCNAP自身を管理するコントロールプレーンクラスタにも、ユーザー向けに適用するマネージドクラスタにも採用されています。
flux の機能
fluxの重要な機能は以下の4つです。それぞれに対応するCRDsによって設定を管理します。
- Git リポジトリの管理
- helm リポジトリの管理
- Kustomization によるマニフェストの適用
- HelmRelease による helm オペレーションの実行
他にも便利な機能はたくさんありますが、CDを構成するために重要になってくるのはこの4つです。この4つの関連性を正しく理解することによって、様々な制御を行うことができるようになります。
リポジトリの管理
Gitもhelmもリモートリポジトリでマニフェストやhelmパッケージを管理する機能を持っています。fluxはこれらのリモートリポジトリをCRDsを利用してマニフェストに定義し、Kubernetesリソースとして扱うことができるようにします。
リポジトリのuriやブランチ、認証方法等を定義し、CDで適用する 「リソースをどこから取得するのか。」を定義します。
Kustomization の適用
Kustomizationとはkubectlにも含まれているkustomizeで出力するマニフェスト定義のことを指します。kustomizeの主な機能はkustomization.yamlファイルに定義された Kustomization CRDsに列挙されたマニフェストファイルを結合して出力することです。
fluxのKustomization機能はGitリポジトリのどこにkustomization.yamlがあるかを CRDsに定義することで、kustomizeによって出力されたマニフェストをクラスタに適用します。
helm オペレーションの実行
helmパッケージをインストールするにはhelmコマンドを実行するというオペレーションを行う必要がありますが、fluxはこれを行うオペレータを提供します。
オペレータに対しては、いつどのようにhelmパッケージをインストールしたりアップデートしたりするのか指示を与えるようにする必要がありますが、これを指定するのが HelmRelease CRDsです。helmインストールをCRDsを利用して定義することができるようになることによって、前述のKustomizationにHelmReleaseのマニフェストを含めることができるようになり、一連のCDオペレーションを実現することができるようになります。
これによって、fluxでhelmを管理するための最も基本的な以下のパターンを実現します。
GitリポジトリにHelmReleaseマニフェストを配置してKustomizationマニフェストでその場所を指定する。
この組み合わせをGitで管理することによって、以下のようなオペレーションを簡単に自動化することができます。
- Gitのマスターブランチにマージされたらステージング環境にリリース
- Gitでリリースタグを打ったら商用環境にリリース
- helmパッケージのパッチーバージョンリリースがあったら自動リリース
- helmパッケージ間の依存関係を定義して順番にインストール
- webアプリケーションはBlue/Greenリリース
CNAPを利用すると、面倒なインストール作業や設定を行わなくても、これらの機能を利用することができます。
おわりに
以上、CNAPの採用するCDについてご紹介しました。CNAP には他にもマニフェストの自動作成などたくさんの機能があります。
CNAPを利用したアプリケーション運用にご興味をお持ちの方はぜひこちらのWebサイトもご覧ください。
関連リンク
「Microsoft Ignite」登壇アーカイブ動画の視聴はこちら
この記事の著者:渡邉哲也
業務システム向けの web アプリケーション設計開発から始まり、現在は業務システムに限定せず新規サービスの企画、設計、開発を行うアプリケーションエンジニアです。kubernetes とは v1.12 のころからの付き合いです。
DevOps Hubのアカウントをフォローして
更新情報を受け取る
-
Like on Facebook
-
Like on Feedly