Ubuntu 26.04 で複数のバックエンドサーバーへ TCP 通信を振り分けたい場合、HAProxy を使うとシンプルなロードバランサーを構成できます。Kubernetes API、LDAP、SMTP、独自 TCP サービスなど、HTTP に限らない入口を作りたい場面で便利です。
この記事では、haproxy の導入、/etc/haproxy/haproxy.cfg の基本構成、TCP モードの frontend / backend、構文検証、サービス確認、接続確認をまとめます。
haproxyパッケージの導入/etc/haproxy/haproxy.cfgの基本構成global、defaults、frontend、backendの役割- TCP モード、ヘルスチェック、バックエンド切り替え
- 構文検証、サービス確認、接続確認
| 対象 OS | Ubuntu 26.04 Server |
|---|---|
| パッケージ | haproxy |
| サービス | haproxy.service |
| 設定ファイル | /etc/haproxy/haproxy.cfg |
| 検証コマンド | /usr/sbin/haproxy -c -f /etc/haproxy/haproxy.cfg |
HAProxy の構成要素を確認する
HAProxy の設定は、全体設定の global、既定値の defaults、受け口の frontend、振り分け先の backend に分けて考えます。TCP ロードバランサーでは、mode tcp と option tcplog を使うと通信単位のログを追いやすくなります。
globalはログ、実行ユーザー、管理ソケットなどを定義するdefaultsは共通のモード、タイムアウト、ログ設定を定義するfrontendは待ち受けアドレスとポートを定義するbackendは振り分け先サーバーとヘルスチェックを定義する- 設定反映前に
haproxy -cで構文を検証する
HAProxy をインストールする
まず haproxy パッケージを導入します。設定ファイルを配置する前に、サービス名とバイナリの場所を確認しておくと検証しやすくなります。
sudo apt update
sudo apt install -y haproxy
haproxy -v
systemctl status haproxy.service --no-pagerglobal と defaults を設定する
global ではログ、管理ソケット、実行ユーザー、最大接続数を定義します。defaults では TCP モード、ログ方式、接続タイムアウトを定義します。
global
log /dev/log local0
log /dev/log local1 notice
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
maxconn 10000
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5s
timeout client 60s
timeout server 60sfrontend を設定する
frontend はクライアントからの接続を受ける入口です。ここでは TCP 6443 番を受け、k8s-api-backend へ渡す例にします。実際のポートは対象サービスに合わせます。
frontend k8s-api-frontend
bind 192.0.2.10:6443
bind [2001:db8::10]:6443
default_backend k8s-api-backendbackend を設定する
backend には振り分け先サーバーを並べます。default-server check を使うと、各サーバーにヘルスチェックを適用できます。単純な TCP ロードバランスでは balance roundrobin から始めると動作を把握しやすいです。
backend k8s-api-backend
balance roundrobin
option redispatch
default-server check
server cp01 192.0.2.21:6443
server cp02 192.0.2.22:6443
server cp03 192.0.2.23:6443完全な最小構成を作る
実際の /etc/haproxy/haproxy.cfg では、global、defaults、frontend、backend をひとつのファイルにまとめます。
global
log /dev/log local0
log /dev/log local1 notice
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
maxconn 10000
defaults
log global
mode tcp
option tcplog
option dontlognull
timeout connect 5s
timeout client 60s
timeout server 60s
frontend app-frontend
bind 192.0.2.10:8443
default_backend app-backend
backend app-backend
balance roundrobin
option redispatch
default-server check
server app01 192.0.2.31:8443
server app02 192.0.2.32:8443設定ファイルを検証して反映する
HAProxy は設定ミスがあると起動に失敗します。反映前に haproxy -c で検証し、問題がなければサービスを再起動します。
sudo /usr/sbin/haproxy -c -f /etc/haproxy/haproxy.cfg
sudo systemctl restart haproxy.service
sudo systemctl enable haproxy.service
systemctl status haproxy.service --no-pager待ち受けと接続を確認する
サービスが active でも、想定した IP アドレスとポートで待ち受けているとは限りません。ss、nc、openssl s_client などを使い、入口とバックエンドの両方を確認します。
ss -lntp | grep haproxy
nc -vz 192.0.2.10 8443
nc -vz 192.0.2.31 8443
nc -vz 192.0.2.32 8443ログとヘルスチェックを見る
TCP モードでは、接続ログとバックエンドのヘルスチェック状態が切り分けの入口になります。systemd journal と syslog を確認し、バックエンド down、接続拒否、タイムアウトを見分けます。
journalctl -u haproxy.service --no-pager -n 100
grep haproxy /var/log/syslog
echo "show stat" | sudo socat - /run/haproxy/admin.sock運用前の確認ポイント
/etc/haproxy/haproxy.cfgの構文検証が通っているhaproxy.serviceが active になっているfrontendが想定 IP アドレスとポートで待ち受けているbackendのサーバー名、IP アドレス、ポートが正しいdefault-server checkでヘルスチェックを有効にしている- ログで接続、切断、タイムアウトを確認できる
- ロードバランサー自身の NIC、ファイアウォール、ルーティングも確認している
まとめ
Ubuntu 26.04 の HAProxy 基本設定では、haproxy を導入し、/etc/haproxy/haproxy.cfg に global、defaults、frontend、backend を定義します。
TCP ロードバランサーとして使う場合は、mode tcp、option tcplog、default-server check、構文検証、待ち受け確認、バックエンド接続確認までをひとつの流れで押さえると、障害時の切り分けが進めやすくなります。

