Docker/K8S実践コンテナ開発入門@26日目

Dockerのロギングの勉強の続きをやっていきます。

fluentd logging driverの運用イメージについて

書籍の内容を抜粋すると、
「fluentdを各Dockerホストにエージエント的に配置し、Dockerのloggin driverで利用する方式」とのこと

■特徴

  • ホストに集約してしまうと冗長化を手厚く行う必要がある。
  • ログ分散型であれば、ホスト障害での影響をホストのみに抑えることができる
  • そのためにも、VMのイメージにfluentdを含めデプロイする前にプロビジョニングで配置するのが有効

また、機能を有効に扱うにあたって監視が必要だが、
特に注目しておくべき項目は以下の通り

■項目

  • buffer_queue_length バッファに保持されているChunkの数
  • buffer_total+queued_size バッファに保持されているChunkの総サイズ
  • retry-count リトライ回数

fluent.confに 「@type monitor_agent」を追加することでこれらの項目が取得可能。

Kubernetsにおけるログの管理

Docker composeではなく、Kubernetsのロギングを試してみます。
Dockerとは殆ど差は無く、コンテナは標準出力へ出力することにのみ集中し
コンテナ外で適切にログを管理すべきとのこと

KubernetesでElasticsearchとKibanaを構築する

書籍に従って「elasticsearch.yaml」、「kibana.yaml」を作成します。

createdとなっているが起動がうまくいっていないようです。
その場合は以下のログで事象を特定できる

■コマンド

//kube-systemで起動されているpodを表示
kubectl -n kube-system get pods

//ログ確認
kubectl -n kube-system logs <containerID>

※オプションの指定がないとデフォルトの「pod」が利用されるとのこと

■エラー

lawrence@Chocolate elakube % kubectl -n kube-system logs elasticsearch-7b775db986-krjhx 
[2020-05-26T12:48:45,524][WARN ][o.e.b.ElasticsearchUncaughtExceptionHandler]uncaught exception in thread [main]akeruncaught exception in thread [main]
org.elasticsearch.bootstrap.StartupException: java.lang.IllegalStateException: Unable to access 'path.scripts' (/usr/share/elasticsearch/config/scripts)
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:136) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:123) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:70) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:134) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:91) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:84) ~[elasticsearch-5.6.16.jar:5.6.16]
Caused by: java.lang.IllegalStateException: Unable to access 'path.scripts' (/usr/share/elasticsearch/config/scripts)
	at org.elasticsearch.bootstrap.Security.addPath(Security.java:450) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:246) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Security.configure(Security.java:119) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:228) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
	... 6 more
Caused by: java.nio.file.FileSystemException: /usr/share/elasticsearch/config/scripts: Read-only file system
	at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91) ~[?:1.8.0_201]
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) ~[?:1.8.0_201]
	at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) ~[?:1.8.0_201]
	at sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:384) ~[?:1.8.0_201]
	at java.nio.file.Files.createDirectory(Files.java:674) ~[?:1.8.0_201]
	at java.nio.file.Files.createAndCheckIsDirectory(Files.java:781) ~[?:1.8.0_201]
	at java.nio.file.Files.createDirectories(Files.java:767) ~[?:1.8.0_201]
	at org.elasticsearch.bootstrap.Security.ensureDirectoryExists(Security.java:492) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Security.addPath(Security.java:448) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Security.addFilePermissions(Security.java:282) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Security.createPermissions(Security.java:246) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Security.configure(Security.java:119) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:228) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:342) ~[elasticsearch-5.6.16.jar:5.6.16]
	at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:132) ~[elasticsearch-5.6.16.jar:5.6.16]
	... 6 more

Unable to access 'path.scripts' ...???
調べてみると同じような事象が起きている方が結構いる模様。

OSXだと起きてしまう?

色々調べた結果以下の設定を追加することで正常に起動しました。

■elastiserch.yaml
data:
elasticsearch.yml: |-
http.host: 0.0.0.0
path.scripts: /tmp/scripts //追加設定

log4j2.properties: |-
status = error

なんで上手くいくのかは良く分かりませんがともかくこれでいけます。