はじめに
EKS is これ
で最近 EKS を触ってアレコレしてるんだけどそのアレコレの一つで mackerel-container-agent 導入してメトリクスを収集するというのがあった。
僕が所属している GMO ペパボでは mackerel をかなり使っていて mackerel 上で一括して見られると便利なので入れた。
EKS なら CloudWatch とかでも取れるのかもしれないけれど、僕がやっている minne というサービスは OpenStack と AWS のハイブリッドなので mackerel に集約されるのが便利なのでした。
導入する
だいたい下記に書いてある。
上記のマニフェスト例にあるように下記のような yaml を用意する
apiVersion: v1 kind: Pod metadata: name: myapp labels: app: myapp spec: serviceAccouontName: sample-serviceaccount containers: # ... - name: mackerel-container-agent image: mackerel/mackerel-container-agent:latest imagePullPolicy: Always resources: limits: memory: 128Mi env: - name: MACKEREL_KUBERNETES_KUBELET_READ_ONLY_PORT value: "0" - name: MACKEREL_CONTAINER_PLATFORM value: kubernetes - name: MACKEREL_APIKEY value: <Mackerel APIKey> - name: MACKEREL_KUBERNETES_KUBELET_HOST valueFrom: fieldRef: fieldPath: status.hostIP - name: MACKEREL_KUBERNETES_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: MACKEREL_KUBERNETES_POD_NAME valueFrom: fieldRef: fieldPath: metadata.name
EKS で ここ に書いてある AMI を使用すると --read-only-port が無効な状態になっているので MACKEREL_KUBERNETES_KUBELET_READ_ONLY_PORT を指定する必要がある。(他にも --read-only-port を有効にして AMI を作成することも可能で https://github.com/awslabs/amazon-eks-ami の issue を漁れば方法がわかるかと)
また、後述する serviceAccountName も設定しておく。
次に RBAC を設定する。
mackerel の document の RBACの設定例をそのまま適応した後に下記の ServiceAccount の yaml を作成し apply する
apiVersion: v1 kind: ServiceAccount metadata: name: sample-serviceaccount
これで監視ができるようになります。
最後に
RBAC も MACKEREL_KUBERNETES_KUBELET_READ_ONLY_PORT の指定もしてるのにうまく動かんので EKS に対応してないのか?と思い twitter で呟いたところ中の人から助言を頂き感謝です。
mackerel-container-agent は EKS 対応していないのか?
— shiro16 (@_shiro16) April 16, 2019
結局 deployment で serviceAccouontName を指定してなかっただけっていう落ちだったのですが...