他サーバに立てた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: []
- Logstashが立ってるサーバのIPアドレス確認
c0a21155@elastic-system:~$ hostname -I
192.168.100.59 10.42.0.0 10.42.0.1
- Logstashのserviceの外部ポート確認
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 ネームスペース
注意!!!!!!!!!!!!!!!!!!!!!→Elasticsearchのsecretのyamlファイル設定の内、namespaceの箇所を他サーバでFilebeatを立てたnamespaceに修正する。 secretのyaml内(elasticsearch-master-credentials.yaml):
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
上手くいってるとこうなる(TLSはWARNのままでもおっけ。):
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
9. 「elastic」で他サーバに立てたFilebeatのログが見れるか確認する。 ブラウザで「http://ログ収集サーバのIPアドレス:自サーバのKibanaのserviceの外部ポート番号 」と検索すると見れる。(自分の場合は、「http://192.168.100.59:30100」) 自サーバのIPアドレス:
c0a21155@elastic-system:~$ hostname -I
192.168.100.59 10.42.0.0 10.42.0.1
自サーバのKibanaのserviceの外部ポート番号:
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
実際に、「elastic」で他サーバに立てたFilebeatのログが見れるか確認してみた。 ログをLogstashに送っている(ログの送り元の)、他サーバ上に立ってるFilebeatのPod名確認:
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
「elastic」を確認。: pod名.PNG (319.4 kB)

最後に一言

やったお