[OpenShift Virtualization] ロギングってどうなるの？syslog取得＆OpenShift Loggingとの統合具合

# はじめに
今回はOpenShift Virtualizationのロギング周りについて挙動を確認していきます。
ざっくり2つの観点で見ていきます。
- syslog周りの運用
- OpenShift Loggingとの統合具合を確認

また、これらを試す過程で、OpenShift上のVMに`yum`でパッケージをインストールしてみたり、VMをインターネットに公開したりといった事も試します。

# syslog周りの運用
まずはsyslogの取得についてです。[前回の記事](https://qiita.com/masaki-oomura/items/dc71dc780eabe0910161)で2台のVMを同じOverlay Networkに接続して疎通させた内容を活かしてやってみます。1台のVM`log-exporter`の`var/log/message`をもう1台のVM`log-server`に転送できるのかを実験します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/e0a06e77-6da9-2b88-cbed-09143c3788fd.png)


先に結論を言ってしまうと、特に何の問題も無くできます。つまり、これまでの仮想マシンのロギング運用は、OpenShift Virtualizationにおいても変わりなく実行できると言えます。

やってみます。

## Fedora VMを2台起動
[前回の記事](https://qiita.com/masaki-oomura/items/dc71dc780eabe0910161)を参考にして、Fedora VMを2台建てます。ホスト名と2つめのvNICに振る静的IPアドレスについては以下のようにしておきました。
- fedora-log-exporter: 192.168.100.11/24
- fedora-log-server: 192.168.100.21/24

## `fedora-log-exporter`を設定
Fedoraはデフォルトだと`var/log/message`が存在しないため、まずは`rsyslog`をインストールしておきます。[前回の記事](https://qiita.com/masaki-oomura/items/dc71dc780eabe0910161)を参考にして、`fedora-log-exporter`にローカルマシンからSSHして操作します。

```sh
[fedora@fedora-log-exporter ~]$ sudo yum install rsyslog -y
[fedora@fedora-log-exporter ~]$ systemctl start rsyslog.service
[fedora@fedora-log-exporter ~]$ systemctl enable rsyslog.service
```
OpenShift Virtualization上のRed Hat系Linuxは`yum`コマンドで「Redhat Package Manage(RPM)」 を用いたパッケージのインストールも問題なくできます。

一応`rsyslog`が動いているか、`tail`コマンドでみておきます。
```sh
[fedora@fedora-log-exporter ~]$ sudo tail /var/log/message
May 31 00:44:40 fedora-log-exporter systemd[1]:hogehoge
```

大丈夫っぽいです。次に、`fedora-log-exporter`をHTTPサーバとして起動させることにします。

```sh
[fedora@fedora-log-exporter ~]$ sudo yum install httpd -y
[fedora@fedora-log-exporter ~]$ sudo service httpd start
Redirecting to /bin/systemctl start httpd.service
```
良さげです。さて、せっかくなので`fedora-log-exporter`で起動しているApacheにインターネットからアクセスしてみたいです。

## VMをインターネットに公開する
OpenShift Virtualizationで起動しているVMは、その実態は`Pod`であると[こちらの記事](https://qiita.com/masaki-oomura/items/a1453307d005e4656479)で触れました。つまり、Kubernetes/OpenShiftのリソースである`Service`と`Route`を使ってインターネットに公開できます。ここはこれまでOpenShiftを利用した事のある方からすると、とても自然だと思います。

今から以下の様に`Service`と`Route`を付けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/0e253e17-24ea-4d07-4b9c-32ba68128d00.png)


### `Service`を使って80番ポートでExposeする
`httpd`はホストの80番ポートでアクセスを受け付けています。
VM詳細画面から実態である`Pod`の詳細画面に入ります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/8d196b0e-3fdf-f83f-9e36-47ae2bf80805.png)

すでにデフォルトで`Label`が付いています。ホスト名で特定可能な`vm.kubevirt.io/name=fedora-log-exporter`を`Selector`にします。VMは`NameSpace=virtual-machine`にDeployしているので、以下の`Service`も同じ`NameSpace`に`oc apply`します。

```service-fedora-log-exporter.yaml
apiVersion: v1
kind: Service
metadata:
  name: service-fedora-log-exporter
  namespace: virtual-machine
spec:
  selector:
    vm.kubevirt.io/name: fedora-log-exporter
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
```

これでCluster内部に対して、80番ポートでExposeされました。

### `Route`でインターネットに公開
次に`Route`を`oc apply`します。

```route-fedora-log-exporter.yaml
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: route-fedora-log-exporter
  namespace: virtual-machine
spec:
  to:
    kind: Service
    name: service-fedora-log-exporter
  port:
    targetPort: 80
```
これで`Route`からURLが払い出されました。アクセスしてみます。
- http://route-fedora-log-exporter-virtual-machine.apps."your_openshift_host".openshiftapps.com

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/b9b3dc64-b9f2-aabb-e393-2ed7a3988f55.png)

無事、`fedora-log-exporter`がインターネットに公開されました。とても簡単でした！

## `fedora-log-exporter`のログ転送設定をする
`rsyslog`の設定ファイルをいじって、`fedora-log-server`（IPアドレスは`192.168.100.21`）に対して`udp`の514番ポートで転送する設定をします。

```sh
[fedora@fedora-log-exporter ~]$ sudo nano /etc/rsyslog.conf
```

エディタが開いたら、以下の行を追加して保存 (`ctrl+s`)・終了 (`ctrl+x`) してください。
（もし`tcp`で転送したい場合は`@`が2つになります。）

```
*.* @192.168.100.21:514
```

:::note info
どうしてもいつものクセでviエディタを使いがちですが、nanoエディタのほうが使い勝手良いし、普段のコピペも使えて便利です。若い人にはnanoで十分な気も...
:::

設定変更を反映させる為に`rsyslog`を再起動します。

```sh
[fedora@fedora-log-exporter ~]$ sudo systemctl restart rsyslog
```

これで`fedora-log-exporter`側の設定は完了です。

## `fedora-log-server`を設定
同様に`fedora-log-server`にも`rsyslog`をインストールします。
```sh
[fedora@fedora-log-exporter ~]$ sudo yum install rsyslog -y
[fedora@fedora-log-exporter ~]$ systemctl start rsyslog.service
[fedora@fedora-log-exporter ~]$ systemctl enable rsyslog.service
```

`fedora-log-server`にディレクトリとファイルを作成し、`fedora-log-exporter`から受信した/var/log/messageを格納する場所を用意しておきます。

```sh
[fedora@fedora-log-server ~]$ sudo mkdir /var/log/remote
[fedora@fedora-log-server ~]$ sudo touch message
```

続いて、`fedora-log-server`側でもログの受信設定をします。

```sh
[fedora@fedora-log-server ~]$ sudo nano /etc/rsyslog.conf
```

設定ファイルに以下の行を追加します。
```
module(load="imudp")
input(type="imudp" port="514")
if $fromhost-ip == '192.168.100.11' then /var/log/remote/messages
& stop
```
`fedora-log-server`の`udp`514番ポートがリッスンされ、`192.168.100.11`から受信したログは`var/log/remote/message`に格納される様に設定しました。

これにて、`fedora-log-server`の`var/log/remote/message`に`fedora@fedora-log-exporter`の`/var/log/message`が転送されるようになりました。

では`fedora-log-server`にSSHしてからログが転送されてくるか確認します。
その前に、`fedora@fedora-log-exporter`の方でなんらかログを発生させておきます。

```sh
[fedora@fedora-log-exporter ~]$ service httpd restart
Redirecting to /bin/systemctl restart httpd.service
==== AUTHENTICATING FOR org.freedesktop.systemd1.manage-units ====
Authentication is required to restart 'httpd.service'.
Authenticating as: fedora Cloud User (fedora)
Password: 
==== AUTHENTICATION COMPLETE ====
[fedora@fedora-log-exporter ~]$ 
```
`sudo`無しで`httpd`を起動しようとして`root`の`Password`を求められたので正しい`Password`を入力、無事`httpd`を起動しています。

さて、このログが`fedora-log-server`でも確認できるでしょうか？
```sh
[fedora@fedora-log-server ~]$ sudo tail /var/log/remote/messages
May 31 12:30:12 fedora-log-exporter httpd[3609]: Server configured, listening on: port 80
```

取得できていそうです。ホスト名も`fedora-log-exporter`の`/var/log/message`が転送されています。VMがコンテナの中で動いているからと言ってこれまでのVMのロギング運用が変わってしまう事はないと言えるわけです。

# OpenShift Loggingとの統合具合を確認
先に結論から言ってしまうと、VMの標準出力に出力されたログメッセージをOpenShift LoggingがApplication logとして取得することは、“現時点”（OpenShift ver4.15時点）ではできません。ちょっと試してみます。

## log-testアプリをコンテナ/VMでDeployして挙動の差を見る
[こちら](https://gitlab.com/masaki-oomura/log-test.git)に`Node.js`のアプリを用意しました。OpenShift上に`NameSpace=log-test`を作り、コンテナとしてDeployしました。方法はSource to Image(S2I)でも、DockerfileでもOK。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/3ad0cf09-6b96-d0e8-d2c6-ec58a16d34d8.png)

`Route`からアクセスするとこんな感じです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/8d714518-e195-154c-7364-457c3c38641d.png)

現在アプリが起動しているホスト名(コンテナの場合はPod名)が表示され、入力フォームが存在します。この入力フォームに文字列を入力してSubmitします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/86b6750d-fa74-715f-b6d1-6a629c9c9dde.png)

すると、入力した文字列が標準出力と`log.txt`ファイルに保存されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/297293af-83fc-63ce-63f4-d45ed617f7e7.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/6515e54f-4986-8ce5-1a87-ea51cdb9fe95.png)

OpenShift Loggingで確認すると同様のログを確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/7d8c2645-287f-1797-8a36-a20abe729db8.png)

ここまでがOpenShift Loggingにおけるコンテナアプリケーションのアプリケーションログの確認でした。同様のアプリを`fedora-log-exporter`にデプロイしてみます。

## VMに同様のlog-testアプリをDeployして挙動を確認する

```sh
[fedora@fedora-log-exporter ~]$ $ sudo yum install git -y
[fedora@fedora-log-exporter ~]$ $ sudo yum install nodejs -y
[fedora@fedora-log-exporter ~]$ $ sudo npm install express
[fedora@fedora-log-exporter ~]$ $ sudo npm install ejs
[fedora@fedora-log-exporter ~]$ $ git clone https://gitlab.com/masaki-oomura/log-test.git
[fedora@fedora-log-exporter ~]$ $ cd log-test
[fedora@fedora-log-exporter log-test]$ npm start

> log-test@1.0.0 start
> node app.js

Server is listening at http://localhost:3000
```

さて、`fedora-log-exporter`は現在`Service`で80番ポートを公開していたので、`service-fedora-log-exporter.yaml`及び`route-fedora-log-exporter.yaml`を編集しておきます。

```service-fedora-log-exporter.yaml
apiVersion: v1
kind: Service
metadata:
  name: service-fedora-log-exporter
  namespace: virtual-machine
spec:
  selector:
    vm.kubevirt.io/name: fedora-log-exporter
  ports:
    - protocol: TCP
      port: 80
      targetPort: 3000
```

```route-fedora-log-exporter.yaml
kind: Route
apiVersion: route.openshift.io/v1
metadata:
  name: route-fedora-log-exporter
  namespace: virtual-machine
spec:
  to:
    kind: Service
    name: service-fedora-log-exporter
  port:
    targetPort: 3000
```
`Route`のURLからアプリにアクセスしました。ホスト名のところがVMのホスト名になっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/20b60f07-0d7c-0749-adf4-dc4e0c4637f4.png)

さて、先ほどコンテナでやったのと同様にVMの標準出力にログを出してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/5e9a4108-104a-cf17-df56-d0e1d0fd1eaa.png)

SSHしているターミナルにログが出ました。

```sh
[fedora@fedora-log-exporter log-test]$ npm start

> log-test@1.0.0 start
> node app.js

Server is listening at http://localhost:3000
入力された文字列: digimon
メッセージがlog.txtに保存されました。
```

OpenShift Loggingでアプリケーションのログを見てみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/69623e20-c111-eeb2-ebfc-41fa0a17e049.png)

わけわからない`{"component":"virt-launcher", hogehoge`とかいうログが大量に出ております。これはなにかというと、VM`fedora-log-exporter`の実態（インスタンス）であるところのPod`virt-launcher-fedora-log-exporter-gv9xh`の詳細で見ることができるコンテナのログです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/d63ec6ab-19c0-cc5e-5254-a395c8de0160.png)

つまり、VMの標準出力にログを出していても、OpenShift Loggingで確認する事はできないです。

## 実はVMのシリアルコンソールに出力されるものはOpenShift Loggingで確認できる
OpenShift Virualization機能が提供する`Custom Resource`である`HyperConverged`のインスタンス`kubevirt-hyperconverged`はデフォルトではVMのシリアルコンソールログが`disable`となっています。

:::note info
詳細は[OpenShiftのドキュメント](https://docs.openshift.com/container-platform/4.15/virt/support/virt-troubleshooting.html#virt-enable-guest-log-default-cli_virt-troubleshooting)を参照ください。ただし、ドキュメントの項目の通り、こちらはどちらかというとトラブルシューティングを目的とした機能です。
:::

上記のドキュメントに従って`disableSerialConsoleLog: false`に書き換えます。
（デフォルトは`disable`が`true`なので、要は機能が「無効」になっています）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/6eb5e9fb-0f1f-d9ac-31e0-fdb5f001479f.png)


VMの詳細画面でシリアルコンソールを使う事ができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/fb6bc8d3-02dc-049f-3d6f-696de1dcef5f.png)

シリアルコンソールに出力されるログはOpenShift Loggingでも確認することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3627586/120fc5a8-3a91-0563-a45f-4f003f1b4b69.png)

# おわりに
以上が、OpenShift Virtualization上でのVMのロギング運用の状況でした。これまで通りのVMのロギングはOpenShift上のVMであろうと、特に大きな変更は必要無いであろうことがお分かりいただけたと思います。ただし、OpenShift Loggingとの統合はまだまだこれからに期待なところが多そうです。