nginx haproxy + dnsmasq 基于dns 进行服务负载处理
默认nacos 与coredns plugin 的能力有点弱(比如srv 支持的),为了体验nginx 以及haproxy 关于dns 服务负载的处理,基于了dnsmasq进行测试
参考玩法

简单说明: 基于dnsmasq 配置服务记录,nginx 以及haproxy 通过dns 支持能力处理
示例
详细参考github 代码
- dnsmasq 配置
为了简化基于hosts 模式,使用的时候配置hosts 就可以了,具体查看github
- haproxy 配置
global
log stdout format raw local0 info
stats socket /run/haproxy.sock mode 600 level admin
stats timeout 30s
user haproxy
group haproxy
# 自定义dns 配置
resolvers mydns
nameserver dns1 dnsmasq:53
accepted_payload_size 8192 # allow larger DNS payloads
listen stats
bind :9000
mode http
stats enable
stats realm Haproxy\ Statistics # Title text for popup window
stats uri /haproxy_stats
frontend mydemo
bind *:8080
mode http
option httplog
log stdout format raw local0 info
default_backend mydemo_backend
backend mydemo_backend
mode http
balance roundrobin
# a 记录模式的
server-template web 3 demo.go:80 check resolvers mydns init-addr none
frontend mydemov2
bind *:8081
mode http
option httplog
log stdout format raw local0 info
default_backend mydemo_backendv2
backend mydemo_backendv2
mode http
balance roundrobin
# srv 格式的
server-template web 2 _sip._tcp.demoapp.go check resolvers mydns init-addr none
frontend prometheus
bind *:8405
mode http
option httplog
http-request use-service prometheus-exporter if { path /metrics }
frontend prometheusv2
bind *:8500
mode http
option httplog
log stdout format raw local0 info
default_backend prometheusv2
backend prometheusv2
mode http
server prometheusv1 127.0.0.1:8405 check
defaults
log global
mode http
option httplog
option log-health-checks
option dontlognull
timeout connect 5s
timeout client 50s
timeout server 50s
- nginx
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_types text/plain application/json application/javascript text/css application/xml;
# dns 配置,注意valid 参数,建议小一些
resolver dnsmasq valid=10s ipv6=off;
resolver_timeout 10s;
upstream backend {
# 配置zone 必须参数
zone backend_zone 64k;
# resolve 支持动态更新,a 记录
server demo.go resolve;
}
upstream backendv2 {
# 配置zone 必须参数
zone backend_zone 64k;
# resolve 支持动态更新, srv 模式
server demoapp.go service=_sip._tcp resolve;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
server {
listen 9090;
location / {
proxy_pass http://backendv2;
}
}
}
说明
以上是一个简单的测试示例,完整我已经提交github 了,可以通过gihub 完整示例可以体验nginx 以及haproxy 基于dns 的服务负载处理,当然dnsmasq 属于静态玩法,利用coredns 是一个不错的选择,动态能力更强(powerdns 也是一种选择),当时coredns 的云原生能力更好,对于容器以及k8s 周边的支持更好
参考资料
https://github.com/rongfengliang/nginx_haproxy_dnsmasq_ds_learning
https://www.haproxy.com/blog/dns-service-discovery-haproxy
https://blog.nginx.org/blog/dynamic-dns-resolution-open-sourced-in-nginx
https://github.com/rongfengliang/coredns-nacos
https://github.com/cloud66-oss/coredns_mysql
https://nginx.org/en/docs/http/ngx_http_upstream_module.html#server
浙公网安备 33010602011771号