はじめに
Kubernetesはコンテナアプリを分散環境にデプロイ・運用管理するためのオーケストレーションツールです。もともとGoogleが社内システムで利用していたものをOSS化したもので、今日ではGoogleのみならずMicrosoftやRed Hatなども開発に積極的に参加し、コンテナオーケストレーションツールの事実上のデファクトスタンダードになりつつあります。
しかしながら、業務システムでコンテナアプリケーションを開発・運用するためにはKubernetesだけを学習すればよいかというとそういうわけでなく、開発ライフサイクル・監視・高度なセキュリティなど周辺のエコシステムの動向も含めてキャッチアップする必要があります。
また、アプリケーション開発者にとってはコードを書くことに集中したいものの、Kubernetesには独特の概念があり開発の流れも速いため、一般的に学習コストが高いと言われています。
そこで本記事では、Red Hat社が提供するエンタープライズ向けコンテナプラットフォームであるRed Hat OpenShift Container Platform(以下、OpenShift)の概要をご紹介します。また、業務システムでの利用実績の多いクラウド「Azure」を使ってJavaベースのコンテナアプリケーションをデプロイする方法や、OSSのエディターである「Visual Studio Code」を使った開発例もご紹介します。
なかなか最初の一歩が踏み出しづらいKubernetesベースのコンテナアプリケーション開発を手軽に始めてみましょう。
OpenShiftの概要
OpenShiftは、Red Hat社が提供するLinuxとKubernetes、CI/CDに必要なOSSをエンタープライズで利用するためのコンテナアプリ開発・実行プラットフォームです。
OpenShiftを利用することで、アプリケーションのアーキテクチャに関係なく、あらゆるインフラストラクチャで、オンプレミス、仮想化、プライベートクラウド、パブリッククラウドなど任意の環境でのクラスター構築・アプリケーション開発とデプロイができます。
OpenShiftとは
OpenShiftは「大規模なシステムでもアプリケーション開発者がコードを書くことに集中できる」ことを目指しています。
「開発中はオンプレのサーバで確認したい」「検証環境・本番環境はクラウドにて運用したい」などの場合も、それぞれの環境にOpenShiftクラスターを構築すれば、アプリケーションがどこでも実行可能になるのが特徴です。
執筆時点での最新版となるOpenShift Container Platform 4.2(以下、OpenShift 4.2)では、環境を容易に構築するためのインストーラーが提供されています。
主要なクラウドベンダーはKubernetesのマネージドサービスを提供していますが、CI/CD Pipelineの設定や監視、イメージの管理などの周辺技術はクラウドベンダーに依存する部分もあります。しかし、OpenShiftの場合はハイブリット環境での動作をサポートしていますので、ベンダーロックインのリスクを減らすことも可能です。
OpenShiftとKubernetesは何が違う?
OpenShiftはKubernetesをベースに開発されており、コンテナアプリケーションの宣言的デプロイメント、オートヒーリングやオートスケールなどのオーケストレーターの基本機能を備えています。では、Kubernetesとは何が違うのでしょうか?
実装レベルでは異なる部分も多いですが、アプリケーション開発者目線でみたときに、Kubernetesの基本機能に加えて、次のような機能が付加されているのが特徴です。
CI/CDを実現するための機能
OpenShiftはS2I(Source to Image)という機能でコンテナイメージをビルドできます。このS2Iはソースコードを含んだGitリポジトリを指定しoc new-app
コマンドを実行すると、Gitリポジトリのソースコードがどの言語で書かれているかを自動的に検出し、ビルドを実行するものです。そのため開発者はコードを書くだけで、実行可能なバイナリを含むコンテナイメージを容易に作成できます。
コンテナー化したJenkinsを提供しており、並列でのビルドパイプラインを実行できます。またRouter(HAProxy)を使うとアプリケーションの複数バージョンに対してBlue-Greenデプロイやカナリアリリースなど複雑なデプロイ方式が実現できます。
コンテナイメージを保存するためのレジストリ機能
Kubernetesはコンテナオーケストレーションツールのため、コンテナイメージを保存するレジストリを外部に用意する必要があります。このコンテナイメージにはアプリケーションのソースコードやインフラの構成などが含まれるためセキュアに管理する必要があります。
OpenShiftはソースコードからビルドされたコンテナイメージを配置するためのレジストリを、クラスター内部にあらかじめ用意しています。これにより修正されたソースコードから新バージョンのコンテナイメージのビルドから、新バージョンのコンテナーをデプロイ及び旧バージョンのコンテナーの削除まで、一気通貫したデプロイの自動化を実施できます。また、コンテナイメージを低レイテンシでWorkerノードに展開できるようにもなります。
メトリクスやログを収集・可視化する機能
コンテナアプリケーションはプロセスとして動作し、必要な時に作成され、不要な時に削除される一時的なリソースです。このためこれらのログをきちんと収集しトレースするしくみ(分散トレーシング)が必要です。
OpenShiftではCPU・メモリ・ディスク使用率などのコンテナーおよびクラスターのメトリクスを取得し、可視化する機能を持っています。この機能のバックエンドとしてメトリクスの取得においてはPrometheusが、可視化においてはGrafanaが使用されています。またログの取得においてはFluentdが、蓄積・分析にはElasticsearchが、可視化はKibanaが使用されています。
補足:機能面以外にもサポートの有無という違いが
OpenShiftとKubernetesは機能的な違いのほかにも異なる点があります。
Kubernetesはオープンソースソフトウェアのため基本的にはコミュニティベースで開発されます。Kubernetesの仕様やAPIの変更/廃止もあります。また、脆弱性やバグなどの情報もキャッチアップしながら運用するには、高度なスキルが必要です。一方エンタープライズシステムでは、ミッションクリティカルなワークロードも多く安定稼働が求められます。OpenShiftはRed Hat社によるロングタイムサポートが受けられるのが特徴です。たとえばOpenShift 3.11のベースとなっているKubernetes 1.11もOpenShiftであれは、最長で2024年6月までサポートが受けられれます。
そのため、「Kubernetesのもつメリットの恩恵を受けたいけど、サポートも必要だな」という場合はOpenShiftを検討するとよいでしょう。
OpenShift 4.2の注目機能
OpenShift 4.2は、サービスメッシュ、サーバーレス実行、クラウドネイティブアプリケーションのCI/CDパイプラインに関するニーズに対応するための開発者向け機能を提供しています。
Red Hat OpenShift Service Mesh
OpenShift上でKubernetesアプリケーションのサービス間通信を制御する「サービスメッシュ」を実現する機能です。
サービスメッシュとは、マイクロサービス化に伴って生じるサービス間通信の複雑化を解消するために開発されたものです。
このサービスメッシュを実現するテクノロジーとしてはGoogleやLyftが開発したオープンソースのIstioが有名ですが、OpenShift Service MeshはIstioの機能を拡張することで、サービス間通信の制御をシンプル化、容易化しているのが特徴です。たとえば、Istioによって行うサービスメッシュの作成・管理に加えて、可視化や分散トレーシング、計測、トポロジーの可視化などの機能を追加しています。
Red Hat OpenShift Serverless
OpenShift Serverlessは、開発者がオンデマンドにスケールするアプリケーションをデプロイおよび実行するための機能です。オープンソースのKnativeをベースにしており、執筆時点ではテクノロジープレビュー扱いとなり、Red Hatのサポート対象外の機能となります。開発者はコンソールからサーバーレスを利用するように指定するだけで、Gitリポジトリのソースコードやプライベートのコンテナイメージからサーバーレスのアプリケーションを簡単に作成できるようになります。
Red Hat OpenShift Pipelines
継続的インテグレーションと継続的デリバリー(CI/CD)は、開発者がより迅速かつ確実に展開できるようにするものです。CI/CDツールを使用すると、開発チームはコードを書いてから本番環境にデプロイするまでの多くのタスクを自動化できます。
OpenShiftでは、CI/CD機能にJenkinsまたはOpenShift Pipelinesを使用できます。OpenShift PipelineはTektonという次世代のパイプラインビルドツールをベースとしており、オンプレミスやマルチクラウドのOpenShift環境を抽象化するクラウドネイティブなツールです。執筆時点ではデベロッパープレビュー扱いとなり、Red Hatのサポート対象外の機能となります。パイプライン起動時にのみコンテナを生成する実行モデルであるため、Jenkinsよりも効率的にリソース活用できるようになります。
コラム:OpenShiftとKubernetesのバージョン対応
OpenShiftはKuberneteをベースに開発されており、内部でKubernetesのコンポーネントが動作しています。それぞれのバージョン表は以下の通りです。
Kubernetesのバージョン | OpenShiftのバージョン |
---|---|
1.13 | 4.1 |
1.14 | 4.2 |
またコンテナランタイムはDockerではなくCRI-Oが採用されています。このCRI-OはKubernetes Incubator Projectとして開発され、CRIとOCIの2つの標準に準拠した軽量コンテナランタイムで、2017年10月に正式にリリースされました。