kani tech blog

webの会社でアドテクエンジニア?やってます。しばらくはGCP中心に書く予定。

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
  1. bundlerは入ってないので、入れないといけない
  2. rootにならないとGemのインストールは出来ない
  3. rootにならないと、ファイルの書き出しが出来ない?(調査不足)

Skaffoldをローカル開発で試してみたけど・・・

これってビルドが走るごとにDocker imageが作られるけど、自動で削除してくれないのね・・・ 開発環境で使うとファイルを変更するごとにビルドが走るから、何も考えずにやると無限にimageが増えるのか?

マニュアルちゃんと読めばその辺も書いてあるのかな?

skaffold.dev

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.confDockerfileも合わせて説明した方が分かり易かったかなーという気もするので、近いうちにそちらもまとめたいと思います。

今更ながら技術ブログ始める気になった

webの会社でエンジニアやってるものです。主に広告周りのサーバーサイド開発やGCPを使ったインフラ構築を扱っています。

今まで技術系のネタはQiitaで書いていたのですが、色々と思うところがあってブログとして書いていくことにしました。

しばらくはkubernetesやElasticsearchの話が中心になりそうです。週1ペースで投稿できると良いな・・・・