ノート:

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 Linux 8以降のシステム。

演習環境の設定

ノート: 無料のラボ環境を使用する場合、接続およびその他の使用手順については、Oracle Linux Lab Basicsを参照してください。

情報: 無料のラボ環境では、環境を作成する準備ができて、指定されたノードにコンパクトなOracle Cloud Native Environmentをデプロイします。このデプロイメントは、起動後に終了するまでに約8分から10分かかります。そのため、この実行中はステップを離れてから、演習を完了します。

  1. まだ接続されていない場合は、端末を開き、sshを使用して ocne-node01システムに接続します。

    ssh oracle@<ip_address_of_ol_node>
    
  2. 環境の準備ができていることを確認します。

    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が正常であることを検証できるように、このポートにリスナーを作成します。このヘルス・チェックは、ロード・バランサがトラフィックをルーティングできるノードを決定する方法です。

  1. ノードのファイアウォール・ルールを設定します。

    sudo firewall-cmd --add-port=10256/tcp --permanent
    sudo firewall-cmd --reload
    

    クラスタ化された環境で作業する場合は、すべてのコントロール・プレーン・ノードおよびワーカー・ノードで、このファイアウォール・ポートを開きます。

Oracle Cloud Infrastructure Cloud Controller Managerモジュールのデプロイ

  1. 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の使用のドキュメントを参照してください。

  2. 構成ファイル内に必要なOCIDsを追加します。

    1. ターミナルから無料のラボ・デスクトップに切り替えます。

    2. 無料のラボ・デスクトップのLuna Labアイコンを使用して、Luna Labの詳細ページを開きます。

    3. 「Oracle Cloud」タブをクリックします。

      oracle_cloud

    4. 下にスクロールして、コンパートメントOCIDを見つけてコピーします。

      comp_ocid_copy

    5. 前の開いたターミナルに切り替えます。

    6. 選択したテキスト・エディタを使用して構成ファイルをオープンします。ここでは、viを使用します。

      vi ~/myenvironment.yaml
      
    7. iと入力して、vi挿入モードを入力します。

    8. 「コンパートメント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:
      
    9. Luna Labの詳細ページに切り替えて、「リソース」タブをクリックします。

      リソース

    10. vcn_ocidを見つけてコピーします。

      vcn_copy

    11. ターミナルに戻ります。

    12. vcn_ocidoci- 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:
      
    13. Luna Labの詳細ページに戻ります。

    14. vcn_subnet_ocidを見つけてコピーします。

      vcn_sub_copy

    15. ターミナルに戻ります。

    16. vcn_subnet_ocidoci- 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
      
    17. ファイルを保存して閉じます。viを使用する場合は、ESC:wq!およびENTERと入力してこれを実行できます。

    重要: 環境ごとにOCIDsが正しいことを確認してください。値が正しくない場合、oci-ccmモジュールはインストールされますが、サービスによってリクエストされたときにLoadBalancerの作成は失敗します。

  3. モジュールを作成してインストールします。

    olcnectl module create --config-file myenvironment.yaml
    olcnectl module validate --config-file myenvironment.yaml
    olcnectl module install --config-file myenvironment.yaml
    

デプロイメントおよびサービスの作成

  1. デプロイメントおよびサービスの構成ファイルを生成します。

    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
    
  2. デプロイメントおよびサービスを作成します。

    kubectl create -f echo-oci-lb.yml
    

デプロイメントおよびサービスの作成の確認

  1. デプロイメントのリストを取得します。

    kubectl get deployment
    

    出力例:

    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    echo-deployment   2/2     2            2           15s
    
  2. サービスのリストを取得します。

    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セカンダリ・サービス・ポートを示します。

  3. エンドポイントのリストを取得します。

    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が存在するノードが必要です。

  1. JSONPathを使用して、LoadBalancerリスナーに変数を割り当てます。

    LB=$(kubectl get svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}" echo-lb-service)
    
  2. JSONPathを使用して、LoadBalancerポートに変数を割り当てます。

    LBPORT=$(kubectl get svc -o jsonpath="{.spec.ports[0].port}" echo-lb-service)
    
  3. アプリケーションをテストします。

    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アドレスです。このアドレスは、演習の各デプロイメントで異なります。オプションでクラウド・コンソールにログインし、「ネットワーキング」→「ロード・バランサ」に移動して、ロード・バランサ・アドレスを確認します。

    loadbalancer_ip

Luna Desktopからのテスト

この特定のテストを使用するには、Kubernetesクラスタ外のノードが必要です。

  1. echo-lb-serviceEXTERNAL-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
    
  2. Luna Desktopのブラウザを使用して、新しいタブを開きます。

  3. EXTERNAL-IP列に返された値を入力し、[Enter]を押します。

    HTTPリクエスト

    注: 出力に表示される 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を参照してください。