Facebook Twitter
お問い合わせ
TOPICS
更新情報
ホーム > ブログ > Oracle Cloud > Oracle Container Engine for Kubernetes(OKE)クラスタの仮想ノードを試してみた

Oracle Container Engine for Kubernetes(OKE)クラスタの仮想ノードを試してみた

ブログ
Oracle Cloud
2023.04.24

皆さま、こんにちは!y.takanashiです。

 

先日、Oracle Container Engine for Kubernetes(OKE)に新しいオプションが追加され、仮想ノードタイプが選択できるようになりました。

そこで、今回は実際に仮想ノードを使用したクラスタの作成をしてみたいと思います。


仮想ノードとは?

仮想ノードとは、2023年3月にリリースされたOracle Container Engine for Kubernetes(OKE)の新しいオプションで、コンテナ化されたアプリケーションのノード・インフラストラクチャを、オーバーヘッドなしで管理・アップグレード・トラブルシューティングなどを行うことができます。

仮想ノードの大きな特徴は、従量課金制による柔軟な料金体系を提供していることです。

 

従来の管理対象ノードでは、消費するリソースは関係なくデプロイしたワーカー・ノード(コンピュート・インスタンス)のOCPUやメモリに対して課金が発生しましたが、仮想ノードではコンテナ・アプリケーションが消費したリソース(OCPU/メモリ)分のみ課金が発生します。

 

そのため、運用コストを抑えたいケースでは、仮想ノードを使用したクラスタの作成が有用となります。


管理対象ノードとの違い

従来の管理対象ノードと仮想ノードの違いについて、両ノードを使用したクラスタ作成画面を例に挙げながらご紹介します。

以下が管理対象ノードを使用したクラスタの作成画面です。

続いて、以下が仮想ノードを使用したクラスタの作成画面です。

管理対象ノードを使用したクラスタを作成する際、仮想ノードと比較して以下の内容を指定できます。

  • ワーカーノード・サブネット
  • ノードシェイプやOCPU / メモリ数
    ※仮想ノードはE3,E4のノード・シェイプのみ使用可能でしたが、管理対象ノードはノード・シェイプやOCPU数、メモリ容量を柔軟に指定できます。
  • ブート・ボリューム
  • 削除を実行してから処理までの時間(削除猶予期間)
  • Cloud-initスクリプト
  • SSHキー

したがって、以下のユースケースでは仮想ノードは使用できませんのでご注意ください。

  • ワーカー・ノードにSSHログインする必要がある場合
  • Cloud-initファイルを使用したい場合
  • AMD以外のコンピュート・インスタンスを使用したい場合
  • ストレージを使用したい場合

また、現時点(2023年4月)では未実装ですが、今後サポートされる機能は以下の通りです。

  • 自動スケーリング
  • 仮想ノードと管理対象ノードを混合したクラスタ
  • ストレージの使用
  • E3 / E4以外のポッド・シェイプのサポート
  • 仮想ノードに対する予約容量

 

上記に挙げた実装予定の機能の中で、個人的には自動スケーリングが早く実装されることを願っています。


価格

以下が仮想ノードの主なリソースの1時間あたりの価格です。

※ロード・バランサ等のIaaSサービス利用分は、別途課金となります。

  • クラスタ(1クラスタあたり):¥14 / 1 hour
  • 仮想ノード(1ノードあたり):¥2.1 / 1 hour
    ※ポッド・シェイプのOCPU/メモリはOCI側で算出

その他仮想ノードに関する詳細情報については、以下の資料をご覧ください。

OCI公式ドキュメント - 仮想ノードの操作

Speaker Deck - Oracle Container Engine for Kubernetes (OKE) のご紹介


仮想ノードを使用したクラスタの作成

ここでは仮想ノードを使用したOKEクラスタの作成を行います。

手順は、既存の管理対象ノードを使用したクラスタの作成方法と同様となっています。

事前準備

ポリシーの作成

実際にクラスタを作成する前に、まず下記のOCI公式ドキュメントを参考にして、事前準備を行います。

OCI公式ドキュメント - 仮想ノードの操作

以下のポリシーを作成することで、グループに対して仮想ノードや仮想ノードプールを含むクラスタを作成するための必要な権限を付与することができます。

allow group <任意のグループ名> to manage cluster-virtualnode-pools in compartment <任意のコンパートメント名>
allow group <任意のグループ名> to read virtual-network-family in compartment <任意のコンパートメント名>
allow group <任意のグループ名> to manage vnics in compartment <任意のコンパートメント名>

ネットワーク・リソースの構成

続いて、以下を例にネットワーク・リソースを作成します。

リソース名やCIDRブロック等は必要に応じて適宜変更をしておきましょう。

リソース名
VCN名前:vnode-vcn
CIDRブロック:10.0.0.0/16
DNS解決:選択済
インターネット・ゲートウェイ名前:internet-gateway
NATゲートウェイ名前:nat-gateway
サービスゲートウェイ名前:service-gateway
サービス: All NRT Services In Oracle Services Network
DHCPオプションDNSタイプ インターネットおよびVCNリゾルバに設定
VCN、ネットワーク・リソース
リソース用途
Kubernetes APIエンドポイント用サブネット名前:sub-kubeapi
タイプ: リージョナル
CIDRブロック: 10.0.0.0/28
ルート表::routetable-kubeapi
サブネット・アクセス: パブリック
DNS解決:選択済
DHCPオプション: デフォルト
セキュリティ・リスト: seclist-kubeapi
仮想ノードおよびポッド用サブネット名前:sub-nodepods
タイプ: リージョナル
CIDRブロック: 10.0.10.0/24
ルート表: routetable-nodespods
サブネット・アクセス: プライベート
DNS解決: 選択済
DHCPオプション: デフォルト
セキュリティ・リスト: seclist-nodespods
ロード・バランサ用サブネット名前:sub-loadbalancer
タイプ: リージョナル
CIDRブロック: 10.0.20.0/24
ルート表: routetable-loadbalancer
サブネット・アクセス: パブリック
DNS解決: 選択済
DHCPオプション: デフォルト
セキュリティ・リスト: seclist-loadbalancer
サブネット
リソース名
routetable-kubeapiインターネットへのトラフィック用のルール
 ・宛先CIDRブロック:0.0.0.0/0
 ・ターゲット・タイプ:インターネット・ゲートウェイ
 ・ターゲット:internet-gateway
routetable-nodespodsインターネットへのトラフィック用のルール
 ・宛先CIDRブロック:0.0.0.0/0
 ・ターゲット・タイプ:NATゲートウェイ
 ・ターゲット:nat-gateway

OCIサービスへのトラフィック用のルール
 ・宛先:All NRT Services In Oracle Services Network
 ・ターゲット・タイプ:サービス・ゲートウェイ
 ・ターゲット:service-gateway
routetable-loadbalancerインターネットへのトラフィック用のルール
 ・宛先CIDRブロック:0.0.0.0/0
 ・ターゲット・タイプ:インターネット・ゲートウェイ
 ・ターゲット:internet-gateway
ルート表

セキュリティ・リストの構成

同様に、以下を例にセキュリティ・リストも構成します。

方向状態ソースCIDRプロトコル/宛先ポート説明
イングレスステートフル0.0.0.0/0TCP/6443Kubernetes APIエンドポイントへの外部アクセス。
イングレスステートフル10.0.10.0/24TCP/6443仮想ノードからKubernetes APIエンドポイントへの通信。
イングレスステートフル10.0.10.0/24TCP/12250コントロール・プレーンへの仮想ノード通信。
イングレスステートフル10.0.10.0/24ICMP 3,4パス検出。
エグレスステートフルOracle Services NetworkのすべてのOCIサービスTCP/443Kubernetes APIエンドポイントがリージョンOCIサービス・エンドポイントと通信できるようにします。
エグレスステートフル10.0.10.0/24TCP/すべてKubernetes APIエンドポイントが仮想ノードと通信できるようにします。
エグレスステートフル10.0.10.0/24ICMP 3,4パス検出。
seclist-kubeapi
方向状態ソースCIDRプロトコル/宛先ポート説明
イングレスステートフル10.0.10.0/24すべて/すべてポッド間通信。
イングレスステートフル10.0.10.0/24TCP/6443external-traffic-policy=localのロード・バランサからポッドおよびヘルス・チェック・ノードのポート・トラフィックへのトラフィック。
イングレスステートフル10.0.10.0/24TCP/12250external-traffic-policy=clusterのロード・バランサからヘルス・チェック・ポートへのトラフィック
イングレスステートフル10.0.0.0/28ICMP 3,4APIサーバーからのパス検出。
イングレスステートフル10.0.0.0/28TCP/すべてAPIサーバーから仮想ノードへの通信。
エグレスステートフル10.0.10.0/24すべて/すべてポッド間通信。
エグレスステートフル10.0.0.0/28TCP/6443仮想ノード/ポッドからAPIサーバーへの通信。
エグレスステートフル10.0.0.0/28TCP/12250仮想ノード/ポッドからAPIサーバーへの通信。
エグレスステートフル0.0.0.0/0ICMP 3,4仮想ノード/ポッドからKubernetesコントロール・プレーンへのアクセス。
seclist-nodespods
方向状態ソースCIDRプロトコル/宛先ポート説明
イングレスステートフル0.0.0.0/0TCP / 443/80リスナー・ポートが80/443と仮定したロード・バランサへの受信トラフィック
エグレスステートフル10.0.10.0/24すべて/ 30000-32767external-traffic-policy=localのポッドおよびヘルス・チェック・ノード・ポート・トラフィックへのトラフィック
エグレスステートフル10.0.10.0/24TCP/UDP/10256external-traffic-policy=clusterのヘルス・チェック・ポートへのトラフィック
seclist-loadbalancer

クラスタの作成

事前準備の完了後、仮想ノードを使用したクラスタの作成を行います。

OCIコンソール画面左上のハンバーガーメニューから「開発者サービス」→「Kubernetesクラスタ(OKE)」を選択します。

クラスタの作成」→「カスタム作成」→「送信」を順に選択します。

ここでは以下の項目を入力して「クラスタの作成」を選択します。

リソース名やスペック等は必要に応じて適宜変更をしておきましょう。

※仮想ノードでクラスタを作成する場合は、ノード・タイプを「仮想」にしておきましょう。

  • 名前:cluster1
  • Kubernetesバージョン:1.25.4
  • ネットワーク・タイプ:VCNネイティブ・ポッド・ネットワーク
  • VCN:vnode-vcn
  • KubernetesサービスLBサブネット:sub-loadbalancer
  • Kubernetes APIエンドポイント・サブネット:sub-kubeapi
  • ノードプール
    • 名前:pool1
    • ノード・タイプ:仮想
  • 仮想ノード数およびポッド・シェイプ
    • ノード数:1
    • ポッド・シェイプ:Pod.Standard.E4.Flex
    • ※現時点で選択可能なポッド・シェイプはE3、E4のみ
  • ポッド通信用のサブネット:sub-nodepods
  • 仮想ノード通信用のサブネット:sub-nodepods

作成後、15分程度でクラスタのプロビジョニングは完了します。


作成したクラスタへのアクセス

プロビジョニング完了後、作成したクラスタへのアクセスを行います。

クラスタへのアクセス方法はCloud Shellとローカルからの2つがありますが、今回はCloud Shellからアクセスを行います。

 

作成したクラスタの詳細画面から「クラスタへのアクセス」→「Cloud Shellアクセス」をそれぞれ選択します。

Cloud Shellの起動後、記載のコマンドをペーストしてkubeconfigファイルを作成します。

oci ce cluster create-kubeconfig --cluster-id ocid1.cluster.oc1.ap-tokyo-1.xxx --file $HOME/.kube/config --region ap-tokyo-1 --token-version 2.0.0  --kube-endpoint PUBLIC_ENDPOINT

kubeconfigファイルの作成後、以下のコマンドで実行中のノード数を確認します。

kubectl get nodes

クラスタ作成時にノード数を1で設定した場合、以下のように1つのノードのみが表示されます。


ノードのスケーリング

ここでは、ノードのスケーリングの方法について説明します。

クラスタの詳細画面の左側にある「ノード・プール」から、スケーリングしたいノード・プールを選択します。

ノード・プールの詳細画面から「スケール」を選択、任意のノード数(ここでは1 → 3)に変更します。

変更後、再度以下のコマンドをCloud Shellに入力してノードの一覧を表示します。

kubectl get nodes

ノードのスケーリングを行った場合、ノード数が増加していることが以下のように確認できます。

同様に、ノードを減らす場合にも、増加時と同じ手順で変更することができます。


アドオンについて

最後に、アドオン機能も新たにリリースされましたので、こちらも簡単にご紹介します。

 

アドオンとは、クラスタを構築または拡張するためのソフトウェアを管理する機能を持ち、2023年4月現在では以下を構成することができます。

  • CoreDNS
  • KubeProxy
  • NativePodNetworking
  • Kubernetes DashBoard(オプション)

クラスタの詳細画面の左側にある「アドオン」から、各アドオンのバージョンなどを確認することができます。

また、クラスタを作成する際に「拡張オプションの表示」からアドオンの設定変更を行うことができます。

ちなみに、アドオンはデフォルトでは自動更新され、新しいバージョンがリリースされた場合に自動的にアップグレードされますが、特定のバージョンに固定することもできます。

 

バージョンを固定したい場合は、アドオンの詳細画面から「アドオンの管理」を選択し、任意のアドオン(ここでは「ネイティブ・ポッド・ネットワーク」)から任意のバージョン(ここではv1.1.4)を選択して、「変更の保存」を行います。

また、オプションとして、nodes per replicaやtolerationsなどの設定も可能となっております。

設定を行いたい場合は、アドオンの編集画面から「構成の追加」を選択し、任意の設定値を割り当てます。


まとめ

今回は、仮想ノードを使用したOKEクラスタの動作について簡単に確認しました。

仮想ノードを使用することで、これまで以上に様々なユースケースに適用できる可能性があります。

また、今後OKEに関する新しいリリースがあれば、ブログに記事として掲載したいと考えています。

 

以上となります。

この記事を通じて読者の皆様の問題解決の一助となれば幸いです。

最後まで読んで頂き、ありがとうございましたm(_ _)m


この記事が気に入ったら
「いいね!」

この記事を書いた人


関連コンテンツ

CONTACT お問い合わせ

Cloudiiのサービスやプロダクトについて
興味をお持ちの方は、
お気軽にお問い合わせください。