基幹業務システムのためのKubernetes環境をOracle Cloud Infrastructureで構築する

カバー

[!] この記事は公開されてから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を無効化する
  • ウイルス対策ソフトをインストールする

このようなワーカーノードを作成するため、以下の手順を実施します。

  1. コンピュートインスタンスを作成する
  2. コンピュートインスタンスにアクセスし、上記を設定する
  3. カスタムイメージを作成する
  4. カスタムイメージをもとにノードプールを作成する

この手順において気をつけるポイントが、2つあります。

OKEがサポートしているOracle Linuxイメージで、コンピュートインスタンスを作成する

OKEでは、OCIで提供されているOracle Linuxイメージの一部のみがサポートされていてます。以下のOCI CLIコマンドで確認できます。

$ oci ce node-pool-options get --node-pool-option-id [クラスターOCID] | jq .data.sources

カスタムイメージは、このコマンドで確認できたOracle Linuxイメージをもとに作成します。

OCIコンソールからは、カスタムイメージをもとにノードプールの作成ができない

代わりにOCI CLIコマンドを使用して、作成済みのOKEクラスターにノードプールを追加するアプローチをとります。以下のコマンドのオプション「node-image-id」にカスタムイメージのOCIDを指定することで、カスタムイメージをもとにしたノードプールを作成できます。

$ oci ce node-pool create \
  --cluster-id [クラスターOCID] \
  --compartment-id [コンパートメントOCID] \
  --kubernetes-version [Kubernetesバージョン] \
  --name [ノードプール名] \
  --node-shape [シェイプ] \
  --initial-node-labels '[{"key":"[Label Key]","value":"[Label Value]"}]' \
  --node-boot-volume-size-in-gbs [ブートボリュームサイズ] \
  --node-image-id [イメージOCID] \
  --node-shape-config '{"memoryInGBs":[メモリ数],"ocpus":[OCPU 数]}' \
  --placement-configs '[{"availabilityDomain":"[可用性ドメイン名]","subnetId":"[サブネットOCID]"}]' \
  --size [ワーカーノード数] \
  --region [リージョン名] \

カスタムイメージを使用せずワーカーノードそれぞれに設定を行うこともできますが、ワーカーノードを増やすたびに作業を実施する必要があるため、カスタムイメージの利用が推奨されます。

コンテナイメージの取得先レジストリを使い分ける

プライベートサブネット上に構築したOKEクラスターはインターネットと通信できないため、Docker Hubなどのパブリックレジストリからコンテナイメージを取得できません。このため、コンテナイメージの取得にあたっては、2つのイメージレジストリを使い分けることになります。

  • Kubernetes関連コンポーネント用イメージ:サービスゲートウェイを経由して、OCIRから取得
  • 基幹業務システム用イメージ:VCN上で構築したプライベートレジストリから取得

kubectlでOKEクラスターへ接続して動作確認

OKEを操作するためには、kubectlコマンドでコントロールプレーン上のKubernetes APIにアクセスします。具体的には、VCNのサブネットに作成したKubernetes APIエンドポイントを介してアクセスします。kubectlコマンドはKubernetes APIエンドポイントサブネットにアクセスできるネットワーク上から実行する必要があります。

kubeconfigファイルはOCI CLIのコマンドを使用して取得します。実行するコマンドは、OCIコンソールのOKEクラスター詳細画面から確認できます。

$ oci ce cluster create-kubeconfig \
  --cluster-id [クラスターOCID] \
  --file $HOME/.kube/config \
  --region [リージョン名] \
  --token-version 2.0.0 \
  --kube-endpoint PRIVATE_ENDPOINT

これにより、OKEクラスターへ接続することができます。動作確認としてコマンドを実行すると、正常にアクセスできていることがわかります。例えば、以下のコマンド結果ではワーカーノード情報を取得しています。

$ kubectl get node
NAME            STATUS   ROLES   AGE   VERSION
172.16.0.100   Ready    node    66d   v1.19.7
172.16.0.101   Ready    node    66d   v1.19.7
172.16.0.102   Ready    node    66d   v1.19.7
172.16.0.103   Ready    node    66d   v1.19.7
172.16.0.104   Ready    node    66d   v1.19.7
172.16.0.105   Ready    node    66d   v1.19.7
172.16.0.106   Ready    node    66d   v1.19.7
172.16.0.107   Ready    node    20d   v1.19.7
172.16.0.108   Ready    node    66d   v1.19.7

まとめ

OCIのプライベートネットワークでOKEクラスターを構築する方法を紹介しました。オンプレミスの延長としてマネージドなKubernetes環境をクラウドで使う場合、コントロールプレーンの管理などの手間が省ける反面、ネットワークを意識して構築する必要がありました。Webサービスを公開する用途のKubernetes環境とは違ったノウハウになりそうです。

参考URL


TOP
アルファロゴ 株式会社アルファシステムズは、ITサービス事業を展開しています。このブログでは、技術的な取り組みを紹介しています。X(旧Twitter)で更新通知をしています。