他サーバに立てたFilebeatと自サーバのLogstashの接続する方法¶
この作業をしてる時の状況¶
ノードの自サーバに一式「Filebeat,Logstash,Elasticsearch,Kibana」は入れて上手くいってる。 けどその後、他サーバにFilebeatだけ立てて、他サーバのFilebeatと自サーバのLogstashの接続が上手くいかん。 そんな状況。
今回の作業内容¶
- 他サーバにFilebeatを立てる
- 既に自サーバに立ててあるLogstashのyamlファイルを修正する。
他サーバでFilebeatのPod立て¶
事前に準備すること¶
- ノード構成:master1台のみ
- kubernetesのインストール
- Helmのインストール
- elasticのインストール
- 自サーバに一式「Filebeat,Logstash,Elasticsearch,Kibana」がある状況
手順¶
他サーバにFilebeatのPodを立てる。(ここではFilebeatのPodが「0/1」でOK。この後の工程で解決する。)¶
1. 他サーバ上で、コマンド「vi FIlebeatのファイル名.yaml」(例:filebeat.yaml)でFilebeatのyamlファイルを作成し、以下の内容を記述する。 - Filebeatのyamlファイル内容:
extraEnvs: []
daemonset:
filebeatConfig:
filebeat.yml: |
logging.level: info # ここで指定したログレベルのログを集める設定をしてる。WarningとかErrorとかも設定できる。
filebeat.autodiscover:
providers:
- type: kubernetes
node: ${NODE_NAME}
hints.enabled: true
hints.default_config:
type: container
paths:
- /var/log/containers/*${data.kubernetes.container.id}.log
output.logstash: # Filebeatで読み取ったログをどこに転送するかを設定する場所
hosts: ["ログの転送先のIPアドレス:30000"] # ここが大事!!!!!!!!!!!![ログの転送先のIPアドレス:ログの転送先の外部ポート]!!!!!!!!!!
setup.template:
name: "k8s"
pattern: "k8s-*"
enabled: false
setup.ilm.enabled: false
secretMounts: []
deployment:
extraEnvs: []
c0a21155@elastic-system:~$ hostname -I
192.168.100.59 10.42.0.0 10.42.0.1
c0a21155@elastic-system:~$ kubectl get service -n elastic
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP 29d
elasticsearch-master ClusterIP 10.43.237.220 <none> 9200/TCP,9300/TCP 29d
kb-kibana NodePort 10.43.220.133 <none> 5601:30100/TCP 29d
ls-logstash-headless ClusterIP None <none> 9600/TCP 15d
ls-logstash NodePort 10.43.235.53 <none> 5044:30000/TCP 15d
2.コマンド「helm install fb elastic/filebeat -f Filebeatのファイル名 -n elastic-system」でFilebeatを立てる。 ここの時点ではFilebeatのpodは上手く立たない状態である。5番目の工程でこの問題を解消する。
自サーバに立てたLogstashの設定を修正¶
3. 自サーバのLogstashの設定を以下のように修正する。
- Logstashのyamlファイル内容:
注意!!!!!!!!!!!!!!!!!!!→serviceのtypeを「NodePort」にする。もし「ClusterIP」にしている場合、他サーバとの接続ができない。
logstashJavaOpts: "-Xmx1g -Xms1g" resources: requests: cpu: "100m" memory: "1536Mi" limits: cpu: "1000m" memory: "1536Mi" persistence: enabled: false extraPorts: - name: beats containerPort: 5044 # これはコンテナ内のポート service: type: NodePort # ここが大事!!!!!!!!!!!!!!!!!!!!! ports: - name: beats port: 5044 # クラスタ内のポート protocol: TCP targetPort: 5044 # ターゲットコンテナのポート nodePort: 30000 # 外部からアクセスするための NodePort logstashConfig: logstash.yml: | http.host: 0.0.0.0 xpack.monitoring.enabled: false pipeline.ecs_compatibility: disabled logstashPipeline: logstash.conf: | input { beats { port => 5044 } # Logstash の入力ポート } output { elasticsearch { hosts => ["http://elasticsearch-master:9200"] # Elasticsearch への送信 index => "logstash" # デフォルトのインデックス ssl => false } }
4. 再度コマンド「helm install ls elastic/logstash -f logstashのファイル名 -n elastic」でLogstashのPodを立て直し、修正した設定を反映させる。
他サーバに立てたFilebeatのPodが「0/1」問題を解決¶
5. 自サーバ(Elasticsearchが入っているサーバ)上で以下のコマンドを打つ。このコマンドによって、Elasticsearchのsecretをyamlファイル化する。 このままだと、FilebeatのPodが上手くなってない状態である。kubectl describeやkubectl logsコマンドで確認してみると、「Elasticsearchのsecretよこせや~」と怒られちゃってる。この問題をこっからの工程で解消する。
kubectl get secret elasticsearch-master-credentials -n elastic -o yaml > elasticsearch-master-credentials.yaml
6. 5で作った、(scpまたは直でコピペしたりして)Elasticsearchのsecretをyamlファイル化したものを他サーバ(Filebeatが立ってるサーバ)上に持っていった後、以下のコマンドで他サーバ上に自サーバのElasticsearchのsecretを立てる。
kubectl apply -f elasticsearch-master-credentials.yaml -n ネームスペース
apiVersion: v1
data:
password: cDFOWElyOEJBRm15a3hmbQ==
username: ZWxhc3RpYw==
kind: Secret
metadata:
annotations:
meta.helm.sh/release-name: es
meta.helm.sh/release-namespace: elastic-system # その1。ここのnamespace!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
creationTimestamp: "2024-04-08T08:06:57Z"
labels:
app: elasticsearch-master
app.kubernetes.io/managed-by: Helm
chart: elasticsearch
heritage: Helm
release: es
name: elasticsearch-master-credentials
namespace: elastic-system # その2。ここのnamespace!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
resourceVersion: "4623"
uid: 0afb84ed-f039-41b0-9186-354c5c2c0726
type: Opaque
7. 他サーバ上で「kubectl get pod ~」をして、FilebeatのPodが「1/1 Ready」になったか確認する。(上手くいっているはず。)
他サーバのFilebeatと自サーバのLogstashの接続確認¶
8. 他サーバ(Filebeatが立ってるサーバ)上で以下のコマンドを打ち、FilebeatとLogstashの接続が上手くいってるか確認する。 コマンド:
kubectl exec -it FilebeatのPod名 -n ネームスペース -- filebeat test output
cdsl@unikube:~$ kubectl get pods -n elastic-system
NAME READY STATUS RESTARTS AGE
fb-filebeat-58sws 1/1 Running 0 20h
fb-filebeat-7gn4s 1/1 Running 0 20h
fb-filebeat-f94n7 1/1 Running 0 20h
fb-filebeat-j4n8h 1/1 Running 0 20h
cdsl@unikube:~$ kubectl exec -it fb-filebeat-58sws -n elastic-system -- filebeat test output
logstash: 192.168.100.59:30000...
connection...
parse host... OK
dns lookup... OK
addresses: 192.168.100.59
dial up... OK
TLS... WARN secure connection disabled
talk to server... OK
cdsl@unikube:~$ kubectl exec -it fb-filebeat-7gn4s -n elastic-system -- filebeat test output
logstash: 192.168.100.59:30000...
connection...
parse host... OK
dns lookup... OK
addresses: 192.168.100.59
dial up... OK
TLS... WARN secure connection disabled
talk to server... OK
cdsl@unikube:~$ kubectl exec -it fb-filebeat-f94n7 -n elastic-system -- filebeat test output
logstash: 192.168.100.59:30000...
connection...
parse host... OK
dns lookup... OK
addresses: 192.168.100.59
dial up... OK
TLS... WARN secure connection disabled
talk to server... OK
cdsl@unikube:~$ kubectl exec -it fb-filebeat-j4n8h -n elastic-system -- filebeat test output
logstash: 192.168.100.59:30000...
connection...
parse host... OK
dns lookup... OK
addresses: 192.168.100.59
dial up... OK
TLS... WARN secure connection disabled
talk to server... OK
c0a21155@elastic-system:~$ hostname -I
192.168.100.59 10.42.0.0 10.42.0.1
c0a21155@elastic-system:~$ kubectl get service -n elastic
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
elasticsearch-master-headless ClusterIP None <none> 9200/TCP,9300/TCP 30d
elasticsearch-master ClusterIP 10.43.237.220 <none> 9200/TCP,9300/TCP 30d
kb-kibana NodePort 10.43.220.133 <none> 5601:30100/TCP 30d
ls-logstash-headless ClusterIP None <none> 9600/TCP 15d
ls-logstash NodePort 10.43.235.53 <none> 5044:30000/TCP 15d
c0a21155@unikube-old:~$ kubectl get pods -n elastic-system
NAME READY STATUS RESTARTS AGE
fb-filebeat-58sws 1/1 Running 0 24h
fb-filebeat-7gn4s 1/1 Running 0 24h
fb-filebeat-f94n7 1/1 Running 0 24h
fb-filebeat-j4n8h 1/1 Running 0 24h
最後に一言¶
やったお