LoginSignup
4

More than 5 years have passed since last update.

mackerel-agent on kubernetesでホスト名をいい感じに設定する

Posted at

kubernetesでのモニタリングはprometheusが定番と思いますが、grafana等を自前で用意する必要がある為、運用負荷となると思います。このあたりを楽したいので私はmackerelを利用しています。

k8s環境で各ノードのメトリクスをmackerelに集約するためには、mackerel-agentをDaemonSetで起動しました。DaemonSetで起動するまでは良かったのですが、ホスト名の自由がなく、使いづらかったので共有したいと思います。

ホスト名がDaemonSetのnameに連動する

DaemonSetでmackerel-agentをdeployするk8s manifestを単純に作成すると、以下のようになります。

mackerel.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: mackerel-agent
  namespace: kube-system
  labels:
    app: mackerel-agent
spec:
  tolerations: # masterにもmackerel-agentをdeployする設定
  - operator: Exists
    effect: NoSchedule
  - operator: Exists
    effect: NoExecute
  - operator: Exists
  selector:
    matchLabels:
      name: mackerel-agent
  template:
    metadata:
      labels:
        name: mackerel-agent
    spec:
      containers:
      - name: mackerel-agent
        image: mackerel/mackerel-agent:latest
...

このmanifestでDaemonSetを起動して、podを確認します。

$ kubectl get pods -n kube-system
NAME                                                                       READY     STATUS    RESTARTS   AGE
mackerel-agent-jqp9n                                                       1/1       Running   0          5s
mackerel-agent-kqf7d                                                       1/1       Running   0          5s
mackerel-agent-xcqdc                                                       1/1       Running   0          5s
...

上記の通り、pod名は、DaemonSetのnameをprefixとした mackerel-agent-* という名前になっていると思います。
そしてこのとき、mackerelでHostsを確認すると、HOST NAMEにpod名が付与されていることが確認できます。

Screen Shot 2018-06-04 at 11.24.55.png

これでは、どのホストのことなのかサッパリで、運用する上で不便だと思います。
ただ、ホスト名を設定するために、DaemonSetのメタデータであるnameを変えるのはちょっと。。

hostnameをつける

manifestでhostnameをつけることができます。

mackerel.yaml
...
spec:
  tolerations: # masterにもmackerel-agentをdeployする設定
  - operator: Exists
    effect: NoSchedule
  - operator: Exists
    effect: NoExecute
  - operator: Exists
  selector:
    matchLabels:
      name: mackerel-agent
  template:
    metadata:
      labels:
        name: mackerel-agent
    spec:
      hostname: hogehoge # **ホスト名をつける**
      containers:
      - name: mackerel-agent
        image: mackerel/mackerel-agent:latest
...

このときpod名の命名規則は変更ありません。

$ kubectl -n kube-system get pods
NAME                                                                       READY     STATUS    RESTARTS   AGE
mackerel-agent-5pmv5                                                       1/1       Running   0          8s
mackerel-agent-hwgn6                                                       1/1       Running   0          8s
mackerel-agent-shcnv                                                       1/1       Running   0          8s

hostnameを与えた場合でmackerelをみると、ホスト名が設定されています。

Screen Shot 2018-06-04 at 11.39.27.png

hostnameを使えば任意のホスト名を付与できました。

テンプレート化する

hostnameを使えば、任意のホスト名を付与できることが分かったのですが、stagingやproductionといった異なる環境で、mackerelのservice/roleを使いまわす場合に hogehoge-production, hogehoge-staging みたいなホスト名にしたいです。

このため、helmを使ってテンプレート化し、パラメータとして与えるようにします。
(このためだけにhelmを使うのがなんとなく嫌ですが、manifestでは変数をかけないので。。)

mackerel-agent/templates/mackerel-agent.yaml
...
      hostname: hogehoge-{{ .Values.env }}
...

helm template でmanifestを作成

$ helm template --set env=staging mackerel-agent > mackerel-agent.yaml

出力されたmanifestでは hostname: hogehoge-staging となっています。

更にやりたいこと

ホスト名をもっと色々表示してほしいので整理します。

  1. service名をprefixとしてつけたい(できた)
    • hogehoge-*
  2. 環境名(production/staging)をホスト名に含めたい (できた)
    • 環境間はservice/roleを共有したい
  3. masterかnodeかをホスト名に含めたい (できてない)
    • kubernetesのロールをホスト名で見分けたい
  4. pod毎のsuffixをつけてほしい (できてない)
    • どのnodeなのかをホスト名に付与したい

1~4を総合すると、 hogehoge-production-master-<node名> みたいなホスト名にしたいです。

今回できてない3・4は、deploy時に確定する情報なので、manifestやhelmで頑張るのは厳しそうです。
こうなってくると、deploy後にホスト名を設定するように変更して、mkrするscriptを書くしかないかもしれません。

mackerelへの期待

mackerelとkubectlで得られる情報を付き合わせるの運用はやめたいです。mackerel-agentからkube-apiserver叩いて勝手にノードの情報とってきてくれないかな?(あとslack通知にもその情報出したい)

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4