Kubernetes Service Hatoba:HTTPロードバランサーを使用した負荷分散
HTTPロードバランサーを使用した負荷分散の方法を説明します。
ステップ1:クラスターのHTTPロードバランサー設定
KubernetesクラスターのHTTPロードバランサーを設定します。
なお、クラスター作成時に「HTTPロードバランサー」を「利用する」を指定した場合、この操作は不要です。
クラスターの作成方法は「クイックスタート」をご確認ください。
Kubernetes Service Hatoba:クイックスタート
クラスターの一覧画面でHTTPロードバランサー設定をしたいクラスターを選択し、「選択したクラスターの操作」から「設定変更」を選択します。
「01 基本設定」の「HTTPロードバランサー」の項目を「利用する」に設定します。
「02 確認」タブで入力内容を確認し、「変更する」をクリックします。
ステップ2:必要なリソースの作成
HTTPロードバランシングに必要な各種yamlを作成します。
今回は2つのPodとServiceを作成し、それらにHTTPロードバランサーを用いてロードバランシングするサンプルアプリケーションを作成します。
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つ目の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
上記の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
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
Podが作成されているのを確認します。
$ kubectl get pod NAME READY STATUS RESTARTS AGE echo1-app 1/1 Running 0 24s echo2-app 1/1 Running 0 24s
ingress.yamlの適用します。
$ kubectl apply -f ingress.yaml ingress.networking.k8s.io/example-ingress created
ステップ3:NodePort方式でHTTPロードバランシングする
このステップでは、ingress-nginx-controllerをNodePortに設定してアプリケーションを公開します。
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
各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
上記のコマンドで確認した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ロードバランサーを組み合わせることにより、アプリケーションを外部に公開します。
ロードバランサー名をアノテーションで設定します。
設定可能なアノテーションはニフクラ 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
ingress-nginx-controllerのtypeをLoadBalancerに変更します。ロードバランサー(L4)の作成に伴う料金はクラスターとは別に発生するのでご注意ください。
$ kubectl patch service -n ingress-nginx ingress-nginx-controller -p '{"spec":{"type": "LoadBalancer"}}' service/ingress-nginx-controller patched
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
割り当てられたロードバランサーのIPアドレスにアクセスすると、それぞれのパスに対応したレスポンスが返却されます。
$ curl http://xxx.xxx.xxx.xxx/echo1 echo1 $ curl http://xxx.xxx.xxx.xxx/echo2 echo2