はじめに
今回はOpenShift Virtualizationのロギング周りについて挙動を確認していきます。
ざっくり2つの観点で見ていきます。
- syslog周りの運用
- OpenShift Loggingとの統合具合を確認
また、これらを試す過程で、OpenShift上のVMにyum
でパッケージをインストールしてみたり、VMをインターネットに公開したりといった事も試します。
syslog周りの運用
まずはsyslogの取得についてです。前回の記事で2台のVMを同じOverlay Networkに接続して疎通させた内容を活かしてやってみます。1台のVMlog-exporter
のvar/log/message
をもう1台のVMlog-server
に転送できるのかを実験します。
先に結論を言ってしまうと、特に何の問題も無くできます。つまり、これまでの仮想マシンのロギング運用は、OpenShift Virtualizationにおいても変わりなく実行できると言えます。
やってみます。
Fedora VMを2台起動
前回の記事を参考にして、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
をインストールしておきます。前回の記事を参考にして、fedora-log-exporter
にローカルマシンからSSHして操作します。
[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
コマンドでみておきます。
[fedora@fedora-log-exporter ~]$ sudo tail /var/log/message
May 31 00:44:40 fedora-log-exporter systemd[1]:hogehoge
大丈夫っぽいです。次に、fedora-log-exporter
をHTTPサーバとして起動させることにします。
[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
であるとこちらの記事で触れました。つまり、Kubernetes/OpenShiftのリソースであるService
とRoute
を使ってインターネットに公開できます。ここはこれまでOpenShiftを利用した事のある方からすると、とても自然だと思います。
今から以下の様にService
とRoute
を付けます。
Service
を使って80番ポートでExposeする
httpd
はホストの80番ポートでアクセスを受け付けています。
VM詳細画面から実態であるPod
の詳細画面に入ります。
すでにデフォルトでLabel
が付いています。ホスト名で特定可能なvm.kubevirt.io/name=fedora-log-exporter
をSelector
にします。VMはNameSpace=virtual-machine
にDeployしているので、以下のService
も同じNameSpace
にoc apply
します。
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
します。
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が払い出されました。アクセスしてみます。
無事、fedora-log-exporter
がインターネットに公開されました。とても簡単でした!
fedora-log-exporter
のログ転送設定をする
rsyslog
の設定ファイルをいじって、fedora-log-server
(IPアドレスは192.168.100.21
)に対してudp
の514番ポートで転送する設定をします。
[fedora@fedora-log-exporter ~]$ sudo nano /etc/rsyslog.conf
エディタが開いたら、以下の行を追加して保存 (ctrl+s
)・終了 (ctrl+x
) してください。
(もしtcp
で転送したい場合は@
が2つになります。)
*.* @192.168.100.21:514
どうしてもいつものクセでviエディタを使いがちですが、nanoエディタのほうが使い勝手良いし、普段のコピペも使えて便利です。若い人にはnanoで十分な気も...
設定変更を反映させる為にhttpd
を再起動します。
[fedora@fedora-log-exporter ~]$ sudo systemctl restart rsyslog
これでfedora-log-exporter
側の設定は完了です。
fedora-log-server
を設定
同様にfedora-log-server
にもrsyslog
をインストールします。
[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を格納する場所を用意しておきます。
[fedora@fedora-log-server ~]$ sudo mkdir /var/log/remote
[fedora@fedora-log-server ~]$ sudo touch message
続いて、fedora-log-server
側でもログの受信設定をします。
[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
の方でなんらかログを発生させておきます。
[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
でも確認できるでしょうか?
[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して挙動の差を見る
こちらにNode.js
のアプリを用意しました。OpenShift上にNameSpace=log-test
を作り、コンテナとしてDeployしました。方法はSource to Image(S2I)でも、DockerfileでもOK。
Route
からアクセスするとこんな感じです。
現在アプリが起動しているホスト名(コンテナの場合はPod名)が表示され、入力フォームが存在します。この入力フォームに文字列を入力してSubmitします。
すると、入力した文字列が標準出力とlog.txt
ファイルに保存されます。
OpenShift Loggingで確認すると同様のログを確認できます。
ここまでがOpenShift Loggingにおけるコンテナアプリケーションのアプリケーションログの確認でした。同様のアプリをfedora-log-exporter
にデプロイしてみます。
VMに同様のlog-testアプリをDeployして挙動を確認する
[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
を編集しておきます。
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
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のホスト名になっています。
さて、先ほどコンテナでやったのと同様にVMの標準出力にログを出してみます。
SSHしているターミナルにログが出ました。
[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でアプリケーションのログを見てみます。
わけわからない{"component":"virt-launcher", hogehoge
とかいうログが大量に出ております。これはなにかというと、VMfedora-log-exporter
の実態(インスタンス)であるところのPodvirt-launcher-fedora-log-exporter-gv9xh
の詳細で見ることができるコンテナのログです。
つまり、VMの標準出力にログを出していても、OpenShift Loggingで確認する事はできないです。
実はVMのシリアルコンソールに出力されるものはOpenShift Loggingで確認できる
OpenShift Virualization機能が提供するCustom Resource
であるHyperConverged
のインスタンスkubevirt-hyperconverged
はデフォルトではVMのシリアルコンソールログがdisable
となっています。
詳細はOpenShiftのドキュメントを参照ください。ただし、ドキュメントの項目の通り、こちらはどちらかというとトラブルシューティングを目的とした機能です。
上記のドキュメントに従ってdisableSerialConsoleLog: false
に書き換えます。
(デフォルトはdisable
がtrue
なので、要は機能が「無効」になっています)
VMの詳細画面でシリアルコンソールを使う事ができます。
シリアルコンソールに出力されるログはOpenShift Loggingでも確認することができます。
おわりに
以上が、OpenShift Virtualization上でのVMのロギング運用の状況でした。これまで通りのVMのロギングはOpenShift上のVMであろうと、特に大きな変更は必要無いであろうことがお分かりいただけたと思います。ただし、OpenShift Loggingとの統合はまだまだこれからに期待なところが多そうです。