[ToyProject]KubernetesベースのWebログ収集パイプラインの構築


このドキュメントでは、ドッキングステーション/クバーネスオンラインブートキャンプで発生する課題の1つであるKubernetesベースのWebログ収集パイプラインの構築手順について説明します.
通常、Webログを収集するためのシード構造は次のとおりです.

「Webサーバ」コンテナと、Webサーバログを収集するためのコンテナは、「サイドカー」モードで構成されています.この帯域にElasticSearchとKibanaを追加し,Webログの収集,分析,可視化を同時に行うパイプラインを構築した.
Webログ収集パイプラインを構築するために、Elasticsearch、kibana pad、nginx、filebeat画像からなるWeb/サイドカーコンテナを作成しました.
パイプラインを構築するために使用されるクーバーネスオブジェクトのリスト.

1.Elasticsearch Podの配備


まず、外部と通信するノードポートの設定を含むサービスと導入を通じてElasticSearchシードを導入しました.シード配置のためのelastic-search.yamlファイルは、次のとおりです.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: elasticsearch
  labels:
    app: elasticsearch
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch
  template:
    metadata:
      labels:
        app: elasticsearch
    spec:
      containers:
      - name: elasticsearch
        image: elastic/elasticsearch:7.16.2
        imagePullPolicy: Never
        env:
        - name: discovery.type
          value: "single-node"
        ports:
        - containerPort: 9200
        - containerPort: 9300
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: elasticsearch
  name: elasticsearch-svc
spec:
  ports:
  - name: rest
    port: 9200
    protocol: TCP
    targetPort: 9200
  - name: nodecom
    port: 9300
    protocol: TCP
    targetPort: 9300
  selector:
    app: elasticsearch
  type: NodePort
「フレックスサーチ」バージョンが変更されてもシードが正常に動作するように、特定のバージョンの「フレックスサーチ」画像をローカルサーバにダウンロードし、imagePullPolicyをNeverに設定して、「フレックスサーチ」バージョンがシードを再実行するときにバージョンの影響を受けないようにします.さらに、他のサービスオブジェクトも作成し、ノードポートを外部からアクセスできるように設定します.

2.Kibana Podの配備


kibanaシードを構成する際に使用するkibana.yamlファイルは以下の通りです.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kibana
  labels:
    app: kibana
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kibana
  template:
    metadata:
      labels:
        app: kibana
    spec:
      containers:
      - name: kibana
        image: elastic/kibana:7.16.2
        imagePullPolicy: Never
        env:
        - name: SERVER_NAME
          value: "kibana.kubenetes.example.com"
        - name: ELASTICSEARCH_HOSTS
          value: "http://elasticsearch-svc:9200"
        ports:
        - containerPort: 5601
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: kibana
  name: kibana-svc
spec:
  ports:
  - port: 5601
    protocol: TCP
    targetPort: 5601
  selector:
    app: kibana
  type: NodePort
kibanaはまた、imagePullPolicyをNeverに設定してelasticsearchと通信し、環境変数にelasticsearchのサービス名とポート番号を追加します.kubectl get svcコマンド検証により、ElasticSearchシードのノードポートは31261、31096、kibanaシードのノードポートは30086に設定されます.
仮想マシンに割り当てられたIPアドレスと対応するポートにより,Web上でもElasticSearchとKibanaに正常に接続できることが分かった.
  • フレックスサーチ接続検証
  • Kibana接続確認

  • 3.Web/サイドカード容器の配置


    次はnginxベースのWeb/サイドカーコンテナの導入手順です.エンドカーコンテナを配置するためのnginx-sidecar.yamlファイルは以下の通りです.
    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx-sidecar
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: varlognginx
          mountPath: /var/log/nginx
      - name: sidecar-access
        image: docker.elastic.co/beats/filebeat:7.16.2
        imagePullPolicy: Never
        volumeMounts:
        - name: varlognginx
          mountPath: /var/log/nginx
      volumes:
      - name: varlognginx
        emptyDir: {}
    Webサーバnginxを実行するコンテナと,サーバからWebログを収集するためのfilebeat画像からなる内部カードモードのコンテナを構築した.filebeat画像もelasticsearch,kibanaと一致し,WebサーバからログをインポートするためにWebサーバログを格納するディレクトリパスが同様にマウントされている.
    nginxコンテナに接続してcurlコマンドを実行すると、通信がスムーズで、ログが正常に記録されます.

    filebeatコンテナで収集したWebログを、フレックス検索で送信するように設定します.filebeatコンテナを実行中のノードに接続し、root権限でコンテナに接続し、filebeat.ymlの内部値を変更します.
    filebeat.config:
      modules:
        path: ${path.config}/modules.d/*.yml
        reload.enabled: false
    
    processors:
      - add_cloud_metadata: ~
      - add_docker_metadata: ~
    
    output.elasticsearch:
      hosts: ["172.30.5.86:31261"]
      #username: '${ELASTICSEARCH_USERNAME:}'
      #password: '${ELASTICSEARCH_PASSWORD:}'
    output.elasticsearch.hostsに既存のElasticSearchシードのIPアドレスとポート番号を入力し、curlコマンドを使用してElasticSearchシードとの通信が正しいかどうかを確認します.次のメッセージが出力されている場合は、通信が正常であることを示します.

    次のモジュールdフォルダ内のnginx.yml.disabledファイルの名前をnginx.ymlに変更し、以前にマウントされていたWebログディレクトリパスを入力します.
    - module: nginx
      access:
        enabled: true
        var.paths: ["/var/log/nginx/access.log*"]
      error:
        enabled: true
        var.paths: ["/var/log/nginx/error.log*"]
    すべての操作が完了し、コンテナが再起動されると変更が有効になります.

    4.運転結果


    次に、nginxコンテナで生成されたWebログが、フレキシブル検索で正常に転送されるかどうかを確認します.
    nginx Webサーバシードに接続してcurlコマンドを繰り返し実行すると、elasticsearchにログが送信され、kibanaで可視化されます.


    5. Reference

  • https://teamsmiley.github.io/2020/05/14/kubernetes-log-fluentd-elk/