Amazon EKS on AWS Fargateに対応したmackerel-container-agentのアルファ版を公開しました

こんにちは。SREの今井(id:hayajo_77)です。

現在ご提供しているmackerel-container-agentはKubernetesに対応しています。 Amazon EKSでももちろん利用できますが、先日のre:Inventで発表されたAmazon EKS on AWS Fargate(以降EKS on Fargate)では動作しません。

そこでEKS on Fargateに対応したmackerel-container-agentのアルファ版を公開しました。

こちらのDockerイメージをPodのサイドカーとしてデプロイしていただくことで従来のKubernetesと同様にPodを監視できます。

アルファ版としてのご提供となりますが、EKS on Fargateのご利用を検討されている場合はぜひお試しください。

EKS on Fargateでmackerel-container-agentを利用する

EKS on Fargateにmackerel-container-agentをデプロイするには、マニフェストに次の環境変数の定義が必要になります。

  • MACKEREL_APIKEY
    • MackerelオーガニゼーションのAPIキー
  • MACKEREL_CONTAINER_PLATFORM
    • "eks_fargate" (固定文字列)
  • MACKEREL_KUBERNETES_NODE_NAME
    • Podが動作するノードの名前(設定する値は下記のマニフェスト例を参照してください)
  • MACKEREL_KUBERNETES_NAMESPACE
    • PodのNamespace(設定する値は下記のマニフェスト例を参照してください)
  • MACKEREL_KUBERNETES_POD_NAME
    • Podの名前(設定する値は下記のマニフェスト例を参照してください)

またKubernetesのRole Based Access Control(RBAC)の設定も必要となります。 mackerel-container-agentが下記のリソースを参照できるようにEKSクラスタでClusterRole, ClusterRoleBinding, ServiceAccountを設定してください。

  • nodes/proxy (get)
  • nodes/stats (get)
  • nodes/spec (get)

以下はRedisとそれを監視するmackerel-container-agentサイドカーを定義したDeploymentのマニフェスト例です。 (FargateプロファイルでSelectorsに"default" Namespaceを指定していることを想定しています)

このマニフェストではMACKEREL_APIKEYをSecretsから取得するように定義しています。 事前につぎのコマンドを実行するなどしてSecretを作成してください(暗号化に関してはここでは触れません)。

kubectl create secret generic mackerel-container-agent -n default --from-literal "apikey=${MACKEREL_APIKEY}"

マニフェスト例(RBAC含む)です。

---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: mackerel-container-agent
rules:
  - apiGroups: [""]
    resources:
      - nodes/proxy
      - nodes/spec
      - nodes/stats
    verbs:
      - get

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mackerel-container-agent
  namespace: default

---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: mackerel-container-agent
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: mackerel-container-agent
subjects:
  - kind: ServiceAccount
    name: mackerel-container-agent
    namespace: default

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: mackerel-container-agent
  namespace: default
data:
  mackerel-container-agent.yaml: |
    plugin:
      metrics:
        redis:
          command: mackerel-plugin-redis -port=6379 -timeout=5 -metric-key-prefix=redis6379

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: eks-fargate-mackerel-container-agent
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: redis
  strategy: {}
  template:
    metadata:
      labels:
        app: redis
    spec:
      serviceAccountName: mackerel-container-agent
      containers:
        - name: redis
          image: "redis:latest"
          imagePullPolicy: Always
          resources:
            limits:
              memory: 64Mi
              cpu: 100m
        - name: mackerel-container-agent
          image: "mackerel/mackerel-container-agent:v0.3.0-plugins-alpha"
          imagePullPolicy: Always
          volumeMounts:
            - name: mackerel-container-agent
              mountPath: "/etc/mackerel"
          env:
            - name: MACKEREL_APIKEY
              valueFrom:
                secretKeyRef:
                  name: mackerel-container-agent
                  key: apikey
            - name: MACKEREL_CONTAINER_PLATFORM
              value: "eks_fargate"
            - name: MACKEREL_KUBERNETES_NODE_NAME
              valueFrom:
                fieldRef:
                  fieldPath: spec.nodeName
            - name: MACKEREL_KUBERNETES_NAMESPACE
              valueFrom:
                fieldRef:
                  fieldPath: metadata.namespace
            - name: MACKEREL_KUBERNETES_POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: MACKEREL_ROLES
              value: "eks-fargate:mackerel-container-agent"
            - name: MACKEREL_AGENT_CONFIG
              value: "/etc/mackerel/mackerel-container-agent.yaml"
          resources:
            limits:
              memory: 64Mi
              cpu: 100m
      volumes:
        - name: mackerel-container-agent
          configMap:
            name: mackerel-container-agent

利用に関する注意事項

  • アルファ版としての提供となります。予告なく仕様を変更する場合があります。
  • 従来のKubernetes同様、1つのPodに対して1マイクロホストがMackerelに登録されます。有料プランの場合は課金が発生しますのでご注意ください。詳しくはFAQ・ホスト数の計算方法についてをご覧ください。