ノート:
- このチュートリアルでは、Oracle Cloudへのアクセスが必要です。無料アカウントにサインアップするには、Oracle Cloud Infrastructure Free Tierの開始を参照してください。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントに例の値を使用します。演習を終える際は、これらの値をクラウド環境に固有の値に置き換えてください。
3つのワーカー・ノードを使用したOracle Cloud Infrastructure Container Engine for Kubernetesの設定
イントロダクション
このチュートリアルでは、Oracle Cloud Infrastructure Container Engine for Kubernetes (OKE)を使用して、Kubernetesコントロール・プレーンおよびデータ・プレーン(ノード・プール)で構成されるKubernetesクラスタを設定する方法について説明します。また、Kubernetesプラットフォームに2つのサンプル・アプリケーションをデプロイおよび削除して、それが機能することを証明します。このチュートリアルでは、コンテナ・ホスト・アプリケーション用にKubernetes内で提供されるネットワーキング・サービスについて説明する将来のチュートリアルのステージを設定します。
OKEデプロイメント・モデルの例は、次のとおりです。
-
例1: Flannel CNIプラグイン、パブリックKubernetes APIエンドポイント、プライベート・ワーカー・ノードおよびパブリック・ロード・バランサを含むクラスタ。
-
例2: Flannel CNIプラグイン、プライベートKubernetes APIエンドポイント、プライベート・ワーカー・ノードおよびパブリック・ロード・バランサを含むクラスタ。
-
例3: OCI CNIプラグイン、パブリックKubernetes APIエンドポイント、プライベート・ワーカー・ノードおよびパブリック・ロード・バランサを含むクラスタ。
-
例4: OCI CNIプラグイン、プライベートKubernetes APIエンドポイント、プライベート・ワーカー・ノードおよびパブリック・ロード・バランサを含むクラスタ。
選択できる様々なOKEデプロイメント・モデルの詳細は、ネットワーク・リソース構成の例を参照してください。
このチュートリアルでは、例3デプロイメント・モデルを実装します。
目的
- Oracle Cloud Infrastructure(OCI)内に完全にデプロイおよび構成されているKubernetes制御クラスタおよびワーカー・ノードをデプロイします。これをOracle Cloud Infrastructure Container Engine for Kubernetes(OKE)と呼びます。2つの異なるネームスペースに2つのサンプル・アプリケーションをデプロイし、1つのアプリケーションが新しいネームスペースのHelmチャートを使用してデプロイします。最後に、アプリケーションまたはポッドをクリーンアップします。Kubernetesで動作するアプリケーションまたはポッドのネットワーク・サービスはデプロイしません。
タスク1: 新しいKubernetesクラスタの作成およびコンポーネントの検証
-
ハンバーガー・メニューをクリックします。
- 「開発者サービス」をクリックします。
- 「Kubernetesクラスタ(OKE)」をクリックします。
-
「クラスタの作成」をクリックします。
- 「クイック作成」を選択します。
- 「発行」をクリックします。
-
「クラスタの作成(クイック)」ページで、次の情報を入力します。
- クラスタの名前を入力します。
- コンパートメントを選択します。
- Kubernetesバージョンを選択します。
- パブリック・エンドポイントになるKubernetes APIエンドポイントを選択します。
- 「管理」する「ノード・タイプ」を選択します。
- 下へスクロール
- 「プライベート・ワーカー」にする「Kubernetesワーカー・ノード」を選択します。
- 下へスクロール
- 「ノード数(ワーカー・ノード)」のデフォルトは3のままにします。
- 「次」をクリックします。
- クラスタ・パラメータを確認します。
- 下へスクロール
- ノード・プールのパラメータを確認します。
- 下へスクロール
- 「基本クラスタの作成」チェック・ボックスを選択しないでください。
- 「クラスタの作成」をクリックします。
-
作成された様々なコンポーネントのステータスを確認します。
- 全てが緑色チェックであることを確認してください。
- 「閉じる」をクリックします。
- ステータスが「作成中」であることを確認します。
- 下へスクロール
-
クラスタおよびノード・プールの作成ステータスを確認します。Kubernetes制御クラスタが作成され、ワーカー・ノード・プールは後で作成されます。
-
数分後、Kubernetes制御クラスタが正常に作成されます。
-
これで、ワーカー・ノード・プールが作成されます。
-
数分後、ワーカー・ノード・プールが正常に作成されます。
- 「ノード・プール」をクリックします。
- プール内のワーカー・ノードがまだ作成されていることを確認します。
- ワーカー・ノードの「3」をクリックします。
-
すべてのノードのステータスが「未準備」であることを確認します。
-
数分後に、準備完了になります。
Kubernetes制御クラスタおよびワーカー・ノードは、Oracle Cloud Infrastructure (OCI)内に完全にデプロイおよび構成されます。これをOracle Cloud Infrastructure Container Engine for Kubernetesと呼びます。
タスク2: OCIコンソールでのデプロイ済Kubernetesクラスタ・コンポーネントの検証
OKEを使用してKubernetesクラスタを作成すると、このデプロイメントをサポートするためにOCI内にいくつかのリソースが作成されます。
最初の最も重要なリソースは、仮想クラウド・ネットワーク(VCN)です。「クイック作成」オプションを選択したため、OKE専用の新しいVCNが作成されました。
-
OCIコンソールにログインし、ネットワーキング、Virtual Cloud Networks (VCN)にナビゲートすると、作成された新しいVCNが表示されます。「VCN」をクリックします。
VCN内には、OKEデプロイメントをサポートする3つのサブネット(1つのプライベート・サブネットと2つのパブリック・サブネット)が表示されます。
-
リソースを確認します。
- 「CIDRブロック/接頭辞」をクリックして、VCNのCIDRを確認します。
10.0.0.0/16
がOCIによって割り当てられていることに注意してください。
- 「ルート表」をクリックして、ルーティング表を確認します。
- プライベート・サブネットへのルートとパブリック・サブネットへのルートの2つのルーティング表が作成されていることに注意してください。
- 「インターネット・ゲートウェイ」をクリックして、インターネットとの間のパブリック・サブネットを使用したインターネット接続を提供するインターネット・ゲートウェイを確認します。
- インターネット・ゲートウェイは1つのみであることに注意してください。
- 「セキュリティ・リスト」をクリックして、サブネット間の接続を保護するためのイングレス・ルールまたはエグレス・ルールのいずれかのセキュリティ・リストを確認します。
- 3つのセキュリティ・リストがあり、1つはKubernetesワーカー・ノード接続保護用、もう1つはKubernetes APIエンドポイント保護用、もう1つはKubernetesサービス保護用です。
- 「NATゲートウェイ」をクリックして、インターネットへのプライベート・サブネットを使用したインターネット接続を提供するNAT Gatewayを確認します。
- NAT Gatewayは1つのみであることに注意してください。
- 「サービス・ゲートウェイ」をクリックして、インターネット・ゲートウェイまたはNATゲートウェイにデータを公開せずに、特定のOracleサービスへのプライベート・アクセスを提供するサービス・ゲートウェイを確認します。
- サービス・ゲートウェイは1つのみであることに注意してください。
- OCIコンソールを開き、ハンバーガー・メニューをクリックして、「コンピュート」、「インスタンス」に移動します。
- 3つのインスタンスが作成され、デプロイメント中に指定した3つのKubernetesワーカー・ノードとして使用されます。
- OCIコンソールを開き、ハンバーガー・メニューをクリックして、「IP管理」、「予約済パブリックIP」に移動します。
- KubernetesパブリックAPIエンドポイント用に予約されている、
.166
で終わるパブリックIPアドレスが1つあることに注意してください。
収集したすべての情報を配置し、図に配置すると、図は次の図のようになります。
-
OKEをデプロイするための構成詳細を含む表
-
VCN:
リソース 名前 VCN • 名前: oke-vcn-quick-IH-OKE-CLUSTER-af593850a
•CIDRブロック: 10.0.0.0/16
• DNS解決: 選択インターネット・ゲートウェイ • 名前: oke-igw-quick-IH-OKE-CLUSTER-af593850a NAT Gateway •名前: oke-ngw-quick-IH-OKE-CLUSTER-af593850a サービス・ゲートウェイ • 名前: oke-sgw-quick-IH-OKE-CLUSTER-af593850a
• サービス: Oracle Services Networkのすべてのリージョン・サービスDHCPオプション • DNSタイプがInternet and VCN Resolverに設定されている -
サブネット:
リソース 例 Kubernetes APIエンドポイントのパブリック・サブネット 目的: 次のプロパティを持つKubernetes APIエンドポイント:
• タイプ: リージョナル
•CIDRブロック: 10.0.0.0/28
• ルート表: oke-public-routetable-IH-OKE-CLUSTER-af593850a
• サブネット・アクセス: パブリック
• DNS解決: 選択済
•DHCPオプション: デフォルト
• セキュリティ・リスト: oke-k8sApiEndpoint-quick-IH-OKE-CLUSTER-af593850aワーカー・ノードのプライベート・サブネット 目的: 次のプロパティを持つワーカノード:
• タイプ: リージョナル
•CIDRブロック: 10.0.10.0/24
• ルート表: 該当なし
• サブネット・アクセス: プライベート
• DNS解決: 選択済
•DHCPオプション: デフォルト
• セキュリティ・リスト: oke-nodeseclist-quick-IH-OKE-CLUSTER-af593850aポッドのプライベート・サブネット 目的: 次のプロパティを持つポッド:
• タイプ: リージョナル
•CIDRブロック: 10.96.0.0/16
• ルート表: oke-private-routetable-IH-OKE-CLUSTER-af593850a
• サブネット・アクセス: プライベート
• DNS解決: 選択済
•DHCPオプション: デフォルト
• セキュリティ・リスト: 該当なしサービス・ロード・バランサのパブリック・サブネット 目的: 次のプロパティを持つロード・バランサ:
• タイプ: リージョナル
•CIDRブロック: 10.0.20.0/24
• ルート表: oke-private-routetable-IH-OKE-CLUSTER-af593850a
• サブネット・アクセス: パブリック
• DNS解決: 選択済
•DHCPオプション: デフォルト
• セキュリティ・リスト: oke-svclbseclist-quick-IH-OKE-CLUSTER-af593850a -
ルート表:
リソース 例 パブリックKubernetes APIエンドポイント・サブネットのルート表 目的: routetable-Kubernetes APIエンドポイント。次のように定義されたルート・ルールを使用します:
• 宛先CIDRブロック: 0.0.0.0/0
• ターゲット・タイプ: インターネット・ゲートウェイ
• ターゲット: oke-igw-quick-IH-OKE-CLUSTER-af593850aプライベート・ポッド・サブネットのルート表 目的: routetable-pods。次のように定義された2つのルート・ルールを使用します:
• インターネットへのトラフィックのルール:
◦ 宛先CIDRブロック: 0.0.0.0/0
◦ ターゲット・タイプ: NAT Gateway
◦ ターゲット: oke-ngw-quick-IH-OKE-CLUSTER-af593850a
•OCIサービスへのトラフィックのルール:
◦ 宛先: Oracle Services Networkのすべてのリージョン・サービス
◦ ターゲット・タイプ: サービス・ゲートウェイ
◦ ターゲット: oke-sgw-quick-IH-OKE-CLUSTER-af593850aパブリック・ロード・バランサ・サブネットのルート表 目的: routetable-serviceloadbalancers。次のように定義されたルート・ルールを使用します:
• 宛先CIDRブロック: 0.0.0.0/0
• ターゲット・タイプ: インターネット・ゲートウェイ
• ターゲット: oke-igw-quick-IH-OKE-CLUSTER-af593850a
-
-
パブリックKubernetes APIエンドポイント・サブネットのセキュリティ・リスト・ルール
oke-k8sApiEndpoint-quick-IH-OKE-CLUSTER-af593850a
セキュリティ・リストには、次の表に示すようにイングレスおよびエグレス・ルールがあります。-
イングレス・ルール:
ステートレス ソース: IPプロトコル ソース・ポート範囲 宛先ポート範囲 タイプおよびコード 許可 説明 × 0.0.0.0/0 TCP すべて 6443 ポートのTCPトラフィック: 6443 Kubernetes APIエンドポイントへの外部アクセス × 10.0.10.0/24 TCP すべて 6443 ポートのTCPトラフィック: 6443 KubernetesワーカーからKubernetes APIエンドポイントへの通信 × 10.0.10.0/24 TCP すべて 12250 ポートのTCPトラフィック: 12250 Kubernetesワーカーからコントロール・プレーンへの通信 × 10.0.10.0/24 ICMP 3, 4 ICMPトラフィック: 3、4宛先に到達できません: フラグメンテーションが必要ですが、フラグメントしないように設定されていました パス検出 -
エグレス・ルール:
ステートレス 宛先 IPプロトコル ソース・ポート範囲 宛先ポート範囲 タイプおよびコード 許可 説明 × Oracle Services NetworkのすべてのAMSサービス TCP すべて 443 ポートのTCPトラフィック: 443 HTTPS Kubernetes Control PlaneとOKEの通信を許可 × 10.0.10.0/24 TCP すべて すべて ポートのTCPトラフィック: すべて ワーカー・ノードへのすべてのトラフィック × 10.0.10.0/24 ICMP 3, 4 ICMPトラフィック: 3、4宛先に到達できません: フラグメンテーションが必要ですが、フラグメントしないように設定されていました パス検出
-
-
プライベート・ワーカー・ノード・サブネットのセキュリティ・リスト・ルール
oke-nodeseclist-quick-IH-OKE-CLUSTER-af593850a
セキュリティ・リストには、次の表に示すようにイングレスおよびエグレス・ルールがあります。イングレス・ルール:
ステートレス ソース: IPプロトコル ソース・ポート範囲 宛先ポート範囲 タイプおよびコード 許可 説明 × 10.0.10.0/24 すべてのプロトコル すべてのポートのすべてのトラフィック 1つのワーカー・ノードのポッドと他のワーカー・ノードのポッドとの通信を許可します × 10.0.0.0/28 ICMP 3, 4 ICMPトラフィック: 3、4宛先に到達できません: フラグメンテーションが必要ですが、フラグメントしないように設定されていました パス検出 × 10.0.0.0/28 TCP すべて すべて ポートのTCPトラフィック: すべて Kubernetes Control PlaneからのTCPアクセス × 0.0.0.0/0 TCP すべて 22 ポートのTCPトラフィック: 22 SSHリモート・ログイン・プロトコル ワーカー・ノードへのインバウンドSSHトラフィック × 10.0.20.0/24 TCP すべて 32291 ポートのTCPトラフィック: 32291 × 10.0.20.0/24 TCP すべて 10256 ポートのTCPトラフィック: 10256 × 10.0.20.0/24 TCP すべて 31265 ポートのTCPトラフィック: 31265 エグレス・ルール:
ステートレス 宛先 IPプロトコル ソース・ポート範囲 宛先ポート範囲 タイプおよびコード 許可 説明 × 10.0.10.0/24 すべてのプロトコル すべてのポートのすべてのトラフィック 1つのワーカー・ノードのポッドと他のワーカー・ノードのポッドとの通信を許可します × 10.0.0.0/28 TCP すべて 6443 ポートのTCPトラフィック: 6443 Kubernetes APIエンドポイントへのアクセス × 10.0.0.0/28 TCP すべて 12250 ポートのTCPトラフィック: 12250 Kubernetesワーカーからコントロール・プレーンへの通信 × 10.0.0.0/28 ICMP 3, 4 ICMPトラフィック: 3、4宛先に到達できません: フラグメンテーションが必要ですが、フラグメントしないように設定されていました パス検出 × Oracle Services NetworkのすべてのAMSサービス TCP すべて 443 ポートのTCPトラフィック: 443 HTTPS ノードがOKEと通信できるようにして、正しい起動および継続的な機能を確保します。 × 0.0.0.0/0 ICMP 3, 4 ICMPトラフィック: 3、4宛先に到達できません: フラグメンテーションが必要ですが、フラグメントしないように設定されていました Kubernetes Control PlaneからのICMPアクセス × 0.0.0.0/0 すべてのプロトコル すべてのポートのすべてのトラフィック インターネットへのワーカー・ノード・アクセス -
パブリックLoad Balancerサブネットのセキュリティ・リスト・ルール
oke-svclbseclist-quick-IH-OKE-CLUSTER-af593850a
セキュリティ・リストには、次の表に示すようにイングレスおよびエグレス・ルールがあります。-
イングレス・ルール:
ステートレス ソース: IPプロトコル ソース・ポート範囲 宛先ポート範囲 タイプおよびコード 許可 説明 × 0.0.0.0/0 TCP すべて 80 ポートのTCPトラフィック: 80 -
エグレス・ルール:
ステートレス 宛先 IPプロトコル ソース・ポート範囲 宛先ポート範囲 タイプおよびコード 許可 説明 × 10.0.10.0/24 TCP すべて 32291 ポートのTCPトラフィック: 32291 × 10.0.10.0/24 TCP すべて 10256 ポートのTCPトラフィック: 10256 × 10.0.10.0/24 TCP すべて 31265 ポートのTCPトラフィック: 31265
-
タスク3: CLIを使用したKubernetesクラスタが実行されていることの確認
-
OCIコンソールを開き、ハンバーガー・メニューをクリックして、開発者サービス、Kubernetesクラスタ(OKE)に移動します。タスク1で作成したKubernetesクラスタをクリックします。
- 下へスクロール
- 「クイック・スタート」をクリックします。
-
「クラスタへのアクセス」をクリックします。
- 「クラウド・シェルのアクセス」を選択します。
- 「コピー」をクリックして、Kubernetesクラスタへのアクセスを許可するコマンドをコピーします。
- 「クラウド・シェルの起動」をクリックします。
次の図は、OCI Cloud Shellを使用してOKEクラスタで管理を実行するために接続がどのように行われるかを示しています。
-
OCI Cloud Shellが起動します。
バックグラウンドで何が起こっているかについて、いくつかの情報メッセージが表示されます。
この場合、OCI Cloud Shellを異なるCPUアーキテクチャで実行できます。
-
「閉じる」をクリックして、この情報メッセージを閉じます。
-
OCI Cloud Shellを使用してKubernetesクラスタにアクセスする準備ができました。
-
上でコピーしたコマンドをこのタスクに貼り付けます。
-
次のコマンドを実行して、Kubernetesクラスタに関する情報を取得します。
kubectl cluster-info
-
次のコマンドを実行して、ワーカー・ノードに関する情報を取得します。
kubectl get nodes
-
次のコマンドを実行して、ワーカー・ノードの詳細を取得します。
kubectl get nodes -o wide
-
次のコマンドを実行して画面をクリアし、新しい画面から開始します。
clear
- 前の出力はクリアされていますが、上にスクロールしても引き続きアクセスできます。
- 「最小化」アイコンをクリックして、OCI Cloud Shellウィンドウを最小化します。
-
「閉じる」をクリックして、「クラスタへのアクセス」ウィンドウを閉じます。
接続は、OCI Cloud Shellを使用してOKEクラスタで管理を実行するために行われます。
タスク4: kubectlを使用したサンプルNginxアプリケーションのデプロイ
-
次のコマンドを実行します。
- コマンドをノートにとり、Kubernetesのバージョンを取得します。
- サンプル・アプリケーションをデプロイするコマンドをノートにとります。
- 「リストア」をクリックして、OCI Cloud Shellウィンドウをリストアします。
-
次のコマンドを実行して、Kubernetesバージョンを取得します。
kubectl version
-
次のコマンドを実行して、デプロイされている現在のポッドまたはアプリケーションを確認します。
kubectl get pods
リソースが見つかりません。
-
新しいサンプル・アプリケーションをデプロイするには、次のコマンドを実行します。
kubectl create -f https://k8s.io/examples/application/deployment.yaml
-
次のコマンドを実行して、デプロイされている現在のポッドまたはアプリケーションを確認します。
kubectl get pods
-
RUNNING状態のポッドがあることに注意してください。これは、デプロイしたアプリケーションが稼働していることを意味します。
-
次のコマンドを実行して、アプリケーションにアクセスするためのIPアドレスを取得します。
kubectl get deploy,svc
-
新しくデプロイされたアプリケーションにはIPアドレスが割り当てられておらず、Kubernetesクラスタにのみ内部IPアドレスでクラスタIPサービスがアタッチされていることに注意してください。
-
次のコマンドを実行して、新しくデプロイされたアプリケーションのアタッチされた(ネットワーク)サービスを確認します。
kubectl get svc ngnix
-
デプロイされたNginxアプリケーションにデプロイまたはアタッチされた(ネットワーク)サービスがないことに注意してください。このため、他のアプリケーションからアプリケーションにアクセスしたり、Webブラウザを使用してNginx WebサーバーのWebページにアクセスすることはできません。これについては、別のチュートリアルで説明します。
タスク5: Helmチャートを使用したサンプルMySQLアプリケーションのデプロイ
-
Helmチャートは、アプリケーションをKubernetesクラスタにデプロイするために必要なすべてのリソースを含むパッケージです。次のコマンドを実行します。
-
MySQLデータベースのBitnamiリポジトリを追加します。
helm repo add bitnami https://charts.bitnami.com/bitnami
-
MySQLデータベースをKubernetesワーカー・ノードにデプロイし、新しいネームスペースmysqlも作成します。
helm install mysql bitnami/mysql -–namespace mysql --create-namespace
-
-
デプロイされたアプリケーションを取得するには、次のコマンドを実行します。このコマンドは、現在の(デフォルト)ネームスペースにデプロイされたアプリケーションのみを表示します。
kubectl get pods
-
Nginxアプリケーションのみが現在の(デフォルトの)ネームスペースに表示されます。このコマンドでは、クラスタ全体でデプロイされたアプリケーション(すべてのネームスペース)が表示されます。
kubectl get pods -A -w
- Nginxアプリケーションがデフォルトのネームスペースで実行されていることを確認します。
- MySQLアプリケーションが新しいmysqlネームスペースで実行されていることを確認します。
タスク6: ポッドおよびネームスペースのクリーン・アップ
デフォルトのネームスペース(Nginx)にアプリケーションをデプロイし、新しいネームスペース(MySQL)に別のアプリケーションをデプロイしました。Helmチャートを使用して環境をクリーンアップし、必要なときにいつでも新規に開始できるようにします。
-
次のコマンドを使用して、すべてのワーカー・ノードを取得します(クラスタ全体)。
kubectl get nodes -o wide
-
次のコマンドを使用して、現在の(デフォルト)ネームスペースで実行されているすべてのポッドを取得します。
kubectl get pods -o wide
-
次のコマンドを実行して、すべてのネームスペースを取得します。
kubectl get namespaces
-
次のコマンドを実行して、現在の(デフォルト)ネームスペースで実行されているすべてのポッドを具体的に取得します。
kubectl get pods --namespace=default
-
次のコマンドを実行して、MySQLネームスペースで実行されているすべてのポッドを具体的に取得します。
kubectl get pods --namespace=mysql
-
次のコマンドを実行して、デフォルト・ネームスペース内のすべてのデプロイメントまたはポッドを削除します。
kubectl delete --all deployments --namespace=default
-
次のコマンドを使用して、デプロイメントまたはポッドが削除されているかどうかを確認します。
kubectl get pods --namespace=default
-
次のコマンドを使用して、MySQLネームスペースで実行されているすべてのポッドを具体的に取得します。これがまだ存在するかどうかを確認してください。
kubectl get pods --namespace=mysql
-
次のコマンドを実行して、すべてのデプロイメントまたはポッドおよび完全なMySQLネームスペースを削除します。
kubectl delete namespace mysql
-
このコマンドを使用して、すべてのネームスペースを収集し、MySQLネームスペースが削除されているかどうかを確認します。
kubectl get namespaces
承認
- 著者 - Iwan Hoogendoorn (OCIネットワーク・スペシャリスト)
その他の学習リソース
docs.oracle.com/learnの他のラボをご覧いただくか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスして、Oracle Learning Explorerになります。
製品ドキュメントは、Oracle Help Centerを参照してください。
Set up Oracle Cloud Infrastructure Container Engine for Kubernetes with Three Worker Nodes
F95675-01
March 2024