EFK Stackによる収集ログの実装


2021. 08. 06.


PROJECT


仮想クライアントシステムの構築と実行

  • SI
  • AWSクラウド環境構成
  • クーバーネスに基づくEKS環境構成、Webサービス構築

  • SM
  • EFKスタックを構築してログを収集
  • CloudWatchアラームをSlackに送信してリアルタイム監視
  • Work

  • コンテナ環境のログを収集するためにEFKスタックを構築
    -EKS環境におけるElastiSearch、Fluentd、Kibana
  • の実装

    EFKとは?


    EFK
    ElasticSearch+Fluentd+Kibana. コンテナ環境でログを収集します.
  • ElasticSearch:大規模ログストレージ
  • Fluentd:コンテナのストリームログを収集するログコレクタ.すべてのノードは同じ配置(Daemonset*)
  • でなければなりません.
  • Kibana:ElasticSearchのログが可視化されます.これは、トラブルシューティングと予防に役立ちます
  • クバーネディスはパードが正常でない場合に再生成した.では、デッドパードのコンテナに残されたログはどうなるのでしょうか.EFKはコンテナのログをログストレージに収集する.そのため、デッドコンテナのログも残ります.

    * Daemonset
    クベルネディスの基本オブジェクトを作成および管理するコントローラ(デプロイメント、ReplicaSetなど)の1つです.DaemonsetはPod管理コントローラで、Podが各ノードに1つだけ配置できるようにします.たとえば、各ノードにログ収集用のDaemonset podを配置できます.
  • 関連サイト
    クバーネディスコントローラ:DeemonSet
  • ElasticSearchの配備


    ElasticSearch
    テキスト、数値、位置ベースの情報、構造化および非構造化データなどのすべてのタイプのデータに対して、分散型オープンソース検索および分析エンジンを提供します.要するに、大量のデータを格納し、リアルタイムで分析するエンジンです.
    クベネディスを使用すると、ElasticSearchを個別にインストールするプロセスを省略できます.ElasticSearch YAMLファイルの作成と配布が終了しました.NodePortタイプのサービスとしてElasticSearchを導入し、Nginxのロードバランサに接続して通信確認を行います.
    ElasticSearchの配備
    1.LoadBanarserのセキュリティグループ9200ポートオープン→インターネット(外部)でLBの9200ポートにアクセス
    2.LoadBankのLister編集→9200ポートのトラフィックをInstanceの30920ポートに転送する
    3.9200ポートを介してWorkerノードに伝達されるトラフィックは、サービスによって伝達され、サービスは、YAMLファイルを伝送するサービスセクションで定義されているように、9200ポートを介してクラスタ内に露出する.
    4.920ポートへの送信要求は、サービス選択ポートの9200ポートに送信されます.
    実習
    1.まず、先週の実習と同様にEKSを構成し、Nginxを実行します.
    2. elasticSearch.yamlファイルを作成します.
    # cat<<EOF > ~/elasticSearch.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:6.4.0
            env:
            - name: discovery.type
              value: "single-node"
            ports:
            - containerPort: 9200
            - containerPort: 9300
            
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: elasticsearch
      name: elasticsearch-svc
      namespace: default
    spec:
      ports:
      - name: elasticsearch-rest
        nodePort: 30920
        port: 9200
        protocol: TCP
        targetPort: 9200
      - name: elasticsearch-nodecom
        nodePort: 30930
        port: 9300
        protocol: TCP
        targetPort: 9300
      selector:
        app: elasticsearch
      type: NodePort
    EOF
    3.配布後に配布されるpodとサービスを確認します.
    # kubectl apply –f elasticSearch.yaml	//배포
    # kubectl get pod | grep elastic	//배포된 pod 확인
    # kubectl get svc | grep elastic	//배포된 서비스 확인

    4.Loadbalancerリースプログラムに追加します.[EC 2>ロードバランサ>リスナー>リスナーの編集]
    リスナーは、定義されたプロトコルとポートを使用して接続要求を確認するプロセスです.リスナーで定義されたルールに基づいて、登録されたロードバランサにリクエストをルーティングする方法を決定します.
    追加: 

    5.ロード・バランサの9200ポートを使用して、外部アクセスを可能にするセキュリティ・グループのインバウンド・ルールを追加します.」
    [EC 2>ロードバランサ>セキュリティ>セキュリティグループIDをクリック>インバウンド・ルールの編集]

    青で表示されたIDで編集:Kubernetes ELBセキュリティグループを選択して編集する必要があります.接続できません.

    6.9200をNginxロードバランサDNSに貼り付けると、以下の画面が表示されます. 

     **Kibana配備**


    Kibana
    Elastic Stackに基づいて構築されたオープンソースフロントエンドアプリケーションは、ElasticSearchからインデックスデータを取得および可視化する機能を提供します.オープンソースベースの分析と可視化プラットフォーム.
    Kibana配備
    1.LoadBarancerのSecurity Group 5601ポートオープン→インターネット(外部)でLBの5601ポートにアクセス
    2.LoadBankのLister編集→5601ポートのトラフィックをInstanceの30561ポートに転送する
    3.5601ポートを介してWorkerノードに伝達されるトラフィックはサービスであり、YAMLファイルを伝送するサービスセクションで定義されているように、5601ポートを介してサービスがクラスタ内に露出する.
    4.5601ポートの要求は、サービス選択ポート5601ポート(TargetPort–選択ポートのポート)に送信される.
    実習
    1. kibana.yamlファイルを作成します.
    # cat<<EOF > ~/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:6.4.0
            env:
            - name: SERVER_NAME
              value: "kibana.kubenetes.example.com"
            - name: ELASTICSEARCH_URL
              value: "http://elasticsearch-svc.default.svc.cluster.local:9200"
            ports:
            - containerPort: 5601
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: kibana
      name: kibana-svc
      namespace: default
    spec:
      ports:
      - nodePort: 30561
        port: 5601
        protocol: TCP
        targetPort: 5601
      selector:
        app: kibana
      type: NodePort
    EOF
    2.導入後に導入されたサービスを確認します.
    # kubectl apply –f kibana.yaml	//배포
    # kubectl get service		//배포된 서비스 확인

    3.ロード・バランシング・サービス・プログラムに追加します.

    4.セキュリティ・グループにインバウンド・ルールを追加します.

    5.ロードバランサDNSに:5601を貼り付け、Kibana webアクセスを確認する.

     Fluentd配備


    Fluentd
    ログコレクタ.各種データソース(HTTP、TCP等)から所望の形式に加工し、複数の宛先(ElasticSearch、S 3等)に転送することができる.
    Fluentd配備
    1. fluentd.yamlを作成します.Daemonsetとして配布されるのでkind:Daemonsetと書きました.
    # cat<<EOF > ~/fluentd.yaml
    ---
    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: fluentd
      namespace: kube-system
    
    ---
    apiVersion: rbac.authorization.k8s.io/v1beta1
    kind: ClusterRole
    metadata:
      name: fluentd
      namespace: kube-system
    rules:
    - apiGroups:
      - ""
      resources:
      - pods
      - namespaces
      verbs:
      - get
      - list
      - watch
    
    ---
    kind: ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1beta1
    metadata:
      name: fluentd
    roleRef:
      kind: ClusterRole
      name: fluentd
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: ServiceAccount
      name: fluentd
      namespace: kube-system
    
    ---
    apiVersion: apps/v1
    kind: DaemonSet
    metadata:
      name: fluentd
      namespace: kube-system
      labels:
        k8s-app: fluentd-logging
        version: v1
        kubernetes.io/cluster-service: "true"
    spec:
      selector:
        matchLabels:
          k8s-app: fluentd-logging
          version: v1
      template:
        metadata:
          labels:
            k8s-app: fluentd-logging
            version: v1
            kubernetes.io/cluster-service: "true"
        spec:
          serviceAccount: fluentd
          serviceAccountName: fluentd
          tolerations:
          - key: node-role.kubernetes.io/master
            effect: NoSchedule
          containers:
          - name: fluentd
            image: fluent/fluentd-kubernetes-daemonset:v1.4.2-debian-elasticsearch-1.1
            env:
              - name:  FLUENT_ELASTICSEARCH_HOST
                value: "elasticsearch-svc.default.svc.cluster.local"
              - name:  FLUENT_ELASTICSEARCH_PORT
                value: "9200"
              - name: FLUENT_ELASTICSEARCH_SCHEME
                value: "http"
            resources:
              limits:
                memory: 200Mi
              requests:
                cpu: 100m
                memory: 200Mi
            volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
          terminationGracePeriodSeconds: 30
          volumes:
          - name: varlog
            hostPath:
              path: /var/log
          - name: varlibdockercontainers
            hostPath:
              path: /var/lib/docker/containers
    EOF
    2.導入後に導入されたサービスを確認します.
    # kubectl apply –f fluentd.yaml			//배포
    # kubectl get pod -n kube-system | grep fluentd	//배포된 서비스 확인

     ログの表示


    Kibanaインデックスアレイの作成
    1. [ Management > Index Patterns ]

    2.Indexモード名をlogstash-*に設定します.

    3.Configure settingsを@timestampに設定し、インデックスパターンを生成します.

    4.次の内容が生成されたことを確認できます.

    ログの表示
    1.入力[Discover>Add a filter>kubernetes.labels.run is my-nginx]


    2.ログを表示できます.

     リソースの削除


    実験はもう終わりました.リソースを削除して、料金を徴収しません.
    1.kubernetesリソースの削除
    # kubectl delete -f elasticSearch.yaml
    # kubectl delete -f kibana.yaml
    # kubectl delete -f fluentd.yaml
    # kubectl delete -f nginx-service.yaml
    # kubectl delete -f nginx-deployment.yaml

    2.EKSクラスタとノードグループの削除

    AWSコンソールからEKSクラスタとノードグループを削除することを確認します(先週と同じ).