IBM Cloud Private(ICP)에서 컨테이너 로그를 syslog로 전송 - logstash 교체편
목적
Kubernetes(k8s)는 대량의 컨테이너가 여러 노드에서 실행되므로 문제 판별, 감사 또는 분석을 위해 분산된 로그를 잘 집계하는 메커니즘이 필요합니다.
IBM Cloud Private(ICP)는 이를 위해 표준으로 ELK 스택과 Filebeat이 설치되어 실행되고 있습니다. 컨테이너의 앱이 표준 출력 및 표준 오류 출력에 로그 데이터를 출력하면 호스트 OS의/var/log/containers/또는/var/log/pods/이하에 저장됩니다. DaemonSet으로 상주하는 Filebeat가 모니터링하고 Logstash로 전송하고 집계합니다. Logstash는 Elasticsearch로 전송하고 ICP 대시보드에서 Kibana를 사용하여 로그를 검색하고 시각화할 수 있습니다.
문제 판별이나 분석의 용도는 이것으로 좋지만, 특히 상용 시스템에서는, 로그를 파일로서 일정 기간 보관하고 싶은, 로그에 특정의 캐릭터 라인이 출현하면 경고 통지를 하고 싶다고 하는 요구가 있습니다. 최근에는 이를 위한 편리한 클라우드 서비스가 많지만 ICP가 상정하는 온프레미스 환경에서는 외부 서비스를 이용하기 어려운 경우가 많기 때문에 로그를 원시 파일로 저장하고 백업 및 로그 모니터링 미들웨어와 함께 사용하고 싶은 요구가 있습니다.
그래서 이번에는 ICP에서 컨테이너 로그를 syslog 서버로 전송하여 파일로 저장하는 방법을 확인해 보겠습니다.
그건 그렇고, ICP의 공개 버전? IBM Cloud Container Service 에서는 CLI를 사용하여 쉽게 syslog 전송 설정을 할 수 있습니다. 참고까지.
Kubernetes Log Forwarding with Syslog
검증 환경
- IBM Cloud Private 2.1.0.2 (Kubernetes 1.9.1)
- CentOS 7 (rsyslogd)
방법
앞서 언급했듯이 ICP는 컨테이너 로그 → Filebeat → Logstash → Elasticseatch 경로를 이미 만들었습니다. Logstash에 syslog 전송에 플러그인을 추가하고 Logstash에서 집계된 로그를 외부 Syslog 서버로 전송하는 경로를 새로 만듭니다.
절차
Syslog 서버 설정
가장 가까운 Linux 서버 등의 syslogd로 외부로부터 로그를 받아들이도록 합니다. CentOS 7의 경우 rsyslog를 사용하고 있으므로 다음과 같이 통신 포트를 엽니 다.
$ sudo vi /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$ systemctl restart rsyslog
firewalld를 사용하는 경우 잊지 않고 포트를 엽니다.
$ firewall-cmd --add-port=514/tcp --permanent
$ firewall-cmd --add-port=514/udp --permanent
$ firewall-cmd --reload
만약을 위해 소통 확인해 둡시다.
[k8sノード] $ logger -n admin -p user.info hogeeeeee
[syslogサーバ] $ tail -f /var/log/message
Apr 8 02:46:54 192.168.11.21 root: hogeeeeee
syslog 플러그인을 지원하는 Logstash 빌드
ICP와 함께 제공되는 Logstash는 불행히도 syslog 플러그인이 설치되어 있지 않습니다. 따라서 syslog 플러그인을 설치한 상태의 이미지를 만듭니다. 다음 RUN을 실행하면 플러그인을 다운로드하여 설치할 수 있습니다.
DockerfileFROM ibmcom/logstash:5.5.1
RUN /usr/share/logstash/bin/logstash-plugin install logstash-output-syslog
빌드하고 레지스트리에 push합니다. 이번에는 제반 사정으로 DockerHub를 사용했지만, 본래는 프라이빗 레지스트리를 사용하는 것이 좋을 것입니다.
$ docker build -t logstash:5.5.1-syslog .
$ docker tag logstash:5.5.1-syslog teruz/logstash:5.5.1-syslog
$ docker login
$ docker push
Logstash 컨테이너의 이미지 교체
이미 실행 중인 Logstash 컨테이너의 이미지를 교체합니다.
$ kubectl get deployment logstash -n kube-system -o yaml >deployment.yaml
$ vi deployment.yaml
# image: ibmcom/logstash:5.5.1
image: teruz/logstash:5.5.1-syslog
$ kubectl apply -f deployment.yaml
Logstash의 ConfigMap 변경
이 단계에서 Logstash의 동작은 아무 것도 변경되지 않았습니다. ConfigMap에 syslog 플러그인 설정을 추가해야 합니다. 다음과 같이 기존 output에 syslog 설정을 추가합니다.
$ kubectl edit configmap logstash-pipeline -n kube-system
output {
elasticsearch {
index => "logstash-%{+YYYY.MM.dd}"
hosts => "elasticsearch:9200"
}
# ここから追加
syslog {
host => "Syslogサーバのアドレス"
port => 514
sourcehost => "%{kubernetes.namespace}/%{kubernetes.pod}"
message => "%{log}"
}
}
동작 확인
ConfigMap을 저장하고 잠시 기다리면 (1분 정도?) 설정이 자동으로 반영되어 syslog로 전송이 시작됩니다.
$ tail -f /var/log/messages
Apr 7 18:14:06 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: I0407 18:14:06.647399 1 wrap.go:42] GET /api/v1/namespaces/kube-system/endpoints/kube-scheduler: (2.707909ms) 200 [[hyperkube/v1.9.1+icp (linux/amd64) kubernetes/d97ba3f/leader-election] 127.0.0.1:58472]
Apr 7 18:14:07 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: 2018-04-07T18:14:07.365731538Z AUDIT: id="98bb4004-bc84-4c72-a9ee-e7f531ffa329" stage="ResponseComplete" ip="127.0.0.1" method="list" user="system:apiserver" groups="\"system:masters\"" as="<self>" asgroups="<lookup>" namespace="<none>" uri="/apis/admissionregistration.k8s.io/v1alpha1/initializerconfigurations" response="200"
Apr 7 18:13:59 192.168.11.23 kube-system/k8s-etcd-192.168.11.21 LOGSTASH[-]: 2018-04-07 18:13:59.430418 W | etcdserver/api/v3rpc: failed to receive watch request from gRPC stream ("rpc error: code = Unavailable desc = stream error: stream ID 11813; CANCEL")
Apr 7 18:14:05 192.168.11.23 kube-system/k8s-mariadb-192.168.11.21 LOGSTASH[-]: lock
Apr 7 18:14:07 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: I0407 18:14:07.390144 1 wrap.go:42] GET /apis/admissionregistration.k8s.io/v1alpha1/initializerconfigurations: (24.433583ms) 200 [[hyperkube/v1.9.1+icp (linux/amd64) kubernetes/d97ba3f] 127.0.0.1:58082]
주의점
이번에는 우선 출력할 수 있는 곳까지를 검증했습니다. 실제 운영에서는 로그 포맷 및 필터링 등의 설계가 필요합니다.
참고
Reference
이 문제에 관하여(IBM Cloud Private(ICP)에서 컨테이너 로그를 syslog로 전송 - logstash 교체편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/teruq/items/ff7a55eed3929d5e6a30
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
앞서 언급했듯이 ICP는 컨테이너 로그 → Filebeat → Logstash → Elasticseatch 경로를 이미 만들었습니다. Logstash에 syslog 전송에 플러그인을 추가하고 Logstash에서 집계된 로그를 외부 Syslog 서버로 전송하는 경로를 새로 만듭니다.
절차
Syslog 서버 설정
가장 가까운 Linux 서버 등의 syslogd로 외부로부터 로그를 받아들이도록 합니다. CentOS 7의 경우 rsyslog를 사용하고 있으므로 다음과 같이 통신 포트를 엽니 다.
$ sudo vi /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$ systemctl restart rsyslog
firewalld를 사용하는 경우 잊지 않고 포트를 엽니다.
$ firewall-cmd --add-port=514/tcp --permanent
$ firewall-cmd --add-port=514/udp --permanent
$ firewall-cmd --reload
만약을 위해 소통 확인해 둡시다.
[k8sノード] $ logger -n admin -p user.info hogeeeeee
[syslogサーバ] $ tail -f /var/log/message
Apr 8 02:46:54 192.168.11.21 root: hogeeeeee
syslog 플러그인을 지원하는 Logstash 빌드
ICP와 함께 제공되는 Logstash는 불행히도 syslog 플러그인이 설치되어 있지 않습니다. 따라서 syslog 플러그인을 설치한 상태의 이미지를 만듭니다. 다음 RUN을 실행하면 플러그인을 다운로드하여 설치할 수 있습니다.
DockerfileFROM ibmcom/logstash:5.5.1
RUN /usr/share/logstash/bin/logstash-plugin install logstash-output-syslog
빌드하고 레지스트리에 push합니다. 이번에는 제반 사정으로 DockerHub를 사용했지만, 본래는 프라이빗 레지스트리를 사용하는 것이 좋을 것입니다.
$ docker build -t logstash:5.5.1-syslog .
$ docker tag logstash:5.5.1-syslog teruz/logstash:5.5.1-syslog
$ docker login
$ docker push
Logstash 컨테이너의 이미지 교체
이미 실행 중인 Logstash 컨테이너의 이미지를 교체합니다.
$ kubectl get deployment logstash -n kube-system -o yaml >deployment.yaml
$ vi deployment.yaml
# image: ibmcom/logstash:5.5.1
image: teruz/logstash:5.5.1-syslog
$ kubectl apply -f deployment.yaml
Logstash의 ConfigMap 변경
이 단계에서 Logstash의 동작은 아무 것도 변경되지 않았습니다. ConfigMap에 syslog 플러그인 설정을 추가해야 합니다. 다음과 같이 기존 output에 syslog 설정을 추가합니다.
$ kubectl edit configmap logstash-pipeline -n kube-system
output {
elasticsearch {
index => "logstash-%{+YYYY.MM.dd}"
hosts => "elasticsearch:9200"
}
# ここから追加
syslog {
host => "Syslogサーバのアドレス"
port => 514
sourcehost => "%{kubernetes.namespace}/%{kubernetes.pod}"
message => "%{log}"
}
}
동작 확인
ConfigMap을 저장하고 잠시 기다리면 (1분 정도?) 설정이 자동으로 반영되어 syslog로 전송이 시작됩니다.
$ tail -f /var/log/messages
Apr 7 18:14:06 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: I0407 18:14:06.647399 1 wrap.go:42] GET /api/v1/namespaces/kube-system/endpoints/kube-scheduler: (2.707909ms) 200 [[hyperkube/v1.9.1+icp (linux/amd64) kubernetes/d97ba3f/leader-election] 127.0.0.1:58472]
Apr 7 18:14:07 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: 2018-04-07T18:14:07.365731538Z AUDIT: id="98bb4004-bc84-4c72-a9ee-e7f531ffa329" stage="ResponseComplete" ip="127.0.0.1" method="list" user="system:apiserver" groups="\"system:masters\"" as="<self>" asgroups="<lookup>" namespace="<none>" uri="/apis/admissionregistration.k8s.io/v1alpha1/initializerconfigurations" response="200"
Apr 7 18:13:59 192.168.11.23 kube-system/k8s-etcd-192.168.11.21 LOGSTASH[-]: 2018-04-07 18:13:59.430418 W | etcdserver/api/v3rpc: failed to receive watch request from gRPC stream ("rpc error: code = Unavailable desc = stream error: stream ID 11813; CANCEL")
Apr 7 18:14:05 192.168.11.23 kube-system/k8s-mariadb-192.168.11.21 LOGSTASH[-]: lock
Apr 7 18:14:07 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: I0407 18:14:07.390144 1 wrap.go:42] GET /apis/admissionregistration.k8s.io/v1alpha1/initializerconfigurations: (24.433583ms) 200 [[hyperkube/v1.9.1+icp (linux/amd64) kubernetes/d97ba3f] 127.0.0.1:58082]
주의점
이번에는 우선 출력할 수 있는 곳까지를 검증했습니다. 실제 운영에서는 로그 포맷 및 필터링 등의 설계가 필요합니다.
참고
Reference
이 문제에 관하여(IBM Cloud Private(ICP)에서 컨테이너 로그를 syslog로 전송 - logstash 교체편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/teruq/items/ff7a55eed3929d5e6a30
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
$ sudo vi /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
$ModLoad imtcp
$InputTCPServerRun 514
$ systemctl restart rsyslog
$ firewall-cmd --add-port=514/tcp --permanent
$ firewall-cmd --add-port=514/udp --permanent
$ firewall-cmd --reload
[k8sノード] $ logger -n admin -p user.info hogeeeeee
[syslogサーバ] $ tail -f /var/log/message
Apr 8 02:46:54 192.168.11.21 root: hogeeeeee
FROM ibmcom/logstash:5.5.1
RUN /usr/share/logstash/bin/logstash-plugin install logstash-output-syslog
$ docker build -t logstash:5.5.1-syslog .
$ docker tag logstash:5.5.1-syslog teruz/logstash:5.5.1-syslog
$ docker login
$ docker push
$ kubectl get deployment logstash -n kube-system -o yaml >deployment.yaml
$ vi deployment.yaml
# image: ibmcom/logstash:5.5.1
image: teruz/logstash:5.5.1-syslog
$ kubectl apply -f deployment.yaml
$ kubectl edit configmap logstash-pipeline -n kube-system
output {
elasticsearch {
index => "logstash-%{+YYYY.MM.dd}"
hosts => "elasticsearch:9200"
}
# ここから追加
syslog {
host => "Syslogサーバのアドレス"
port => 514
sourcehost => "%{kubernetes.namespace}/%{kubernetes.pod}"
message => "%{log}"
}
}
$ tail -f /var/log/messages
Apr 7 18:14:06 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: I0407 18:14:06.647399 1 wrap.go:42] GET /api/v1/namespaces/kube-system/endpoints/kube-scheduler: (2.707909ms) 200 [[hyperkube/v1.9.1+icp (linux/amd64) kubernetes/d97ba3f/leader-election] 127.0.0.1:58472]
Apr 7 18:14:07 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: 2018-04-07T18:14:07.365731538Z AUDIT: id="98bb4004-bc84-4c72-a9ee-e7f531ffa329" stage="ResponseComplete" ip="127.0.0.1" method="list" user="system:apiserver" groups="\"system:masters\"" as="<self>" asgroups="<lookup>" namespace="<none>" uri="/apis/admissionregistration.k8s.io/v1alpha1/initializerconfigurations" response="200"
Apr 7 18:13:59 192.168.11.23 kube-system/k8s-etcd-192.168.11.21 LOGSTASH[-]: 2018-04-07 18:13:59.430418 W | etcdserver/api/v3rpc: failed to receive watch request from gRPC stream ("rpc error: code = Unavailable desc = stream error: stream ID 11813; CANCEL")
Apr 7 18:14:05 192.168.11.23 kube-system/k8s-mariadb-192.168.11.21 LOGSTASH[-]: lock
Apr 7 18:14:07 192.168.11.23 kube-system/k8s-master-192.168.11.21 LOGSTASH[-]: I0407 18:14:07.390144 1 wrap.go:42] GET /apis/admissionregistration.k8s.io/v1alpha1/initializerconfigurations: (24.433583ms) 200 [[hyperkube/v1.9.1+icp (linux/amd64) kubernetes/d97ba3f] 127.0.0.1:58082]
이번에는 우선 출력할 수 있는 곳까지를 검증했습니다. 실제 운영에서는 로그 포맷 및 필터링 등의 설계가 필요합니다.
참고
Reference
이 문제에 관하여(IBM Cloud Private(ICP)에서 컨테이너 로그를 syslog로 전송 - logstash 교체편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/teruq/items/ff7a55eed3929d5e6a30
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(IBM Cloud Private(ICP)에서 컨테이너 로그를 syslog로 전송 - logstash 교체편), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/teruq/items/ff7a55eed3929d5e6a30텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)