편집: 실제 문제는 local0과 local2의 차이 또는 rsyslog 처리의 끝으로 끝납니다.
kubernetes/openshift 클러스터를 구축 중인데, 그 전에 API 서버 및 애플리케이션 서비스용 L4 LB를 설정해야 합니다. 트래픽 자체가 실제로는 https이지만 트래픽은 tcp 수준에서 처리됩니다. 이렇게 설정하는 이유는 apiserver / http 앱 와일드카드 레코드에 대해 DNS가 가리키는 IP 주소가 haproxy 호스트에 있더라도 kubernetes/openshift가 인증서와 해당 키를 소유하기 때문입니다.
로드 밸런싱이 작동합니다. 즉, 트래픽은 문제 없이 있어야 할 곳으로 이동하지만 haproxy는 이를 달성하기 위한 모든 노력에도 불구하고 /var/log/messages
대신 모든 로그를 작성해야 한다고 주장합니다. /var/log/haproxy/haproxy.log
내가 아는 한:
- rsyslog가 UDP 포트 514에서 수신 대기 중입니다.
- rsyslog는 haproxy 문서 및 많은 답변의 지시에 따라 이를 haproxy 파일에 쓰도록 지시됩니다.
- haproxy는 로그를 127.0.0.514로 보내도록 지시받습니다.
호스트 시스템은 RHEL8이고 haproxy 1.8.15 및 rsyslog 8.37은 공식 저장소에서 설치됩니다.
나에게 관련 부분은 다음과 같습니다 /etc/haproxy/haproxy.cfg
.
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
# to have these messages end up in /var/log/haproxy.log you will
# need to:
#
# 1) configure syslog to accept network log events. This is done
# by adding the '-r' option to the SYSLOGD_OPTIONS in
# /etc/sysconfig/syslog
#
# 2) configure local2 events to go to the /var/log/haproxy.log
# file. A line like the following can be added to
# /etc/sysconfig/syslog
#
# local2.* /var/log/haproxy.log
#
log 127.0.0.1 local0
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#---------------------------------------------------------------------
defaults
mode http
log global
option httplog
option dontlognull
option http-server-close
option redispatch
retries 3
timeout http-request 10s
timeout queue 1m
timeout connect 10s
timeout client 1m
timeout server 1m
timeout http-keep-alive 10s
timeout check 10s
maxconn 3000
.
.
.
# ---------------------------------------------------------------------
# round robin balancing for OCP Ingress Insecure Port
# ---------------------------------------------------------------------
frontend ingress_insecure
bind *:80
mode tcp
option tcplog
default_backend ingress_insecure_backend
backend ingress_insecure_backend
balance roundrobin
mode tcp
server worker1.cluster.example.com <ip address>:80 check
server worker2.cluster.example.com <ip address>:80 check
이 내 꺼야 /etc/rsyslog.d/haproxy
:
local0.* /var/log/haproxy/haproxy.log
& stop
이 줄은 다음 위치에 있습니다 /etc/rsyslog.conf
.
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
이것은 다음의 출력입니다 netstat -tulpn
.
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
--- clip ---
udp 0 0 0.0.0.0:514 0.0.0.0:* 8031/rsyslogd
udp6 0 0 :::514 :::* 15270/rsyslogd
--- clip ---
이것은 다음의 출력입니다 ls
.(디렉토리를 수동으로 생성하고 거기에 도달하지 않도록 매우 허용적인 액세스 모드를 부여했습니다)
# ls -ld /var/log/haproxy
drwxrwxrwx 2 root root 6 Dec 18 14:40 /var/log/haproxy
# ls -la /var/log/haproxy
total 12
drwxrwxrwx 2 root root 6 Dec 18 14:40 .
drwxr-xr-x. 11 root root 8192 Dec 18 14:50 ..
그러나 haproxy 로그 데이터는 여전히 아래에만 표시되고 /var/log/messages
아래에는 표시되지 않습니다 /var/log/haproxy/
. 더 자세히 살펴봐야 할 조언이 있나요?
답변1
알았어, 이렇게 생겼어https://linuxconfig.org/install-and-configure-haproxy-on-redhat-8내 문제를 해결했습니다.
다음과 같이 변경합니다.
/etc/haproxy/haproxy.cfg:
global
-- clip --
log 127.0.0.1 local2
-- clip --
/etc/rsyslog.d/haproxy.conf:
local2.=info /var/log/haproxy/haproxy-access.log
local2.notice /var/log/haproxy/haproxy-info.log
파일명도 주의하세요! 또 다른 문제는 내 ansible 스크립트(이러한 파일을 적절한 위치에 배치하는)에 버그가 있고 rsyslog 구성 파일에 ".conf" 부분이 없다는 것입니다!
그런 다음 관련 서비스를 다시 시작합니다.
# systemctl restart rsyslog
# systemctl restart haproxy
참고로 tcpdump는 실제로 syslog 트래픽이 있음을 보여주었습니다.
# tcpdump -i lo
-- clip --
17:11:35.178564 IP localhost.58466 > localhost.syslog: SYSLOG local2.info, length: 157
-- clip --
(다른 터미널에서 이 작업을 수행하는 경우 curl 127.0.0.1
- 그러나 다른 트래픽이 많이 발생하는 경우 이러한 종류의 디버깅은 약간 실행 가능하지 않습니다. 운이 좋게도 현재 이 컴퓨터에 요청을 보내는 유일한 사람/물이 될 수 있습니다.)
이제 또 다른 점은 로깅이 /var/log/messages 및 /var/log/haproxy/에 중복된다는 것입니다. 동료 덕분에 다른 줄을 바꿔서 문제를 해결했습니다/etc/rsyslog.conf
:
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
로 변경:
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local2.none /var/log/messages