[Kubernetes, WLS] Voyager/HAProxy as Load Balancer to Weblogic Domains in Kubernetes

原文はこちら。
https://blogs.oracle.com/weblogicserver/voyagerhaproxy-as-load-balancer-to-weblogic-domains-in-kubernetes

Overview

負荷分散は、スケーラブルで復元力のあるアプリケーションを構築するために広く使用されているテクノロジーです。負荷分散の主な機能は、サーバーの監視と、ネットワークトラフィックの複数のサーバー(Webアプリケーション、データベースなど)への分散です。Kubernetesで動作するコンテナ化されたアプリケーションでは、負荷分散も必要です。Oracle WebLogic Server Kubernetes Operator version 1.0で、Voyager/HAProxyのサポートを追加しました。create-weblogic-domain.shスクリプトを拡張してVoyager/HAProxyをすぐに使用できるようにしています。
Oracle Weblogic Server Kubernetes Operator
https://github.com/oracle/weblogic-kubernetes-operator/tree/release/1.0
このスクリプトは、1個のWebLogicドメイン/クラスタのサーバへの負荷分散をサポートしています。このエントリでは、Kubernetesの複数のWebLogicドメインにデプロイされたアプリケーションに対して負荷分散のサポートを拡張するためのVoyager/HAProxyの設定方法を説明します。

Basics of Voyager/HAProxy

HAProxyとVoyagerに詳しくない方は、HAProxyとVoyagerの基本を時間を掛けて学ぶ価値があります。

HAProxyは、TCPおよびHTTPベースのアプリケーション用の可用性の高いロードバランサとプロキシサーバを提供する、無料のオープンソース・ソフトウェアです。(プロセッサ速度とメモリ使用量の面で)高速で効率的であることはよく知られています。HAProxyの初心者ガイドは以下からどうぞ。
HAProxy Starter Guide version 1.9-dev1
http://cbonte.github.io/haproxy-dconv/1.9/intro.html
VoyagerはHAProxyを使うIngressコントローラです(IngressについてはKubernetesのドキュメントを参照してください)。
Ingress
https://kubernetes.io/docs/concepts/services-networking/ingress/
Kubernetesクラスタにインストールすると、VoyagerオペレータはKubernetes IngressリソースとVoyager自身のIngress CRDを監視し、状況に応じてHAProxyインスタンスを自動作成、更新、削除します。 Voyagerオペレータの仕組みを理解するには、voyagerの概要をご覧ください。
Voyager Overview
https://appscode.com/products/voyager/7.1.1/concepts/overview/

Running WebLogic Domains in Kubernetes

wls-operator-quickstartプロジェクトをGitHubからあなたのローカル環境にチェックアウトしてください。このプロジェクトを使うと、最小限の作業でWebLogic Operatorとドメインを設定できます。READMEのPre-Requirementsの章に記載の手順を実行して、ローカル環境を構成してください。
Quick Start of WLS Operator
https://github.com/lilyhe123/wls-operator-quickstart
wls-operator-quickstartプロジェクトとWebLogic Operatorを使用して、Kubernetes上で実行される2つのWebLogicドメインを、それぞれ独自の名前空間に設定します。
  • 'domain1'という名前のドメインは名前空間 'default'で実行され、2個の管理対象サーバ 'domain1-managed-server1'と 'domain1-managed-server2'を含む 'cluster-1'という1個のクラスタを有します。
  • 'domain2'という名前のドメインは名前空間 'test1'で実行され、2個の管理対象サーバ 'domain2-managed-server1'と 'domain2-managed-server2'を含む 'cluster-1'という1個のクラスタを有します。
  • Webアプリケーション 'testwebapp.war' は、domain1とdomain2の両方のクラスタに別々にデプロイされます。このWebアプリケーションには、どちらの管理対象サーバがHTTPリクエストを処理しているかを表示するデフォルトページがあります。
次の手順を実行して、HAProxyの背後にあるWebLogicドメインを準備します。
# change directory to root folder of wls-operator-quickstart
$ cd xxx/wls-operator-quickstart

# Build and deploy weblogic operator
$ ./operator.sh create

# Create domain1. Change value of `loadBalancer` to `NONE` in domain1-inputs.yaml before run.
$ ./domain.sh create

# Create domain2. Change value of `loadBalancer` to `NONE` in domain2-inputs.yaml before run.
$ ./domain.sh create -d domain2 -n test1

# Install Voyager
$ kubectl create namespace voyager
$ curl -fsSL https://raw.githubusercontent.com/appscode/voyager/6.0.0/hack/deploy/voyager.sh \
    | bash -s -- --provider=baremetal --namespace=voyager
以下のようにWebLogicドメインの状態を確認します。
# Check status of domain1
$ kubectl get all
NAME                          READY     STATUS    RESTARTS   AGE
pod/domain1-admin-server      1/1       Running   0          5h
pod/domain1-managed-server1   1/1       Running   0          5h
pod/domain1-managed-server2   1/1       Running   0          5h

NAME                                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
service/domain1-admin-server                        NodePort    10.105.135.58    <none>        7001:30705/TCP    5h
service/domain1-admin-server-extchannel-t3channel   NodePort    10.111.9.15      <none>        30015:30015/TCP   5h
service/domain1-cluster-cluster-1                   ClusterIP   10.108.34.66     <none>        8001/TCP          5h
service/domain1-managed-server1                     ClusterIP   10.107.185.196   <none>        8001/TCP          5h
service/domain1-managed-server2                     ClusterIP   10.96.86.209     <none>        8001/TCP          5h
service/kubernetes                                  ClusterIP   10.96.0.1        <none>        443/TCP           5h

# Verify web app in domain1 via running curl on admin server pod to access the cluster service
$ kubectl -n default exec -it domain1-admin-server -- curl http://domain1-cluster-cluster-1:8001/testwebapp/

# Check status of domain2
$ kubectl -n test1 get all
NAME                          READY     STATUS    RESTARTS   AGE
pod/domain2-admin-server      1/1       Running   0          5h
pod/domain2-managed-server1   1/1       Running   0          5h
pod/domain2-managed-server2   1/1       Running   0          5h

NAME                                                TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)           AGE
service/domain2-admin-server                        NodePort    10.97.77.35      <none>        7001:30701/TCP    5h
service/domain2-admin-server-extchannel-t3channel   NodePort    10.98.239.28     <none>        30012:30012/TCP   5h
service/domain2-cluster-cluster-1                   ClusterIP   10.102.228.204   <none>        8001/TCP          5h
service/domain2-managed-server1                     ClusterIP   10.96.59.190     <none>        8001/TCP          5h
service/domain2-managed-server2                     ClusterIP   10.101.102.102   <none>        8001/TCP          5h

# Verify the web app in domain2 via running curl in admin server pod to access the cluster service
$ kubectl -n test1 exec -it domain2-admin-server -- curl http://domain2-cluster-cluster-1:8001/testwebapp/
Kubernetesで両WebLogicドメインが稼働してから、異なるHAProxy機能を使って、2個のWebLogicドメインに帯する単一エントリポイントとしてVoyagerを構成します。

Using Host Name-Based Routing

Ingressリソースファイル 'voyager-host-routing.yaml' を作成します。このファイルにはホスト名ベース・ルーティングを使ったIngressリソースが含まれています。
apiVersion: voyager.appscode.com/v1beta1
kind: Ingress
metadata:
  name: hostname-routing 
  namespace: default
  annotations:
    ingress.appscode.com/type: 'NodePort'
    ingress.appscode.com/stats: 'true'
    ingress.appscode.com/affinity: 'cookie'
spec:
  rules:
  - host: domain1.org
    http:
      nodePort: '30305'
      paths:
      - backend:
          serviceName: domain1-cluster-cluster-1
          servicePort: '8001'
  - host: domain2.org
    http:
      nodePort: '30305'
      paths:
      - backend:
          serviceName: domain2-cluster-cluster-1.test1
          servicePort: '8001'
YAMLファイルを以下のコマンドを使ってデプロイします。
kubectl create -f voyager-host-routing.yaml

Testing Load Balancing with Host Name-Based Routing

ホスト名ベース・ルーティングを行うには、通常はDNSの変更を伴う仮想ホスティングを設定する必要があります。デモ目的のため、curlコマンドを使用して、ホスト名ベース・ルーティングによるロードバランシングをシミュレートします。
# Verify load balancing on domain1
$ curl --silent -H 'host: domain1.org' http://${HOSTNAME}:30305/testwebapp/ | grep InetAddress.hostname
    <li>InetAddress.hostname: domain1-managed-server1
$ curl --silent -H 'host: domain1.org' http://${HOSTNAME}:30305/testwebapp/ | grep InetAddress.hostname
    <li>InetAddress.hostname: domain1-managed-server2

# Verify load balancing on domain2
$ curl --silent -H 'host: domain2.org' http://${HOSTNAME}:30305/testwebapp/ | grep InetAddress.hostname
    <li>InetAddress.hostname: domain2-managed-server1
$ curl --silent -H 'host: domain2.org' http://${HOSTNAME}:30305/testwebapp/ | grep InetAddress.hostname
    <li>InetAddress.hostname: domain2-managed-server2
結果は以下の通りです。
  • ホスト名 'domain1.org' を指定すると、リクエストはdomain1の管理対象サーバで処理される。
  • ホスト名 'domain2.org' を指定すると、リクエストはdomain2の管理対象サーバで処理される。

Using Path-Based Routing and URL Rewriting

この章では、URL書き換えによるパスベース・ルーティングを使用して、ホスト名ベース・ルーティングと同じ動作を実現します。

Ingressリソースファイル 'voyager-path-routing.yaml'を作成します。
apiVersion: voyager.appscode.com/v1beta1
kind: Ingress
metadata:
  name: path-routing
  namespace: default
  annotations:
    ingress.appscode.com/type: 'NodePort'
    ingress.appscode.com/stats: 'true'
    ingress.appscode.com/rewrite-target: "/testwebapp"
spec:
  rules:
  - host: '*'
    http:
      nodePort: '30307'
      paths:
      - path: /domain1
        backend:
          serviceName: domain1-cluster-cluster-1
          servicePort: '8001'
      - path: /domain2
        backend:
          serviceName: domain2-cluster-cluster-1.test1
          servicePort: '8001' 
YAMLファイルを以下のコマンドを使ってデプロイします。
kubectl create -f voyager-path-routing.yaml

Verify Load Balancing with Path-Based Routing

負荷分散の結果を検証するため、curlコマンドを使います。別の方法として、Webブラウザから直接URLにアクセスすることもできます。
# Verify load balancing on domain1
$ curl --silent http://${HOSTNAME}:30307/domain1/ | grep InetAddress.hostname
    <li>InetAddress.hostname: domain1-managed-server1
$ curl --silent http://${HOSTNAME}:30307/domain1/ | grep InetAddress.hostname
    <li>InetAddress.hostname: domain1-managed-server2

# Verify load balancing on domain2
$ curl --silent http://${HOSTNAME}:30307/domain2/ | grep InetAddress.hostname
    <li>InetAddress.hostname: domain2-managed-server1
$ curl --silent http://${HOSTNAME}:30307/domain2/ | grep InetAddress.hostname
    <li>InetAddress.hostname: domain2-managed-server2
異なるURLを指定してパスベース・ルーティングによりトラフィックが異なるWebLogicドメインに振り分けられることを確認できます。URL書き換え機能を使えば、最終的に各ドメインの同じコンテキスト・パスを持つWebアプリケーションにアクセスできます。

Cleanup

このエントリの手順を使った演習終了後は、Kubernetesで作成した全てのリソースをクリーンアップしたいと思うことでしょう。
# Cleanup voyager ingress resources
$ kubectl delete -f voyager-host-routing.yaml
$ kubectl delete -f voyager-path-routing.yaml
 
# Uninstall Voyager
$ curl -fsSL https://raw.githubusercontent.com/appscode/voyager/6.0.0/hack/deploy/voyager.sh \
      | bash -s -- --provider=baremetal --namespace=voyager --uninstall --purge

# Delete wls domains and wls operator
$ cd <QUICKSTART_ROOT>
$ ./domain.sh delete --clean-all
$ ./domain.sh delete -d domain2 -n test1 --clean-all
$ ./operator.sh delete

Summary

このエントリでは、Voyagerロードバランサを構成し、WebLogic ServerドメインにデプロイしたTCPベースおよびHTTPベースのアプリケーションのための、可用性の高いリクエストの負荷分散とプロキシサーバ機能を提供する方法を説明しました。このエントリで提供したサンプルでは、Voyagerを複数のWebLogicドメインの前の単一ポイントとして使用する方法を説明しました。ホスト名ベースルーティング、パスベースルーティング、URL書き換えなどのVoyager機能の使用方法を示す例を示しました。このブログが皆様のお役に立つことを願いつつ、是非Kubernetes上のWebLogic環境でVoyagerを使用してみてください。

0 件のコメント:

コメントを投稿