前回の投稿で、akka-slf4とfluentdを利用してログをS3に転送しました。
この際に、以下の2つのサービスが登場しました。
- akkaのアプリケーション
- fluentdのプロセス
上記を、kubernetes上でdeployするをどうしようかな、と考えましたが、集約的なcollectorを一つ配置するのではなく思い切って、アプリごとにfluentdのコンテナを付随させようと思いました。
メリットとしては以下のとおりです。
- logback.xmlの中で、fluentdのホストをlocalhostにしておける
- 一元的なfluentdサービスが不在になることで、どれかひとつのfluentdのpodがこけても他のサービスのロギングは継続される
デメリットとしては以下なのかな、と思いました。
- 各サービスに付随するfluentdの通信が途絶えた時に追跡しにくい
- AWSのリソース(S3)へのアクセス権限を持つpodが点在する
後者は、ちょっとうざったいので、もう一個何かをかますか、構成を変更するか、というところもあるので悩みどころです。
うだうだと書きましたが、下記のようなReplicationController用のYamlを用意することで実現が可能となります。
ご興味のある方はご利用ください。
rc.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: triplew-app-name
labels:
app: triplew-app-label
tier: triplew-app-tier
spec:
replicas: 2
template:
metadata:
labels:
app: triplew-app-label
tier: triplew-app-tier
spec:
containers:
- name: fluentd-s3
image: triplew/fluentd-s3
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: mySecretKey
key: awsaccesskeyid
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: mySecretKey
key: awssecretaccesskey
- name: FLUENTD_S3_BUCKET
valueFrom:
secretKeyRef:
name: mySecretKey
key: fluentds3bucket
- name: FLUENTD_S3_REGION
valueFrom:
secretKeyRef:
name: mySecretKey
key: fluentds3region
ports:
- containerPort: 24224
- name: triplew-app-name
image: triplew/app:latest
env:
- name: AWS_ACCESS_KEY_ID
valueFrom:
secretKeyRef:
name: mySecretKey
key: awsaccesskeyid
- name: AWS_SECRET_ACCESS_KEY
valueFrom:
secretKeyRef:
name: mySecretKey
key: awssecretaccesskey
- name: JAVA_OPTS
value: -Dconfig.file=application.production.conf
ports:
- containerPort: 8080
secretKeyRefについては、kubernetesがv1.2だと動作しますが、v1.0系だと未実装の状態ですのでご注意ください。
本日は以上となります。