IBM Log Analysis with LogDNA でKubernetes (IKS)のNFSマウント先ログファイル監視検証


##### はじめに


IBM Kubernetes Services (IKS) のログ監視にはサービスで提供されている IBM Log Analysis with LogDNA を使用することが可能です。

参考：[IBM Log Analysis with LogDNA による Kubernetes クラスター・ログの管理](https://cloud.ibm.com/docs/Log-Analysis-with-LogDNA?topic=Log-Analysis-with-LogDNA-kube)

IBM Log Analysis with LogDNA で標準提供されている定義では、Pod の標準出力は拾えるようですが、独自のアプリログは対象にはありません。

この記事では、Pod のNFS(Network File System)マウント先をLogDNAの監視対象にできるかどうかを確認しました。

(使用しているIKS環境ではPod のアプリログをNFSマウント先に出力しているため、アプリログをLogDNAで監視できるかどうかの前段階のテスト検証です。)


---

#####環境

使用する IBM Cloud サービス：
・IBM Cloud Kubernetes Service (1 master / 1 worker, Tokyo Region)
・IBM Log Analysis with LogDNA (Tokyo, Light Plan)
・IBM Cloud File Storage   (NFS マウント先のストレージ)


---
#####実装方法

＊ IKS はすでに存在する前提です。
＊ File Storage は 対象の IKS を Authorized Host に設定済みです。


**LogDNA の設定**

①IBM Log Analysis with LogDNA サービス・インスタンス作成

マニュアルの通りに実行
(ライトプランのインスタンスを作成)
参考：[ステップ 1. IBM Log Analysis with LogDNA サービス・インスタンスをプロビジョンする](https://cloud.ibm.com/docs/Log-Analysis-with-LogDNA?topic=Log-Analysis-with-LogDNA-kube#kube_step1)



②取り込み鍵の設定

マニュアルの通りに実行
参考：[ステップ 2. 取り込み鍵を取得する](https://cloud.ibm.com/docs/Log-Analysis-with-LogDNA?topic=Log-Analysis-with-LogDNA-kube#kube_step2)



③ログ送信設定

マニュアルの③ logDNA 取り込み鍵を保管するための Kubernetes シークレット作成まで実施します。

参考：[ステップ 3: LogDNA インスタンスにログを送信するように Kubernetes クラスターを構成する](https://cloud.ibm.com/docs/Log-Analysis-with-LogDNA?topic=Log-Analysis-with-LogDNA-kube#kube_step3)

〜ここからカスタマイズです〜

マニュアルのページが変わりますが、次に記載がある東京(jp-tok) のパブリック・エンドポイントの構成ファイルをダウンロードします。

参考：[ステップ 4. LogDNA エージェントをクラスターにデプロイする](https://cloud.ibm.com/docs/Log-Analysis-with-LogDNA?topic=Log-Analysis-with-LogDNA-config_agent_kube_cluster#config_agent_kube_cluster_step4)

jo-tok の構成ファイルを取得 -> https://assets.jp-tok.logging.cloud.ibm.com/clients/logdna-agent-ds.yaml


[変更内容]
・/logs ディレクトリをLOGDNA_LOGDIR として定義
・/var/log/、/var/data/ 下のその他ログは排除
・volumeMounts に /logs を追加。 /logs は PersistentVolumeClaim に接続。

```logdna-agent-ds.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: logdna-agent
  labels:
    app: logdna-agent
spec:
  selector:
    matchLabels:
      app: logdna-agent
  template:
    metadata:
      labels:
        app: logdna-agent
    spec:
      containers:
      - name: logdna-agent
        image: logdna/logdna-agent:latest
        imagePullPolicy: Always
        env:
        - name: LOGDNA_AGENT_KEY
          valueFrom:
            secretKeyRef:
              name: logdna-agent-key
              key: logdna-agent-key
        - name: LDAPIHOST
          value: api.jp-tok.logging.cloud.ibm.com
        - name: LDLOGHOST
          value: logs.jp-tok.logging.cloud.ibm.com
        - name: LOGDNA_PLATFORM
          value: k8s
        - name: LOGDNA_EXCLUDE   #<= 追加
          value: /var/log/containers/*_kube-system_*,/var/log/containers/*ibm-observe_*,/var/log/containerd.log,/var/log/kubelet.log,/var/log/syslog,/var/log/ntpstats/*,/var/log/alb/*,/var/data/*       #<= 追加
        # - name: LOGDNA_TAGS
        #   value: production,cluster1,othertags
        resources:
          requests:
            cpu: 20m
          limits:
            memory: 500Mi
        volumeMounts:
        - name: varlog
          mountPath: /var/log
        - name: vardata
          mountPath: /var/data
        - name: varlibdockercontainers
          mountPath: /var/lib/docker/containers
          readOnly: true
        - name: mnt
          mountPath: /mnt
          readOnly: true
        - name: docker
          mountPath: /var/run/docker.sock
        - name: osrelease
          mountPath: /etc/os-release
        - name: logdnahostname
          mountPath: /etc/logdna-hostname
        - name: testpvc                     #<= 追加
          mountPath: /logs                  #<= 追加
      volumes:
      - name: varlog
        hostPath:
          path: /var/log
      - name: vardata
        hostPath:
          path: /var/data
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: mnt
        hostPath:
          path: /mnt
      - name: docker
        hostPath:
          path: /var/run/docker.sock
      - name: osrelease
        hostPath:
          path: /etc/os-release
      - name: logdnahostname
        hostPath:
          path: /etc/hostname
      - name: testpvc　　　　　　　　　　　　　　  #<= 追加
        persistentVolumeClaim:             　 #<= 追加
          claimName: testpvc　　　　　　　　　　 #<= 追加
  updateStrategy: 
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 100%
```

->「#<= 追加」部分の行を追加しています。
-> LogDNAのログファイル除外は次を参照ください。[ログファイルの除外](https://cloud.ibm.com/docs/Log-Analysis-with-LogDNA?topic=Log-Analysis-with-LogDNA-exclude_logs_from_agent)

PersistentVolume と、PersistentVolumeClaim 定義も合わせて設定します。(使用するファイル pv-pvc-est.yml)

参考の定義例です。

```pv-pvc-test.yml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: testpvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 10Gi
  storageClassName: testpvc
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: testpvc
spec:
  storageClassName: testpvc
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 10Gi
  nfs:
    path: /<FileStorageHostName>/data01/test/       #<= マウントするパス
    server: fsf-tokxxxxx.service.softlayer.com      #<= FileStorageホスト名
  mountOptions:
  - nfsvers=3

```

④ pv, pvc 定義の作成

これまでの経験上、PV,PVCが作られていないとPod作成に失敗することが何度かあったので、先にボリューム定義を作成します。NameSpace 「ibm-observe 」に定義します。

```
$ kubectl create -f pv-pvc-test.yml -n ibm-observe
persistentvolumeclaim/testpvc created
persistentvolume/testpvc created

```

⑤編集したLogDNA エージェントのデプロイ

```
$ kubectl create -f logdna-agent-ds_pv.yaml -n ibm-observe
daemonset.apps/logdna-agent created
```

確認

```
$ kubectl get po -n ibm-observe
NAME                 READY   STATUS    RESTARTS   AGE
logdna-agent-xxxxx   1/1     Running   0          93s
```

logdna-agent が対象のIKS上に作成されました。
これでロギング構成完了です。


---

#####テスト

① logdna agent へのログイン

```
$ kubectl exec -it logdna-agent-xxxxx /bin/sh -n ibm-observe
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
# ls
bin  boot  dev	etc  home  lib	lib64  logs  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
```

上記の書き方でのexec コマンドでのログインはDeprecateなのですね...。でもログインしたまま使いたいのでこのまま実施します。

* 追記
ちなみに、こう書けばw WARNINGは出ませんでした。。exec コマンドのオプションが変更されて「--」が必要になったのですね。

```
$ kubectl exec -it logdna-agent-xxxxx -- /bin/sh -n ibm-observe
```



test.log と app.log というテストファイルを作成し、適当に記載してログがLogDNA上に表示されるか確認します。

```
# cd logs
# ls -l
total 0
# touch test.log
# touch app.log
# ls -l
total 0
-rw-r--r-- 1 root root 0 Jan  7 05:21 app.log
-rw-r--r-- 1 root root 0 Jan  7 05:21 test.log

# echo testtest >> test.log
# date
Thu Jan  7 05:23:20 UTC 2021
# echo testtest >> test.log
# echo app >> app.log
# date
Thu Jan  7 05:24:26 UTC 2021
#

```

LogDNA のWebUI で確認
![スクリーンショット 2021-01-07 14.26.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/74c40aa7-76db-34a8-dac3-e8127cfa9d1f.png)

=> LogDNAの表示を押します
![0107test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/9e7467b6-4141-70af-cb9c-c4a9074294bf.png)



Pod内のNFSマウント先に作成したファイルのログが出力されていることが確認できました!



---

#####(参考)LogDNAのView定義

参考：[ステップ 7. ビューを作成する](https://cloud.ibm.com/docs/Log-Analysis-with-LogDNA?topic=Log-Analysis-with-LogDNA-view_logs#view_logs_step7)

上のテストでの表示はLogDNAのView定義でtest.log、app.logのみを表示する定義を設定していました。

定義例です。
LogDNA WebUI の Everything で"Apps" を選択。

![スクリーンショット 2021-01-07 14.45.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/9cdd64a1-ecaf-50ea-abfa-867901c01c9b.png)

表示されるログファイルの対象"app.log、test.log" にチェックを入れます。

![view1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/920a4b5b-e393-a28b-afe3-31f3dfc2b814.png)


Applyを押します。

この状態だとUnsaved View のため、新しいView として定義します。

![view2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/c35e7e90-e459-c576-97a1-8615c07a5818.png)

Name に 任意の名前「testlog」　を記入し、SaveViewを押します。

![view3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/8eb76471-7069-47c4-6000-ccc1ee2d0e3a.png)

testlog view ができました。

![view4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/517421/c8b28599-3169-1b3c-96f4-e9a256538ce4.png)


----
#####終わりに

NFSマウント先のテスト・ファイルをLogDNAの取り込み対象とすることができました。
環境で使用しているNFSマウント先のアプリログを転送してLogDNAの監視対象にする期待が持てそうです。

(注意) マニュアルにないことを実装しますので、サポート等の保証は不明です。この記事を参考にして実装される場合は、Own Risk でお願いします。


参考：
[IBM Cloud資料 IBM Log Analysis with LogDNA](https://cloud.ibm.com/docs/Log-Analysis-with-LogDNA)
[IBM Cloud資料 FileStorage](https://cloud.ibm.com/docs/FileStorage/index.html#getting-started-with-file-storage)