本文へジャンプします。

ニフクラ ユーザーガイド

クラウド トップ>ユーザーガイド>Kubernetes Service Hatoba>HTTPロードバランサーを使用した負荷分散
本ページは2023/9/5をもって、新ページhttps://docs.nifcloud.com/kubernetes-service-hatoba/guide/http_loadbalancing.htmへ移行しました。 今後は新ページをご参照ください。

Kubernetes Service Hatoba:HTTPロードバランサーを使用した負荷分散

HTTPロードバランサーを使用した負荷分散の方法を説明します。

ステップ1:クラスターのHTTPロードバランサー設定

KubernetesクラスターのHTTPロードバランサーを設定します。

なお、クラスター作成時に「HTTPロードバランサー」を「利用する」を指定した場合、この操作は不要です。

クラスターの作成方法は「クイックスタート」をご確認ください。

Kubernetes Service Hatoba:クイックスタート

  1. クラスターの一覧画面でHTTPロードバランサー設定をしたいクラスターを選択し、「選択したクラスターの操作」から「設定変更」を選択します。

    コンパネ-クラスター-設定変更

  2. 「01 基本設定」の「HTTPロードバランサー」の項目を「利用する」に設定します。

    コンパネ-クラスター-基本設定

  3. 「02 確認」タブで入力内容を確認し、「変更する」をクリックします。

    コンパネ-クラスター-確認

ステップ2:必要なリソースの作成

HTTPロードバランシングに必要な各種yamlを作成します。

今回は2つのPodとServiceを作成し、それらにHTTPロードバランサーを用いてロードバランシングするサンプルアプリケーションを作成します。

  1. 1つ目のPodとServiceを作成するために、下記のようなecho1.yamlを作成します。

    このPodはHTTPで/にアクセスするとecho1と返却します。

    kind: Pod
    apiVersion: v1
    metadata:
      name: echo1-app
      labels:
        app: echo1
    spec:
      containers:
        - name: echo1-app
          image: hashicorp/http-echo
          args:
            - -text=echo1
            - -listen=:80
    
    ---
    
    kind: Service
    apiVersion: v1
    metadata:
      name: echo1-service
    spec:
      selector:
        app: echo1
      ports:
        - port: 80 
  2. 2つ目のPodとServiceを作成するために、下記のようなecho2.yaml作成します。

    このPodはHTTPで/にアクセスするとecho2と返却します。

    kind: Pod
    apiVersion: v1
    metadata:
      name: echo2-app
      labels:
        app: echo2
    spec:
      containers:
        - name: echo2-app
          image: hashicorp/http-echo
          args:
            - -text=echo2
            - -listen=:80
    
    ---
    
    kind: Service
    apiVersion: v1
    metadata:
      name: echo2-service
    spec:
      selector:
        app: echo2
      ports:
        - port: 80
  3. 上記の2つのアプリケーションのロードバランシングを行うingress.yamlを作成します。

    Kubernetes Service Hatobaでは、「HTTPロードバランサー」の設定を有効にしたクラスターでIngressリソースを作成するとL7レベルでの負荷分散が可能になります。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: example-ingress
    spec:
      ingressClassName: "nginx"
      rules:
      - http:
          paths:
            - path: /echo1
              pathType: Prefix
              backend:
                service: 
                  name: echo1-service
                  port:
                    number: 80 
            - path: /echo2
              pathType: Prefix
              backend:
                service:
                  name: echo2-service
                  port:
                    number: 80
  4. Pod、Serviceのyamlを適用します。

    $ kubectl apply -f echo1.yaml,echo2.yaml
    pod/echo1-app created
    service/echo1-service created
    pod/echo2-app created
    service/echo2-service created
  5. Podが作成されているのを確認します。

    $ kubectl get pod
    NAME                                     READY   STATUS    RESTARTS   AGE
    echo1-app                                1/1     Running   0          24s
    echo2-app                                1/1     Running   0          24s
  6. ingress.yamlの適用します。

    $ kubectl apply -f ingress.yaml         
    ingress.networking.k8s.io/example-ingress created

ステップ3:NodePort方式でHTTPロードバランシングする

このステップでは、ingress-nginx-controllerをNodePortに設定してアプリケーションを公開します。

  1. ingress-nginx-controllerのポートを確認します。

    NodePort でアクセスするために、ingress-nginx-controllerが公開されているポートを調べます。

    $ kubectl get service -n ingress-nginx ingress-nginx-controller
    NAME                       TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)                      AGE
    ingress-nginx-controller   NodePort   10.97.79.128   <none>        80:31711/TCP,443:32106/TCP   11m
  2. 各NodeのEXTERNAL-IPを確認します。

    $ kubectl get -o wide node                                     
    NAME                 STATUS   ROLES    AGE   VERSION   INTERNAL-IP    EXTERNAL-IP       OS-IMAGE           KERNEL-VERSION     CONTAINER-RUNTIME
    testnoodpool-btlg4   Ready    <none>   16m   v1.21.1   192.168.1.33   xxx.xxx.xxx.xxx   Ubuntu 20.04 LTS   5.4.0-33-generic   containerd://1.4.3
    testnoodpool-drfye   Ready    <none>   16m   v1.21.1   192.168.1.34   yyy.yyy.yyy.yyy   Ubuntu 20.04 LTS   5.4.0-33-generic   containerd://1.4.3
    testnoodpool-hrrfb   Ready    <none>   16m   v1.21.1   192.168.1.35   zzz.zzz.zzz.zzz   Ubuntu 20.04 LTS   5.4.0-33-generic   containerd://1.4.3
  3. 上記のコマンドで確認したEXTERNAL-IPのうちの1つにingress-nginx-controllerのポートで接続すると、それぞれのパスに対応したレスポンスが返却されます。なお接続する際は必要に応じてファイアウォールルールを追加してください。

    $ curl http://xxx.xxx.xxx.xxx:31711/echo1
    echo1
    
    $ curl http://xxx.xxx.xxx.xxx:31711/echo2
    echo2

ステップ4:LoadBalancer方式でHTTPロードバランシングする

このステップでは、L4ロードバランサーとHTTPロードバランサーを組み合わせることにより、アプリケーションを外部に公開します。

  1. ロードバランサー名をアノテーションで設定します。

    設定可能なアノテーションはニフクラ Kubernetes Service Hatobaロードバランサーのクラウド技術仕様をご覧ください。

    ニフクラ Kubernetes Service Hatoba:ロードバランサー

    また設定可能な値はニフクラ コンピューティングの CreateLoadBalancer API仕様をご確認ください。

    ニフクラAPI (コンピューティング: CreateLoadBalancer)

    $ kubectl annotate service -n ingress-nginx ingress-nginx-controller service.beta.kubernetes.io/hatoba-load-balancer-name=ingress
    service/ingress-nginx-controller annotated
  2. ingress-nginx-controllerのtypeをLoadBalancerに変更します。ロードバランサー(L4)の作成に伴う料金はクラスターとは別に発生するのでご注意ください。

    $ kubectl patch service -n ingress-nginx ingress-nginx-controller -p '{"spec":{"type": "LoadBalancer"}}'
    service/ingress-nginx-controller patched
  3. ingress-nginx-controllerのtypeがLoadBalancerになり、EXTERNAL-IPが割り振られていることを確認します。

    $ kubectl get service -n ingress-nginx ingress-nginx-controller
    NAME                       TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
    ingress-nginx-controller   LoadBalancer   10.97.79.128   xxx.xxx.xxx.xxx   80:31711/TCP,443:32106/TCP   28m
  4. 割り当てられたロードバランサーのIPアドレスにアクセスすると、それぞれのパスに対応したレスポンスが返却されます。

    $ curl http://xxx.xxx.xxx.xxx/echo1
    echo1
    
    $ curl http://xxx.xxx.xxx.xxx/echo2
    echo2
  • ※本ページ記載の金額は、すべて税抜表示です。
  • ※本ページ記載の他社製品名および会社名などは、各社の商標または登録商標です。
  • ※本ページの内容は、2023年9月05日時点の情報です。

推奨画面サイズ 1024×768 以上