fluentdのDockerImageを使うときに気をつけること
とりあえずサンプル
FROM fluent/fluentd:v1.7-1 USER root RUN gem install bundler COPY docker/Gemfile Gemfile COPY docker/Gemfile.lock Gemfile.lock RUN bundle install COPY docker/fluent.conf /fluentd/etc/ CMD exec fluentd -c /fluentd/etc/fluent.conf
- bundlerは入ってないので、入れないといけない
- rootにならないとGemのインストールは出来ない
- rootにならないと、ファイルの書き出しが出来ない?(調査不足)
Skaffoldをローカル開発で試してみたけど・・・
これってビルドが走るごとにDocker imageが作られるけど、自動で削除してくれないのね・・・ 開発環境で使うとファイルを変更するごとにビルドが走るから、何も考えずにやると無限にimageが増えるのか?
マニュアルちゃんと読めばその辺も書いてあるのかな?
GKEでstatefulなfluentdを設置
GKEでアプリケーションのログを取るためにfluentdをStatefulSetで動かしたので、その忘備録です。
背景
今回はBigQueryにログを加工して流す目的で使用しました。BigQueryへの挿入方法としては、streaming insert
ではなくload
を使用しています。
StatefulSetでfluentdを動かす利点
BigQueryに限らず、fluentdで何かしらのデータストアにログを送信する際は、ファイルバッファを用いて定期的に送信するのが一般的かと思います。
しかし、k8sで普通にdeploymentを使ってfluentdのPodを配置する場合、何かしら不慮の事故でPodが再起動してしまうと、バッファしていたデータが失われてしまいます。Podが1台の構成であれば単純に永続ボリュームをマウントすれば良いですが、複数のPodで負荷分散・冗長化が必要なことの方が多いでしょう。
StatefulSetならPodが再起動した場合でも、再起動前にマウントされていた永続ボリュームを再度マウントできます。つまり、再起動前のバッファファイルを引き継ぐことができるということです。
StatefulSetの定義
以下がStatefulSetのサンプルです。
apiVersion: apps/v1beta1 kind: StatefulSet metadata: name: app-name spec: serviceName: app-name replicas: 2 selector: matchLabels: app: app-name updateStrategy: type: RollingUpdate template: metadata: labels: app: app-name spec: securityContext: fsGroup: 1000 containers: - name: app-name image: gcr.io/:project_id/:image_name ports: - containerPort: 24224 volumeMounts: - name: app-name-pvc mountPath: /fluentd/log volumeClaimTemplates: - metadata: name: app-name-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard
StatefulSetはデフォルトでローリングアップデートが出来ないので、updateStrategy
を設定します。
updateStrategy: type: RollingUpdate
バッファファイルの書き込みを許可するために、securityContext
を設定しています(もっといい方法があるかも?)。
securityContext: fsGroup: 1000
10GBストレージのvolumeClaimTemplates
を定義して、/fluentd/log
のパスにマウントしています。
volumeMounts: - name: app-name-pvc mountPath: /fluentd/log
volumeClaimTemplates: - metadata: name: app-name-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi storageClassName: standard
終わりに
StatefulSetでfluentdを立てるような事例がweb上にあまりなかったので、簡単にまとめて見ました。今回はStatefulSetの設定のみ記載しましたが、fluent.conf
とDockerfile
も合わせて説明した方が分かり易かったかなーという気もするので、近いうちにそちらもまとめたいと思います。
今更ながら技術ブログ始める気になった
webの会社でエンジニアやってるものです。主に広告周りのサーバーサイド開発やGCPを使ったインフラ構築を扱っています。
今まで技術系のネタはQiitaで書いていたのですが、色々と思うところがあってブログとして書いていくことにしました。
しばらくはkubernetesやElasticsearchの話が中心になりそうです。週1ペースで投稿できると良いな・・・・