[!] この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
今日、コンテナでWebアプリケーションを運用するケースが増えてきました。当社の基幹業務システムのリプレースにおいてもコンテナを採用し、クラウド上のKubernetes環境へ移行しました。具体的には、Oracle Cloud Infrastructure(OCI)のマネージドなKubernetesサービスであるOracle Container Engine for Kubernetes(OKE)を採用しました。外部公開用のサービスではなく、社内システムを稼働させるためのOKEクラスターを作成する流れについて紹介します。
この記事はOCIやKubernetesの基礎的な知識を持つ方を想定しています。紹介するOKEクラスターは2021年夏に構築したもので、Kubernetesのバージョンはv1.19です。
OCIとKubernetesを採用した背景
当社の基幹業務システムは、勤怠管理、スキル管理、案件管理、パートナー管理など8つのシステムで構成されます。いずれもパッケージ製品ではなくスクラッチ開発であり、開発言語はJava、データベースはOracleDBを採用しています。長年、オンプレミスで稼働させていましたが、OracleDBのライセンスコストを考慮して、OCIへの移行を決断しました。
さらに、Javaをはじめとするミドルウェアのバージョンアップ対応や将来のシステムリニューアルを念頭に、拡張性や柔軟性を重視して、アプリケーションのコンテナ化と、基盤としてのKubernetesの採用も決まりました。とはいえ、Kubernetesの利用が初めてということもあり、問題発生時にサポートに問い合わせできるのが望ましいことから、マネージドなKubernetesサービスであるOKEを選択しました。有償の帳票ソフトや大容量ディスクが必要な一部のサーバー(ログ管理、ソースコード管理)をVMで構築したものの、基幹業務システムのアプリケーションサーバーとCI/CDツールはKubernetes上で稼働することになりました。
事前準備:ネットワーク設計
OKEクラスターを作成する前に、ネットワークを作成する必要があります。基幹業務システムを稼働させる目的を踏まえると、ネットワーク要件は以下のとおりです。
- VPNで接続しているオンプレミスのネットワークからアクセスできる
- インターネットからアクセスできる必要はない
- Kubernetesのコントロールプレーンやレジストリと通信できる
具体的なネットワーク構成は、以下のイメージです。
ここからは、Virtual Cloud Network(VCN)が作成済み、オンプレミスとインターネットVPN接続も完了している前提で、OKEの利用に必要なポイントを説明していきます。
OKEクラスターで必要なサブネットを作成する
OKEでは、以下のサブネットが必要になります。クラスターを構築する前にプライベートサブネットとして作成しておきます。
- Kubernetes APIエンドポイントサブネット:Kubernetes APIへのアクセスを提供するエンドポイントを配置するサブネット
- ワーカーノードサブネット:ワーカーノードを配置するサブネット
- ロードバランサーサブネット:LoadBalancerタイプのServiceとして作成されるOCIロードバランサーを配置するサブネット
サービスゲートウェイを作成して、ルートテーブルを調整する
OKEのコントロールプレーンやOracle Cloud Infrastructure Registry(OCIR)などのOracleサービスには、通常はインターネットを介してアクセスするためにパブリックIPアドレスが割り振られています。しかし、Kubernetes APIエンドポイントやワーカーノードを配置するサブネットをプライベートサブネットとして作成する場合、インターネットと通信できないため、以下のような問題が発生します。
- Kubernetes APIエンドポイントとワーカーノードがコントロールプレーンと通信できない
- ワーカーノードがOCIRからコンテナイメージを取得できない
そこで、プライベートサブネットから特定のOracleサービスにプライベートな通信を行うために、サービスゲートウェイを使用します。Kubernetes APIエンドポイントとワーカーノードがコントロールプレーンと通信する場合、ワーカーノードがOCIRからコンテナイメージを取得する場合などに、サービスゲートウェイを経由します。
VCN上にサービスゲートウェイを作成したら、Kubernetes APIエンドポイントサブネットとワーカーノードサブネットのルートテーブルで、サービスゲートウェイを指定するルートを追加します。
OKEクラスターの構築
他のマネージドなKubernetesサービスと同様に、コントロールプレーンとワーカーノードを作成していきます。
コントロールプレーンを作成する
コントロールプレーンの作成は、OCIコンソールにおいて設定を入力するだけです。オプションとしてKubernetesリソース(Pod、Service)のCIDRの範囲を設定できますが、この設定をデフォルトから変更する場合、以下の制限があります。
- Serviceが使用するCIDRの範囲は、OKEクラスターが使用するVCNのCIDRの範囲と重複できない
- Podが使用するCIDRの範囲は、Kubernetes APIエンドポイントサブネット、ワーカーノードサブネット、ロードバランサーサブネットが使用するCIDRの範囲と重複できない
ワーカーノードをカスタムイメージで作成する
OKEクラスターにおいて、ワーカーノードはノードプールで管理されます。ノードプールとは、同じ構成をもつワーカーノードのサブセットです。当社内のセキュリティ要件やサービスの可用性を考慮して、以下の構成としています。
- ファイアウォールを設定する
- SELinuxを無効化する
- ウイルス対策ソフトをインストールする
このようなワーカーノードを作成するため、以下の手順を実施します。
- コンピュートインスタンスを作成する
- コンピュートインスタンスにアクセスし、上記を設定する
- カスタムイメージを作成する
- カスタムイメージをもとにノードプールを作成する
この手順において気をつけるポイントが、2つあります。
OKEがサポートしているOracle Linuxイメージで、コンピュートインスタンスを作成する
OKEでは、OCIで提供されているOracle Linuxイメージの一部のみがサポートされていてます。以下のOCI CLIコマンドで確認できます。
カスタムイメージは、このコマンドで確認できたOracle Linuxイメージをもとに作成します。
OCIコンソールからは、カスタムイメージをもとにノードプールの作成ができない
代わりにOCI CLIコマンドを使用して、作成済みのOKEクラスターにノードプールを追加するアプローチをとります。以下のコマンドのオプション「node-image-id」にカスタムイメージのOCIDを指定することで、カスタムイメージをもとにしたノードプールを作成できます。
カスタムイメージを使用せずワーカーノードそれぞれに設定を行うこともできますが、ワーカーノードを増やすたびに作業を実施する必要があるため、カスタムイメージの利用が推奨されます。
コンテナイメージの取得先レジストリを使い分ける
プライベートサブネット上に構築したOKEクラスターはインターネットと通信できないため、Docker Hubなどのパブリックレジストリからコンテナイメージを取得できません。このため、コンテナイメージの取得にあたっては、2つのイメージレジストリを使い分けることになります。
- Kubernetes関連コンポーネント用イメージ:サービスゲートウェイを経由して、OCIRから取得
- 基幹業務システム用イメージ:VCN上で構築したプライベートレジストリから取得
kubectlでOKEクラスターへ接続して動作確認
OKEを操作するためには、kubectlコマンドでコントロールプレーン上のKubernetes APIにアクセスします。具体的には、VCNのサブネットに作成したKubernetes APIエンドポイントを介してアクセスします。kubectlコマンドはKubernetes APIエンドポイントサブネットにアクセスできるネットワーク上から実行する必要があります。
kubeconfigファイルはOCI CLIのコマンドを使用して取得します。実行するコマンドは、OCIコンソールのOKEクラスター詳細画面から確認できます。
これにより、OKEクラスターへ接続することができます。動作確認としてコマンドを実行すると、正常にアクセスできていることがわかります。例えば、以下のコマンド結果ではワーカーノード情報を取得しています。
まとめ
OCIのプライベートネットワークでOKEクラスターを構築する方法を紹介しました。オンプレミスの延長としてマネージドなKubernetes環境をクラウドで使う場合、コントロールプレーンの管理などの手間が省ける反面、ネットワークを意識して構築する必要がありました。Webサービスを公開する用途のKubernetes環境とは違ったノウハウになりそうです。