Mackerel を使ったサーバメトリクス可視化の背景っぽいやつ #可視化

可視化ツール現状確認会 on Zusaar

可視化ツール現状確認会で Mackerel-Based Server Metrics Visualization とかいう話をしました。 僕はアルバイト入社したときからサーバ管理ツールにずっと関わってて、周辺ツールとかもウォッチしてて、そういう流れで Mackerel がどういう位置づけにあるかみたいな話だったはず。

かつて自作社内サーバ管理ツールで、RRDtool の最悪の引数をURLクエリで互換するようなパーサ作ってたりして、異常な努力をしていましたが、ここ半年くらいで、モダンな Graphite とか Sensu をサーバ管理ツールと組み合わせようとしていて、気づいたら https://macekrel.io っていうサービスができてたという感じです。 Graphite と Sensu(Collectd) を導入しようとそれはそれで運用が思ったより面倒で、パフォーマンスがでないとかモニタリング用のサーバを用意したくないというようなことがあってかけた労力に見合わないという感じなら普通に Mackerel 使うと便利。 あと、サーバのIPアドレスとかホスト情報とサーバメトリクスビューが分散している場合(Munin と AWS consoleとか)に、統合管理するために Mackerel 使ってもらうのも便利。

ちなみに読み方はマケレルではなくてマカレル(英語読みはマッカレル?)っぽい。 なんでもいいけどとにかく RRDtool を使うべきではないと思います。

資料

軽くロードマップみたいなものも書かれています。 もうちょっと突っ込んだ使い方とか何ができるのかみたいな話は来週のモニカジで喋れたら良さそうです。

会場の提供、準備、運営をしていただいた Voyage Groupの皆様ありがとうございました。

インターネットの様子

DockerとS3を用いた、yum / apt リポジトリ作成・運用の継続的インテグレーション

Docker を用いた rpm / deb パッケージ作成の継続的インテグレーション - ゆううきブログ の続き。 前回は、rpm / deb パッケージを作るために、CentOS、Debianなど各種ディストリビューションを揃える手間をかけずに、Docker コンテナ上でパッケージングして、ついでに Jenkins で CI するみたいなことを書いた。

今回は、作成したパッケージを yum / apt リポジトリに登録して yum / apt コマンドでパッケージインストール/アップデートできるようになるまで継続的インテグレーションするという話。

問題点

  • yum / apt リポジトリ用の専用ホストを立てて、そこで apache とかで静的ファイルをホストするのはめんどくさい。
    • 特に、mackerel-agent みたいなユーザにインストールしてもらうパッケージの場合、リポジトリを公開しないといけなくて、冗長化とか面倒はさらに増える。
  • リポジトリ作成のために必要なメタファイル群を作成するために、createrepo や reprepro コマンドがインストールされた環境が必要となる。
    • OSX とかではインストールできない。(がんばったらできるのかもしれない)

Docker と S3 で解決

  • yum / apt リポジトリ用の専用ホストを立てて、そこで apache とかで静的ファイルをホストするのはめんどくさい。

前者については、S3 に静的ファイルをアップロードすることにより、サーバもたなくてよいので簡単。 手順は簡単で、S3のWebコンソールで適当にバケットを作って、createrepo または reprepro で作成したファイルをs3cmd とか aws-cli でバケットにアップロードする。 バケットには、bucket-name.s3.amazonaws.com. のようなエンドポイントがつくので、各ホストで リポジトリの設定を書くだけ。

さらに、Jenkins で master ブランチが更新されたときにパッケージの作成と同時に S3 にアップロードすることで、勝手にリポジトリに最新パッケージが入るので便利。今触ってるのは一般公開する代物なので、リリースは慎重に手でやってるけど、社内リポジトリとかならJenkinsで自動化したらよさそう)

  • リポジトリ作成のために必要なファイル群を作成するために、createrepo や reprepro コマンドがインストールされた環境が必要となる。

手元は OSX でも、Docker 上の各ディストリビューションでディストリ依存な createrepo や reprepro をインストール・実行できる。

ディレクトリ構成と Dockerfile

  • ディレクトリ構成 (yum)
tree -a
.
├── .s3cfg
├── Dockerfile
├── files
│   └── mackerel-agent-x.x.x.noarch.rpm
└── macros
  • ディレクトリ構成 (apt)

  • Dockerfile (yum)

# docker build -t 'hatena/mackerel/yum-repo' .
# docker run -t 'hatena/mackerel/yum-repo'

FROM centos
ENV PATH /usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin
RUN yum update -y
RUN rpm -ivh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN yum install --enablerepo=epel -y createrepo s3cmd

RUN install -d -m 755 /centos/x86_64
ADD files /centos/x86_64/
RUN /usr/bin/createrepo --checksum sha /centos/x86_64

ADD .s3cfg /.s3cfg
WORKDIR /centos/
CMD /usr/bin/s3cmd -P sync . s3://yum.mackerel.io/centos/
  • Dockerfile (apt)
# docker build -t 'hatena/mackerel/apt-repo' .
# docker run -t 'hatena/mackerel/apt-repo'

FROM tatsuru/debian
ENV PATH /usr/local/bin:/usr/sbin:/sbin:/usr/bin:/bin
ENV DEBIAN_FRONTEND noninteractive

RUN apt-get -y update
RUN apt-get -y install reprepro s3cmd
RUN apt-get clean

RUN mkdir -p /deb
ADD files /deb/
WORKDIR /debian
RUN mkdir -p db dists pool
ADD conf /debian/conf
RUN reprepro includedeb mackerel /deb/*.deb
RUN reprepro export

ADD .s3cfg /.s3cfg
CMD /usr/bin/s3cmd -P sync . s3://apt.mackerel.io/debian/

リポジトリの設定

独自リポジトリなので、インストール先ホストではリポジトリを設定する必要がある。 yum / apt で、それぞれ次のように設定するとよい。

  • yum の場合

/etc/yum.repos.d/mackerel.repo

[mackerel]
name=mackerel-agent
baseurl=http://yum.mackerel.io/centos/\$basearch
  • apt の場合
echo "deb http://apt.mackerel.io/debian/ mackerel contrib" >> /etc/apt/sources.list.d/mackerel.list

所感

Docker または Vagrnat を使うと、いちいちディストリビューション環境用意しなくてよいし、余分なサーバをもたなくて済む。 これは、Virtualbox や VMware で仮想ホストを立ち上げても同じだけど、Docker や Vagrant は CLI で操作できてプログラマブル(特に Docker はREST APIがある)なので、自動化しやすい。 さらに、Docker なら毎回クリーンな環境からリポジトリを構築しやすいのでゴミが入りにくいというメリットがある。 (Vagrnat でもできるけど、壊して再構築するのに時間がかかる)

前にも書いたけど、Docker 使うと、今まで特別な環境でしかできなかったことを気軽に手元でできるようになったりする。 Docker が Immutable Infrastructure 専用の何かみたいに言われることがあって、結局まだそんなにうまく使えないよねみたいな話あるけど、用途はいろいろあると思う。

Docker を用いた rpm / deb パッケージ作成の継続的インテグレーション

サーバ管理ツールのエージェント みたいなソフトウェアをインストールしやすくするために、rpm / deb パッケージを作りたい。

しかし、rpm / deb パッケージ化するためには、それぞれ CentOS(RedHat)、Debian(Ubuntu) 環境でパッケージ化することになる。 社内ではこれまでパッケージ化の専用ホストがいて、そこで spec ファイルや init スクリプトを置いて rpmbuild コマンドとか debuild コマンドを叩いてパッケージを作成していた。 さらに、アプリケーションエンジニアからインフラエンジニアに依頼するという形をとっていた。

この方法の問題点として、以下の3つがある。

  • spec ファイルや init スクリプトなどをプロジェクトの Git リポジトリで管理しづらい。つまり、レビューとかがやりにくい。
  • リリースフローを自動化しづらい。具体的には、リリースの度に専用ホストにログインして手でコマンド叩いてことになる。(社内リリース的なのは毎日やる)
  • 1台の専用ホストを複数人で共有することになるので、コンフリクトしやすい。

Docker で解決

rpm / deb パッケージを Docker コンテナ内で作成することにより、上記の問題点が解決できる。

  • spec ファイルや init スクリプトなどをプロジェクトの Git リポジトリで管理しづらい。つまり、レビューとかがやりにくい。

boot2docker とか Vagrant を使えば開発者の Mac でもビルドできるようになったので、いちいち専用ホストでファイル編集とかしなくてよくなった。 リポジトリ内で完結しているので、アプリケーションエンジニアでもインフラエンジニアでも、普通のアプリケーションと同じ間隔で、specファイルとか編集して、pullreq & レビューできる。

  • リリースフローを自動化しづらい。具体的には、リリースの度に専用ホストにログインして手でコマンド叩いてことになる。(社内リリース的なのは毎日やる)

Jenkins でテスト成功後に、同じジョブでパッケージビルドさせることで、明示的にパッケージ化するコストがなくなった。 さらに、テストが成功しているものだけパッケージ化されるので、変なリビジョンのコードがパッケージされてないか人間が確認しなくてよい。

  • 1台の専用ホストを複数人で共有することになるので、コンフリクトしやすい。

Docker コンテナという隔離環境を毎回作っては捨てるので作業がコンフリクトしない。コード的なコンフリクトはGitで解決できる。

ディレクトリ構成と Dockerfile

  • ディレクトリ構成 (rpm)
.
├── BUILD
│   └── mackerel-agent
├── Dockerfile
├── RPMS
│   └── noarch
├── SOURCES
│   ├── mackerel-agent.conf
│   ├── mackerel-agent.initd
│   ├── mackerel-agent.logrotate
│   └── mackerel-agent.sysconfig
├── SPECS
│   └── mackerel-agent.spec
└── SRPMS
  • ディレクトリ構成 (deb)
.
├── Dockerfile
└── debian
    ├── README.Debian
    ├── changelog
    ├── compat
    ├── control
    ├── copyright
    ├── docs
    ├── mackerel-agent
    ├── mackerel-agent.bin
    ├── mackerel-agent.conf
    ├── mackerel-agent.debhelper.log
    ├── mackerel-agent.default
    ├── mackerel-agent.initd
    ├── mackerel-agent.logrotate
    ├── rules
    └── source
        └── format
  • Dockerfile (rpm)
FROM centos
RUN yum update -y
RUN yum install -y rpmdevtools

RUN mkdir -p /rpmbuild
ADD ./ /rpmbuild/  # 上記のディレクトリをまとめてDockerコンテナ内に取り込む
RUN chown root:root -R /rpmbuild
CMD rpmbuild -ba /rpmbuild/SPECS/mackerel-agent.spec
  • Dockerfile (deb)
FROM tatsuru/debian
RUN apt-get update && apt-get install -yq --force-yes build-essential devscripts debhelper fakeroot --no-install-recommends

RUN mkdir -p /debuild/debian /deb
ADD ./debian /debuild/debian
RUN chown -R root:root /debuild
WORKDIR /debuild
CMD debuild --no-tgz-check -uc -us; mv ../*.deb /deb/

ディレクトリ構成と Dockerfile は上記のような感じで、

docker build -t 'hatena/mackerel/rpm-builder' .
docker run -t 'hatena/mackerel/rpm-builder' -v ./build/:/rpmbuild/RPMS/noarch:rw

とかやると、Docker のボリューム機能により、手元の build ディレクトリに rpm ファイルができる。 (Mac の場合は、ホストOS上のVM上でコンテナが動くので、VMのファイルシステムに設置される)。 これで、パッケージファイルの出来上がりで、こういうのをJenkinsにやらせてる。 Jenkins の成果物にしておくと、適当なところからダウンロードしやすくて便利。

思うところ

別に Docker である必要もなくて Vagrant 使ってもよい。 ただ、古いファイルとかが紛れ込まないように環境をどんどん使い捨てたいので、Vagrant よりは Docker のほうが起動が速いのでうれしさがある。 さらに、Jenkins サーバで Vagrant 動かすよりは Docker のほうがセットアップしやすい。

あと、Jenkins で何回も Docker コンテナを立てては殺す場合に、ゴミ掃除に気を使うことになる。 Docker 使ってたらサーバがゴミ捨て場みたいになってた話 #immutableinfra - ゆううきブログ

Dockerは、アプリケーションをコンテナで動作させるような Immutable Infrastructure 的なコンテキストで注目されてる。 しかし、今まで特別な環境でしかできなかったことを気軽に手元でできるようになったりするので、もっと幅広い使い道があると思う。 今回は Docker のおかげで、アプリエンジニアとインフラエンジニアで無駄なコミュニケーションコストが発生することなく、いい感じの開発フローができた。

なんか DevOps っぽい。

TODO

serverspec 的なもので、パッケージインストール後の状態を自動テストしたい。 さらに、agent 起動後の振る舞いテストとかまでできるとよい。