kubernetes の全ノード上で同じコンテナを動かす


今回は、kubernetes上で同一コンテナを全ノードで動かす方法を紹介したいと思います。kubernetes自体の起動方法はここでは割愛します。

はじめに

以前、CoreOSのFleet上でmackerel-agentを動かすということを行いました。今回は、kubernetes上で同じようにクラスタ全ノードでコンテナを動かしたいと思います。

Pod

kubernetesでのコンテナの管理は、Podといわれる幾つかのコンテナをグループ化したもの(Pod内に1コンテナでも良い)で管理します。このPodの単位で起動、停止などを行います。

Podの特徴はいくつかあり、例えばPod内のコンテナは同一ホストにデプロイされる(Pod単位でホストにデプロイされる)などがあります。

例えば以下のように記述します。例ではmackerel-agentを使っていますが、docker-dd-agentでもnginxでも構いません。

[code]
apiVersion: v1
kind: Pod
metadata:
name: mackerel-agent
spec:
containers:
– name: mackerel-agent
image: mackerel/mackerel-agent
imagePullPolicy: Always
env:
– name: apikey
value: <your api key>
– name: opts
value: -role=<Service>:<Role>
– name: enable_docker_plugin
value: foo
lifecycle:
preStop:
exec:
command: ["/usr/local/bin/mackerel-agent", "retire", "-force"]
volumeMounts:
– name: docker-sock
mountPath: /var/run/docker.sock
– name: mackerel-id
mountPath: /var/lib/mackerel-agent/
volumes:
– name: docker-sock
hostPath:
path: /var/run/docker.sock
– name: mackerel-id
hostPath:
path: /var/lib/mackerel-agent/
[/code]

Replica Set

Replica Setは、Podの”Replica”を指定台数動かし続けるための仕組みです。以前は Replication Controllerと呼ばれていました。 Replication Controllerとの違いは、selector が使えるかどうかです。

The only difference between a Replica Set and a Replication Controller right now is the selector support.

仮にReplica Setで作成されたkubernetes上のPodに異常があったりPodを削除した場合でも、Replica SetによりPodが再作成されます。

[code]
apiVersion: extensions/v1beta1
kind: ReplicaSet
metadata:
name: mackerel-agent
spec:
replicas: 3
selector:
matchLabels:
name: mackerel-agent
template:
metadata:
labels:
name: mackerel-agent
spec:
containers:
– name: mackerel-agent
image: mackerel/mackerel-agent
env:
– name: apikey
value: <your api key>
– name: opts
value: -role=<Service>:<Role>
– name: enable_docker_plugin
value: foo
lifecycle:
preStop:
exec:
command: ["/usr/local/bin/mackerel-agent", "retire", "-force"]
volumeMounts:
– name: docker-sock
mountPath: /var/run/docker.sock
– name: mackerel-id
mountPath: /var/lib/mackerel-agent/
[/code]

Daemon Set

それでは本題に入りたいと思います。
今まででもReplica Setの設定でNodePortを設定することで、特定のポートを利用するPodは1Podしかの1ノードに稼働できないことを利用して裏技的に全ノードで動かすことができました。なぜこのようなことをするかというとReplica Setsだと同一ノードに同じコンテナが複数動くことがありうるためです。
kubernetesのDaemon Set 実装でそのようなことをせずに全ノードでPodを動かすことが出来るようになりました。では、Daemon Set は何でしょうか。公式ドキュメントには以下のようにあります。

http://kubernetes.io/docs/admin/daemons/#what-is-a-daemon-set

Some typical uses of a Daemon Set are:
running a cluster storage daemon, such as glusterd, ceph, on each node.
running a logs collection daemon on every node, such as fluentd or logstash.
running a node monitoring daemon on every node, such as Prometheus Node Exporter, collectd, New Relic agent, or Ganglia gmond.

用途は様々ですが、今までのようなことをせずに全部のノードでコンテナを動かしたい時に利用するものということがわかります。

Daemon Set設定

それでは、Daemon Setを設定してみましょう。kubernetesは起動済みだとします。今回は、例としてmackerel-agentをkubernetes全ノードで動かしてみたいと思います。

設定方法

DaemonSetの設定用yamlのサンプルです。mackerel-agent以外のimageを動かしたい方は、利用したいimageにあわせて変更をお願いします。同じようにdocker-dd-agentを動かすこともできます。

[code]
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
labels:
name: mackerel-agent
name: mackerel-agent
spec:
template:
metadata:
labels:
app: mackerel-agent
spec:
containers:
– name: mackerel-agent
image: mackerel/mackerel-agent
imagePullPolicy: Always
env:
– name: apikey
value: <your api key>
– name: opts
value: -role=<Service>:<Role>
– name: enable_docker_plugin
value: foo
lifecycle:
preStop:
exec:
command: ["/usr/local/bin/mackerel-agent", "retire", "-force"]
volumeMounts:
– name: docker-sock
mountPath: /var/run/docker.sock
– name: mackerel-id
mountPath: /var/lib/mackerel-agent/
volumes:
– name: docker-sock
hostPath:
path: /var/run/docker.sock
– name: mackerel-id
hostPath:
path: /var/lib/mackerel-agent/
[/code]

上記ファイルを保存したら、kubectl が使えるホスト上で以下のコマンドを実行してください。

[code]
$ kubectl create -f <保存したファイル名>
daemonset "mackerel-agent" created
[/code]

稼働確認

それでは、きちんとDaemon SetとPodが作成されているか確認しましょう。
Daemon Setは以下のように確認できます。

[code]
$ kubectl get ds
NAME DESIRED CURRENT NODE-SELECTOR AGE
mackerel-agent 20 20 <none> 3d
[/code]

20ノードのクラスタだということがわかりますね。
Podも以下のように確認できます。

[code]
$ kubectl get pod mackerel-agent
NAME READY STATUS RESTARTS AGE
mackerel-agent-ald9q 1/1 Running 0 3d
(snip)
mackerel-agent-zl8cn 1/1 Running 0 3d
[/code]

まとめ

今回は、kubernetsの全ノードで同一コンテナを動かす方法をご紹介しました。
監視用のコンテナを全ノードで動かすことが簡単になり、mackerel-agentやdocker-dd-agentなどで監視設定を入れるものより容易になると思います。


DACエンジニア採用情報

  関連記事

x-callback-urlを使ってみた

x-callback-urlとは? iOSのアプリ間連携の仕様の一つみたいです。簡単に言うと、ディープリンクを行うためにカスタムURLスキームを利用するが、アプリ毎にバラバラな規則でURLスキームを設定するとアプリ間連携をスムーズに行うことができないため、どのような規則でURLスキームを設定するかを …

自社サービスのDocker化(前編)

こんにちは。 インフラ開発部の上田です。 普段は自社開発システムのインフラ担当として、日々頑張って仕事をしています。 今回は、近年話題になっているDockerについて、取り上げてみようと思います! なぜDockerなのか・・・? そもそもDockerとは何か・・・?   当社では様々なサー …

Burpの使い方!

こんにちは、第二ソリューション開発部の谷口です。 受託開発の部署で開発を担当してます。 APIを扱う機会が多く、今回は通信内容を確認するためのローカルプロキシツール「Burp」について書かせて頂きます。 Burpとは Webアプリケーション開発時の検証において、Webサーバとブラウザ間の通信内容を確 …

クラウド電話API “Twilio”で起こされてみた

どうも、開発部のクラヴマガです。 弊社サービスも最近はAWSの様なクラウド環境でサービスを構築することが多くなりました。 そこで問題になるのが、障害などによる深夜対応・・・。 データセンターに物理サーバをおいていた頃は、データセンターから障害発生時に 電話連絡をもらっていたのですが、クラウド環境では …

全ファイルを検索
意外と知らないかも? Chrome DevTools の機能10選

みんな使っている Chrome DevTools。 Web開発やトラブルシューティングには必須ですが、便利な機能を知らないで使っている人がいたり、Web で使い方を調べても古い情報だったりすることがあるので、部内で Chrome DevTools についての勉強会を開催しました。 ここでは、その中か …

no image
AWSにRailsアプリをデプロイする(公開編)

次にデプロイするため“aws rails デプロイ”でググってみるとunicorn、nginxというキーワードがでてくるので とりあえずこれを設定していきます。   アプリのsecret_key_baseの設定 [crayon-6153b94ec7e70873593 …

Tableauを利用してMySQLとRedshiftのクロスDBジョインを実現する

はじめに RedshiftやTreasureDataなどのデータマート用のDBにはID単位の解析結果が格納され、ローカルのMySQLにはIDに紐づいた名称マスタが管理されている構成の場合、データマートのクロス集計結果に対してIDに紐づいた名称を付与したいことがあります。 データマート用に用意したDB …

Scala番外編「Boxに保存したファイルをBox APIを使ってダウンロードしよう!」

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 Box APIを使う背景・目的 DACはメディアレップです メディアレップとは、インタ …

ゼロからAngularでSPAを作ってみた(3) CI: 継続的インテグレーション編

前回までのおさらいと今回やること 前々回(はじめてのアプリ編)と前回(デプロイ・公開編)で、作成した Angular のチャットアプリを Web に公開するところまでいきました。 でも、デプロイするのに、毎回決まったコマンドを打つのって面倒ですよね。 今回は GitHub でソースコードを管理して、 …

MacのSSHポートフォワーディングツール「autossh」と「Coccinellida」をご紹介!

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 さて、皆さんはSSHポートフォワーディングするときにどんな方法で行っていますか? わた …