ノート:

Oracle Cloud Native EnvironmentでのMetalLBの使用

イントロダクション

ネットワーク・ロード・バランサは、Kubernetesアプリケーションを外部に公開する方法を提供します。Kubernetes LoadBalancerサービスを使用して、クラスタの外部からアプリケーションに接続するために使用できる外部IPアドレスを提供および公開するネットワーク・ロード・バランサを作成します。

MetalLBは、ベア・メタル・ホストで実行されているOracle Cloud Native EnvironmentにデプロイされたKubernetesアプリケーション用のネットワーク・ロード・バランサです。MetalLBを使用すると、ベア・メタル環境で従来はクラウド・プロバイダのネットワーク・ロード・バランサを利用していたKubernetes LoadBalancerサービスを使用できます。

目的

このドキュメントでは、Oracle Cloud Native EnvironmentでMetalLBを使用して、Kubernetesアプリケーションに対してMetalLBモジュールを設定および使用する方法について説明します。

前提条件

このチュートリアルの手順を実行するためのホストシステムを、このセクションに示します。成功するには、次のものが必要です。

演習環境の設定

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

この演習には複数のシステムがあり、それぞれに異なるステップを実行する必要があります。まず、7つの端末ウィンドウまたはタブを開き、各ノードに接続することをお薦めします。これにより、繰り返しログインおよびログアウトする必要がなくなります。ノードは次のとおりです。

重要: 無料のラボ環境では、完全にインストールされたOracle Cloud Native Environmentが提供されたノードにデプロイされます。このデプロイメントは、起動後に終了するまでに約25分から30分かかります。そのため、この実行中はステップを離れてから、演習を完了します。

  1. 端末を開き、sshを介して各ノードに接続します。

    ssh oracle@<ip_address_of_ol_node>
    

Kubernetes環境の検証

  1. (任意のコントロール・プレーン・ノード上) kubectlが機能することを確認します。

    kubectl get nodes
    

    出力例:

    [oracle@ocne-control01 ~]$ kubectl get nodes
    NAME             STATUS   ROLES                  AGE   VERSION
    ocne-control01   Ready    control-plane,master   22m   v1.23.7+1.el8
    ocne-control02   Ready    control-plane,master   21m   v1.23.7+1.el8
    ocne-control03   Ready    control-plane,master   20m   v1.23.7+1.el8
    ocne-worker01    Ready    <none>                 20m   v1.23.7+1.el8
    ocne-worker02    Ready    <none>                 19m   v1.23.7+1.el8
    ocne-worker03    Ready    <none>                 19m   v1.23.7+1.el8
    [oracle@ocne-control01 ~]$
    

ワーカー・ノードの構成

(すべてのコントロール・プレーン・ノードおよびワーカー・ノード上)ネットワーク・ポートを設定します。

sudo firewall-cmd --zone=public --add-port=7946/tcp --permanent
sudo firewall-cmd --zone=public --add-port=7946/udp --permanent
sudo firewall-cmd --reload

MetalLBモジュールのインストール

次に、MetalLBモジュールをインストールして検証します。

ocne- operatorノードで:

  1. MetalLB構成ファイルを作成します。

    cat << 'EOF' | tee metallb-config.yaml
    address-pools:
    - name: default
      protocol: layer2
      addresses:
      - 10.0.12.240-10.0.12.250
    EOF
    
  2. 構成ファイルのコンテンツを表示します。

    cat ~/myenvironment.yaml
    
  3. HelmおよびMetalLBモジュールをOracle Cloud Native Environment構成ファイルに追加します。

    cat << 'EOF' | tee -a ~/myenvironment.yaml
          - module: helm
            name: myhelm
            args:
              helm-kubernetes-module: mycluster
          - module: metallb
            name: mymetallb
            args: 
              metallb-helm-module: myhelm 
              helm-kubernetes-module: mycluster  
              metallb-config: /home/oracle/metallb-config.yaml             
    EOF
    
  4. Helmおよび MetalLBモジュールが myenviroment.yamlファイルに追加されていることを確認します。

    cat ~/myenvironment.yaml
    
  5. モジュールを作成します。

    olcnectl module create --config-file myenvironment.yaml
    

    出力例:

    [oracle@ocne-operator ~]$ olcnectl module create --config-file myenvironment.yaml
    Modules created successfully.
    Modules created successfully.
    Modules created successfully.
    [oracle@ocne-operator ~]$
    
  6. モジュールを検証します。

    olcnectl module validate --config-file myenvironment.yaml
    

    出力例:

    [oracle@ocne-operator ~]$ olcnectl module validate --config-file myenvironment.yaml
    Validation of module mycluster succeeded.
    Validation of module myhelm succeeded.
    Validation of module mymetallb succeeded.
    [oracle@ocne-operator ~]$
    
  7. モジュールをインストールします。

    olcnectl module install --config-file myenvironment.yaml
    

    注意: 完了には数分かかります。

    出力例:

    [oracle@ocne-operator ~]$ olcnectl module install --config-file myenvironment.yaml
    Modules installed successfully.
    Modules installed successfully.
    Modules installed successfully.
    [oracle@ocne-operator ~]$
    
  8. インストールされているモジュールを表示します。

    olcnectl module instances --config-file myenvironment.yaml
    

    出力例:

    [oracle@ocne-operator ~]$ olcnectl module instances --config-file myenvironment.yaml
    INSTANCE       	MODULE    	STATE    
    10.0.12.11:8090	node      	installed
    10.0.12.12:8090	node      	installed
    10.0.12.13:8090	node      	installed
    10.0.12.21:8090	node      	installed
    10.0.12.22:8090	node      	installed
    10.0.12.23:8090	node      	installed
    mycluster      	kubernetes	installed
    myhelm         	helm      	installed
    mymetallb      	metallb   	installed
    [oracle@ocne-operator ~]$
    

Kubernetesアプリケーションの作成

この項では、LoadBalancerサービスを使用するKubernetesアプリケーションを作成します。

任意のコントロール・プレーン・ノード:

  1. Kubernetesアプリケーションを作成します。

    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
    spec:
      selector:
        app: echo1
      type: LoadBalancer
      ports:
      - name: http
        port: 80
        targetPort: 8080
    EOF
    
  2. サービスを作成します。

    kubectl create -f echo-oci-lb.yml
    

    出力例:

    [oracle@ocne-control01 ~]$ kubectl create -f echo-oci-lb.yml
    deployment.apps/echo-deployment created
    service/echo-lb-service created
    [oracle@ocne-control01 ~]$ 
    
  3. Kubernetesデプロイメントが実行されていることを確認します。

    kubectl get deployments
    

    出力例:

    [oracle@ocne-control01 ~]$ kubectl get deployment      
    NAME              READY   UP-TO-DATE   AVAILABLE   AGE
    echo-deployment   2/2     2            2           3m15s
    [oracle@ocne-control01~]$
    
  4. Kubernetesサービスが実行中であることを示します。

    kubectl get svc
    

    出力例:

    [oracle@ocne-control01 ~]$ kubectl get svc
    NAME              TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
    echo-lb-service   LoadBalancer   10.111.72.49   10.0.12.240   80:31727/TCP   4m47s
    kubernetes        ClusterIP      10.96.0.1      <none>        443/TCP        58m
    [oracle@ocne-control01 ~]$
    

    echo-lb-service LoadBalancerのEXTERNAL-IPのIPアドレスが10.0.12.240であることに注意してください。このIPアドレスは、MetalLBによって提供され、アプリケーションへの接続に使用できる外部IPアドレスです。

デプロイメントのテスト

次のステップでは、新しくデプロイされたアプリケーションをテストします。EXTERNAL-IP値がMetalLBによって(このシナリオでは10.0.12.240-10.0.12.250の範囲の間に)動的にプロビジョニングされるため、最初の2つのステップでは、この動的値をオペレーティング・システム変数として格納します。

  1. (任意のコントロール・プレーン・ノード上)割り当てられたEXTERNAL-IPアドレスを取得します。

    LB=$(kubectl get svc -o jsonpath="{.status.loadBalancer.ingress[0].ip}" echo-lb-service)
    
  2. 割り当てられたポート番号を取得します。

    LBPORT=$(kubectl get svc -o jsonpath="{.spec.ports[0].port}" echo-lb-service)
    
  3. これらは環境変数として格納されていることを確認します。

    echo $LB
    echo $LBPORT
    

    出力例:

    [oracle@ocne-control01 ~]$ echo $LB
    10.0.12.240
    [oracle@ocne-control01 ~]$ echo $LBPORT
    80
    [oracle@ocne-control01 ~]$
    
  4. curlを使用して、デプロイされたアプリケーションに接続します。

    curl -i -w "\n" $LB:$LBPORT
    

    出力例:

    [oracle@ocne-control01 ~]$ curl -i -w "\n" $LB:$LBPORT
    HTTP/1.1 200 OK
    Server: nginx/1.10.0
    Date: Wed, 10 Aug 2022 10:52:10 GMT
    Content-Type: text/plain
    Transfer-Encoding: chunked
    Connection: keep-alive
    
    CLIENT VALUES:
    client_address=10.244.2.0
    command=GET
    real path=/
    query=nil
    request_version=1.1
    request_uri=http://10.0.12.240:8080/
    
    SERVER VALUES:
    server_version=nginx: 1.10.0 - lua: 10001
    
    HEADERS RECEIVED:
    accept=*/*
    host=10.0.12.240
    user-agent=curl/7.61.1
    BODY:
    -no body in request-
    [oracle@ocne-control01 ~]$
    

非Kubernetesホストからのテスト

  1. (ocne- operator上)この最後のテストは、MetalLBが外部リクエストに応答していることを確認します。

    curl -v http://10.0.12.240:80
    

    出力例:

    [oracle@ocne-operator ~]$ curl -v http://10.0.12.240:80
    * Rebuilt URL to: http://10.0.12.240:80/
    *   Trying 10.0.12.240...
    * TCP_NODELAY set
    * Connected to 10.0.12.240 (10.0.12.240) port 80 (#0)
    > GET / HTTP/1.1
    > Host: 10.0.12.240
    > User-Agent: curl/7.61.1
    > Accept: */*
    > 
    < HTTP/1.1 200 OK
    < Server: nginx/1.10.0
    < Date: Wed, 10 Aug 2022 11:38:08 GMT
    < Content-Type: text/plain
    < Transfer-Encoding: chunked
    < Connection: keep-alive
    < 
    CLIENT VALUES:
    client_address=10.244.0.0
    command=GET
    real path=/
    query=nil
    request_version=1.1
    request_uri=http://10.0.12.240:8080/
    
    SERVER VALUES:
    server_version=nginx: 1.10.0 - lua: 10001
    
    HEADERS RECEIVED:
    accept=*/*
    host=10.0.12.240
    user-agent=curl/7.61.1
    BODY:
    * Connection #0 to host 10.0.12.240 left intact
    [oracle@ocne-operator ~]$
    

これにより、MetalLBが正しく構成され、アプリケーションがデプロイされ、リクエストが正常に受け入れられていることが確認されます。

詳細情報

その他の学習リソース

docs.oracle.com/learnで他のラボを探すか、Oracle Learning YouTubeチャネルで無料のラーニング・コンテンツにアクセスしてください。また、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerになります。

製品ドキュメントについては、Oracle Help Centerを参照してください。