ご存知のとおり、NGINXは評価の高いオープンソースWebサーバーの1つですが、TCPおよびUDPロードバランサーとしても使用できます。 HAProxyよりもロードバランサーとしてnginxを使用する主な利点の1つは、UDPベースのトラフィックの負荷を分散できることです。この記事では、KubernetesクラスターにデプロイされたアプリケーションのロードバランサーとしてNGINXを構成する方法を示します。
Kubernetesクラスターが既にセットアップされ、稼働していると想定しています。CentOS/ RHELforNGINXに基づいてVMを作成します。
ラボのセットアップの詳細は次のとおりです。
- NGINX VM(最小CentOS / RHEL)– 192.168.1.50
- Kubeマスター– 192.168.1.40
- Kube Worker 1 – 192.168.1.41
- Kubeワーカー2– 192.168.1.42
NGINXのインストールと構成に飛び込みましょう。私の場合は、NGINXに最小限のCentOS8を使用しています。
ステップ1)nginxパッケージのEPELリポジトリを有効にする
CentOS 8システムにログインし、epelリポジトリを有効にします。これは、nginxパッケージがCentOS/RHELのデフォルトリポジトリでは利用できないためです。
[[email protected] ~]$ sudo dnf install epel-release -y
ステップ2)dnfコマンドを使用してNGINXをインストールします
次のdnfコマンドを実行してnginxをインストールします
[[email protected] ~]$ sudo dnf install nginx -y
rpmコマンドの下で実行してNGINXの詳細を確認します
# rpm -qi nginx
コマンドの下で実行してファイアウォールでNGINXポートを許可する
[[email protected] ~]# firewall-cmd --permanent --add-service=http [[email protected] ~]# firewall-cmd --permanent --add-service=https [[email protected] ~]# firewall-cmd –reload
次のコマンドを使用して、SELinuxをpermissiveモードに設定します。
[[email protected] ~]# sed -i s/^SELINUX=.*$/SELINUX=permissive/ /etc/selinux/config [[email protected] ~]# setenforce 0 [[email protected] ~]#
ステップ3)Kubernetesセットアップから入力コントローラーのNodePortの詳細を抽出します
Kubernetesでは、nginx入力コントローラーを使用して、定義されたリソースの着信トラフィックを処理します。入力コントローラーをデプロイすると、その時点で、ホストノードポートをポート80および443にマップするサービスも作成されます。これらのホストノードポートは、各ワーカーノードから開かれます。この詳細を取得するには、kubeマスターノードまたはコントロールプランにログインして実行します。
$ kubectl get all -n ingress-nginx
上記の出力を見るとわかるように、各ワーカーノードのNodePort 32760はポート80にマップされ、NodePort32375は443ポートにマップされています。これらのノードポートをNginx構成ファイルで使用して、tcpトラフィックの負荷を分散します。
ステップ4)TCPロードバランサーとして機能するようにNGINXを構成します
nginx構成ファイルを編集し、それに次の内容を追加します。
[[email protected] ~]# vim /etc/nginx/nginx.conf
サーバーセクションの行(38から57まで)をコメントアウトし、次の行を追加します。
upstream backend { server 192.168.1.41:32760; server 192.168.1.42:32760; } server { listen 80; location / { proxy_read_timeout 1800; proxy_connect_timeout 1800; proxy_send_timeout 1800; send_timeout 1800; proxy_set_header Accept-Encoding ""; proxy_set_header X-Forwarded-By $server_addr:$server_port; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_pass http://backend; } location /nginx_status { stub_status; } }
ファイルを保存して終了します。
上記の変更により、nginxサーバーIPのポート80でリクエストが送信されると、NodePort(32760)のKubernetesワーカーノードIP(192.168.1.41/42)にルーティングされます。
次のコマンドを使用してNGINXサービスを開始して有効にしましょう
[[email protected] ~]# systemctl start nginx [[email protected] ~]# systemctl enable nginx
TCPロードバランサーのNGINXをテストする
nginxがKubernetesのTCPロードバランサーとして正常に機能しているかどうかをテストするには、nginxベースのデプロイをデプロイし、サービスを介してデプロイを公開し、nginxデプロイメント用の入力リソースを定義します。次のコマンドとyamlファイルを使用して、これらのKubernetesオブジェクトをデプロイしました
[[email protected] ~]$ kubectl create deployment nginx-deployment --image=nginx deployment.apps/nginx-deployment created [[email protected] ~]$ kubectl expose deployments nginx-deployment --name=nginx-deployment --type=NodePort --port=80 service/nginx-deployment exposed [[email protected] ~]$ [[email protected] ~]$ vi nginx-ingress.yaml
[[email protected] ~]$ kubectl create -f nginx-ingress.yaml ingress.networking.k8s.io/nginx-ingress-example created [[email protected] ~]$
次のコマンドを実行して、デプロイメント、svc、および入力の詳細を取得します。
完璧です。nginx-lb.example.comがnginxサーバーのIPアドレス(192.168.1.50)を指すように、システムのホストファイルを更新しましょう。
192.168.1.50 nginx-lb.example.com
URLをpingして、NGINXサーバーIPを指していることを確認してみましょう。
# ping nginx-lb.example.com Pinging nginx-lb.example.com [192.168.1.50] with 32 bytes of data: Reply from 192.168.1.50: bytes=32 time<1ms TTL=64 Reply from 192.168.1.50: bytes=32 time<1ms TTL=64
次に、Webブラウザを介してURLにアクセスしてみます
上記は、NGINXがK8sワーカーノード間のポート80で着信するtcpトラフィックの負荷分散を行っているため、TCPロードバランサーとして正常に機能していることを示しています。
ステップ5)UDPロードバランサーとして機能するようにNGINXを構成します
Kubernetes内でUDPベースのアプリケーションを実行していると仮定します。アプリケーションは、NodePortタイプとしてUDPポート31923で公開されます。ポート1751から来るUDPトラフィックをk8sワーカーノードのNodePortに負荷分散するようにNGINXを構成します。
ncコマンドが使用可能な「linux-udp-port」という名前のポッドをすでに実行していると仮定し、NodePortタイプとしてUDPポート10001のサービスを介して公開します。
[[email protected] ~]$ kubectl expose pod linux-udp-pod --type=NodePort --port=10001 --protocol=UDP service/linux-udp-pod exposed [[email protected] ~]$ [[email protected] ~]$ kubectl get svc linux-udp-pod NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE linux-udp-pod NodePort 10.96.6.216 <none> 10001:31923/UDP 19m [[email protected] ~]$
NGINXをUDPロードバランサーとして構成するには、その構成ファイルを編集し、ファイルの最後に次の内容を追加します
[[email protected] ~]# vim /etc/nginx/nginx.conf …… stream { upstream linux-udp { server 192.168.1.41:31923; server 192.168.1.42:31923; } server { listen 1751 udp; proxy_pass linux-udp; proxy_responses 1; } ……
ファイルを保存して終了し、次のコマンドを使用してnginxサービスを再起動します
[[email protected] ~]# systemctl restart nginx
次のコマンドを実行して、ファイアウォールでUDPポート1751を許可します
[[email protected] ~]# firewall-cmd --permanent --add-port=1751/udp [[email protected] ~]# firewall-cmd --reload
上記で構成されたNGINXを使用してUDP負荷分散をテストします
PODにログインし、UDPポート10001でリッスンするダミーサービスを開始します
[[email protected] ~]$ kubectl exec -it linux-udp-pod -- bash [email protected]:/# nc -l -u -p 10001
これをそのままにして、UDP負荷分散をテストするマシンにログインし、そのマシンからNGINXサーバーに到達できることを確認し、次のコマンドを実行してNGINXサーバーIPのudpポート(1751)に接続してから、文字列を入力
#nc -u 192.168.1.50 1751
[[email protected] ~]# nc -u 192.168.1.50 1751 Hello, this UDP LB testing
次に、PODのsshセッションに移動すると、同じメッセージが表示されるはずです。
[email protected]:/# nc -l -u -p 10001 Hello, this UDP LB testing
上記の完全な出力は、UDPロードバランシングがNGINXで正常に機能していることを確認します。この記事の内容は以上です。この情報が参考になり、NGINXロードバランサーのセットアップに役立つことを願っています。以下のコメントセクションで、技術的なフィードバックをお気軽に共有してください。