ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で入手できます。
- Oracle Cloud Infrastructure資格証明、テナンシおよびコンパートメントの値の例を使用します。演習を完了したら、これらの値をクラウド環境に固有の値に置き換えてください。
Oracle Cloud Native EnvironmentでのOCI Cloud Controller Managerの使用
イントロダクション
Kubernetes LoadBalancer Serviceは、クラウド・プロバイダのロード・バランサを使用してデプロイメントを外部で公開します。外部ロード・バランサのルート先となる、依存するNodePortおよびClusterIPサービスが自動的に作成されます。
このチュートリアルでは、Oracle Cloud Native Environment内にOracle Cloud Infrastructure Cloud Controller Managerモジュール(OCI- CCMモジュール)をデプロイして、外部のLoadBalancerサービス・タイプのリクエストを処理する方法を示します。Oracle Cloud Infrastructure Cloud Controller Managerモジュールは、Oracle Cloud Infrastructure(OCI)のKubernetes Cloud Controller Manager実装(またはツリー外のクラウド・プロバイダ)であるオープン・ソースのoci- cloud- controller- managerプロジェクトを使用します。
目的
- Oracle Cloud Infrastructure Cloud Controller Managerモジュールのデプロイ
- デプロイメントおよびLoadBalancerサービスの作成
- LoadBalancerサービスを介したアクセスの検証
前提条件
次の構成を持つ Oracle Linux 8以降のシステム。
sudo
権限を持つroot以外のユーザー- Oracle Cloud Native Environmentのインストールおよび構成
演習環境の設定
ノート: 無料のラボ環境を使用する場合、接続およびその他の使用手順については、Oracle Linux Lab Basicsを参照してください。
情報: 無料のラボ環境では、環境を作成する準備ができて、指定されたノードにコンパクトなOracle Cloud Native Environmentをデプロイします。このデプロイメントは、起動後に終了するまでに約8分から10分かかります。そのため、この実行中はステップを離れてから、演習を完了します。
-
まだ接続されていない場合は、端末を開き、sshを使用して ocne-node01システムに接続します。
ssh oracle@<ip_address_of_ol_node>
-
環境の準備ができていることを確認します。
kubectl get pods -A
出力例:
[oracle@ocne-node01 ~]$ kubectl get pods -A NAMESPACE NAME READY STATUS RESTARTS AGE externalip-validation-system externalip-validation-webhook-7988bff847-8ws2v 1/1 Running 0 3m18s kube-system coredns-7cbc77dbc7-qxqth 1/1 Running 0 3m18s kube-system coredns-7cbc77dbc7-r9bgj 1/1 Running 0 3m18s kube-system etcd-ocne-node01 1/1 Running 0 3m37s kube-system kube-apiserver-ocne-node01 1/1 Running 0 3m37s kube-system kube-controller-manager-ocne-node01 1/1 Running 0 3m37s kube-system kube-flannel-ds-vcwzn 1/1 Running 0 3m18s kube-system kube-proxy-7lx59 1/1 Running 0 3m18s kube-system kube-scheduler-ocne-node01 1/1 Running 0 3m37s kubernetes-dashboard kubernetes-dashboard-5d5d4947b5-7pffh 1/1 Running 0 3m18s
Oracle LinuxファイアウォールでHealthCheckポートを開く
OCI- CCMに関連付けられたLoadBalancerサービスを使用する場合、Kubernetesはポート10256で使用可能なヘルス・チェック・エンドポイントを想定します。したがって、kube-proxy
は、クラウド・プロバイダ・ロード・バランサがkube-proxy
が正常であることを検証できるように、このポートにリスナーを作成します。このヘルス・チェックは、ロード・バランサがトラフィックをルーティングできるノードを決定する方法です。
-
ノードのファイアウォール・ルールを設定します。
sudo firewall-cmd --add-port=10256/tcp --permanent sudo firewall-cmd --reload
クラスタ化された環境で作業する場合は、すべてのコントロール・プレーン・ノードおよびワーカー・ノードで、このファイアウォール・ポートを開きます。
Oracle Cloud Infrastructure Cloud Controller Managerモジュールのデプロイ
-
helm
およびoci-ccm
モジュールを既存の構成ファイルに追加します。tee -a ~/myenvironment.yaml > /dev/null << 'EOF' - module: helm name: myhelm args: helm-kubernetes-module: mycluster - module: oci-ccm name: myoci oci-ccm-helm-module: myhelm oci-use-instance-principals: true oci-compartment: oci-vcn: oci-lb-subnet1: EOF
無料のラボ環境では、ポリシーを使用してInstance Principalsを使用できます。これにより、インスタンスは認可されたアクター(またはプリンシパル)になり、サービス・リソースに対してアクションを実行できます。
Oracle Cloud Infrastructure Cloud Controller Managerモジュールは、デフォルト設定として認証にオプション
oci-use-instance-principals: true
を使用します。詳細は、Instance Principalsを使用するのではなく、Oracle Cloud Infrastructureテナンシに関連する資格証明情報を渡す方法に関するOracle Cloud Infrastructure Load Balancerの使用のドキュメントを参照してください。
-
構成ファイル内に必要なOCIDsを追加します。
-
ターミナルから無料のラボ・デスクトップに切り替えます。
-
無料のラボ・デスクトップのLuna Labアイコンを使用して、Luna Labの詳細ページを開きます。
-
「Oracle Cloud」タブをクリックします。
-
下にスクロールして、コンパートメントOCIDを見つけてコピーします。
-
前の開いたターミナルに切り替えます。
-
選択したテキスト・エディタを使用して構成ファイルをオープンします。ここでは、
vi
を使用します。vi ~/myenvironment.yaml
-
i
と入力して、vi
挿入モードを入力します。 -
「コンパートメントOCID」をoci- compartment: 行の最後に追加します。
ノート: これはYAMLであるため、値を貼り付ける前に必ずスペースを追加してください。
例:
- module: oci-ccm name: myoci oci-ccm-helm-module: myhelm oci-use-instance-principals: true oci-compartment: ocid1.compartment.oc1..aaaaaaaamqicnhi7e6dj7fwtbiibfxxlzjpd3uf33f7a33gftzgpchrnuzna oci-vcn: oci-lb-subnet1:
-
Luna Labの詳細ページに切り替えて、「リソース」タブをクリックします。
-
vcn_ocidを見つけてコピーします。
-
ターミナルに戻ります。
-
vcn_ocidを oci- vcn: 行の最後に追加します。
ノート: これはYAMLであるため、値を貼り付ける前に必ずスペースを追加してください。
例:
- module: oci-ccm name: myoci oci-ccm-helm-module: myhelm oci-use-instance-principals: true oci-compartment: ocid1.compartment.oc1..aaaaaaaamqicnhi7e6dj7fwtbiibfxxlzjpd3uf33f7a33gftzgpchrnuzna oci-vcn: ocid1.vcn.oc1.eu-frankfurt-1.amaaaaaar5cqh7qam56nztotyx4xzhovuo7stl5dddlmdmubdcdam64sadka oci-lb-subnet1:
-
Luna Labの詳細ページに戻ります。
-
vcn_subnet_ocidを見つけてコピーします。
-
ターミナルに戻ります。
-
vcn_subnet_ocidを oci- lb-subnet1: 行の最後に追加します。
ノート: これはYAMLであるため、値を貼り付ける前に必ずスペースを追加してください。
例:
- module: oci-ccm name: myoci oci-ccm-helm-module: myhelm oci-use-instance-principals: true oci-compartment: ocid1.compartment.oc1..aaaaaaaamqicnhi7e6dj7fwtbiibfxxlzjpd3uf33f7a33gftzgpchrnuzna oci-vcn: ocid1.vcn.oc1.eu-frankfurt-1.amaaaaaar5cqh7qam56nztotyx4xzhovuo7stl5dddlmdmubdcdam64sadka oci-lb-subnet1: ocid1.subnet.oc1.eu-frankfurt-1.aaaaaaaazq3yaeofyv3azmnzm2cxrilnfhpmvhark7xw5u6eo3574mtbzswa
-
ファイルを保存して閉じます。
vi
を使用する場合は、ESC
、:wq!
およびENTER
と入力してこれを実行できます。
重要: 環境ごとにOCIDsが正しいことを確認してください。値が正しくない場合、
oci-ccm
モジュールはインストールされますが、サービスによってリクエストされたときにLoadBalancerの作成は失敗します。 -
-
モジュールを作成してインストールします。
olcnectl module create --config-file myenvironment.yaml olcnectl module validate --config-file myenvironment.yaml olcnectl module install --config-file myenvironment.yaml
デプロイメントおよびサービスの作成
-
デプロイメントおよびサービスの構成ファイルを生成します。
tee echo-oci-lb.yml > /dev/null << 'EOF' --- apiVersion: apps/v1 kind: Deployment metadata: name: echo-deployment labels: app: echo1 spec: replicas: 2 selector: matchLabels: app: echo1 template: metadata: labels: app: echo1 spec: containers: - name: echoserver image: k8s.gcr.io/echoserver:1.4 ports: - containerPort: 80 --- kind: Service apiVersion: v1 metadata: name: echo-lb-service annotations: service.beta.kubernetes.io/oci-load-balancer-security-list-management-mode: "None" service.beta.kubernetes.io/oci-load-balancer-internal: "false" service.beta.kubernetes.io/oci-load-balancer-shape: "10Mbps" spec: selector: app: echo1 type: LoadBalancer ports: - name: http port: 80 targetPort: 8080 EOF
-
デプロイメントおよびサービスを作成します。
kubectl create -f echo-oci-lb.yml
デプロイメントおよびサービスの作成の確認
-
デプロイメントのリストを取得します。
kubectl get deployment
出力例:
NAME READY UP-TO-DATE AVAILABLE AGE echo-deployment 2/2 2 2 15s
-
サービスのリストを取得します。
kubectl get service
出力例:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echo-lb-service LoadBalancer 10.108.35.18 <pending> 80:32162/TCP 23s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 13m
Oracle Cloud Infrastructure Cloud Controller ManagerモジュールがOCI LoadBalancerを作成して起動するまで、echo- lb- serviceのEXTERNAL- IPの下にある「保留中」が存在します。
出力にEXTERNAL- IPアドレスが表示されるまで、
kubectl get service
コマンドの実行を繰り返します。最大1 ~ 2分以内に表示されます。PORTSは、OCI LoadBalancerリスニング・ポート(80)および自動生成されたKubernetes NodePortセカンダリ・サービス・ポートを示します。
-
エンドポイントのリストを取得します。
kubectl get endpoints
出力例:
NAME ENDPOINTS AGE echo-lb-service 10.244.0.7:8080,10.244.0.8:8080 5m37s kubernetes 10.0.0.140:6443 18m
エンドポイントは、Kubernetesサービスによって参照されるリソースです。リソースは、サービスの作成中に動的に割り当てられた1つ以上のポッドのIPアドレスおよびポートを追跡します。
アプリケーションの検証
コントロール・プレーン・ノードでのテスト
LoadBalancerサービス・タイプの場合、テストするIPアドレスおよびポートは、OCI LoadBalancerリスナーであるサービスのEXTERNAL- IPアドレスおよびポートです。その後、リクエストはOCI LoadBalancerバックエンドに送信されます。次に、OCI LoadBalancerバックエンドは、トラフィックを特定のノードで実行されているセカンダリNodePortサービスにルーティングし、次にポッドにルーティングします。
この特定のテストを使用するには、kubectl
が存在するノードが必要です。
-
JSONPathを使用して、LoadBalancerリスナーに変数を割り当てます。
LB=$(kubectl get svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}" echo-lb-service)
-
JSONPathを使用して、LoadBalancerポートに変数を割り当てます。
LBPORT=$(kubectl get svc -o jsonpath="{.spec.ports[0].port}" echo-lb-service)
-
アプリケーションをテストします。
curl -i -w "\n" $LB:$LBPORT
出力例:
[oracle@ocne-node01 ~]$ curl -i -w "\n" $LB:$LBPORT HTTP/1.1 200 OK Server: nginx/1.10.0 Date: Wed, 06 Jul 2022 16:41:23 GMT Content-Type: text/plain Transfer-Encoding: chunked Connection: keep-alive CLIENT VALUES: client_address=10.244.0.1 command=GET real path=/ query=nil request_version=1.1 request_uri=http://130.162.210.115:8080/ SERVER VALUES: server_version=nginx: 1.10.0 - lua: 10001 HEADERS RECEIVED: accept=*/* host=10.0.0.138 user-agent=curl/7.61.1 BODY: -no body in request-
前述の出力に示されている
130.162.210.115
のIPアドレスは、OCI LoadBalancerのEXTERNAL- IPアドレスです。このアドレスは、演習の各デプロイメントで異なります。オプションでクラウド・コンソールにログインし、「ネットワーキング」→「ロード・バランサ」に移動して、ロード・バランサ・アドレスを確認します。
Luna Desktopからのテスト
この特定のテストを使用するには、Kubernetesクラスタ外のノードが必要です。
-
echo-lb-service
のEXTERNAL-IP
値を検索します。kubectl get service
出力例
[oracle@ocne-node01 ~]$ kubectl get service NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE echo-lb-service LoadBalancer 10.102.1.165 130.162.210.115 80:31468/TCP 32s kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 11m
-
Luna Desktopのブラウザを使用して、新しいタブを開きます。
-
EXTERNAL-IP
列に返された値を入力し、[Enter]を押します。注: 出力に表示される client_addressは、cni0インタフェースに関連付けられたゲートウェイIPアドレスです。cni0インタフェースは、ネットワーク・プラグイン・アップストリームのドキュメントで説明されているように、Kubernetesクラスタ・ネットワーキングを管理します。
概要
ここでは、Kubernetes内でLoadBalancerサービスを作成する方法を理解します。Oracle Cloud Infrastructure Cloud Controller Managerモジュールと使用可能なLoad Balancerアノテーションを使用して、Oracle Cloud Native Environmentの追加機能を確認し、自己調査します。
詳細情報
その他の学習リソース
docs.oracle.com/learnで他のラボを探すか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。
製品ドキュメントについては、Oracle Help Centerを参照してください。
Use OCI Cloud Controller Manager on Oracle Cloud Native Environment
F60051-02
August 2022
Copyright © 2022, Oracle and/or its affiliates.