GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでNGINXをTCP/UDPロードバランサーとして構成する方法

ご存知のとおり、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ロードバランサーのセットアップに役立つことを願っています。以下のコメントセクションで、技術的なフィードバックをお気軽に共有してください。


Linux
  1. LinuxでVimをデフォルトのエディターとして設定する方法

  2. RedhatLinuxで仮想化を構成する方法

  3. HAProxyロードバランサーを設定する方法

  1. Linuxカーネルモジュールをロードまたはアンロードする方法

  2. Rocky Linux / AlmaLinux8にHAProxyロードバランサーをインストールして構成する方法

  3. Linux でソースから Nginx をインストールして構成する方法

  1. TCPおよびUDPポートをリアルタイムで監視する方法

  2. LinuxでChrootSFTPサーバーを構成する方法

  3. LinuxサーバーでVLANタグ付きNIC(イーサネットカード)を構成する方法