My Note

自己理解のためのブログ

Amazon EKS on EC2 で mackerel-container-agentを使ってPodを監視する

はじめに

今回は EKS on EC2の環境においてmackerelを使ってPod監視した方法について書いていきます。 本ブログの前提ですが、EKSのクラスターとワーカーノードが用意されている状態で進めていきます。では早速本題に!

今回の監視で利用する mackerel-container-agent については↓のMackerel公式ブログについてまとめられています。

mackerel.io

まずは、mackerel-container-agent を動かすための環境を構築していきます。構築する環境はnginxコンテナとサイドカーにmackerel-container-agentが動くPodを作成します。 Manifestの管理ツールには kustomize を利用します。

  • 検証環境のバージョン

環境構築

マニフェストを作成

.
├── common
│   ├── kustomization.yaml
│   ├── mackerel-rbac.yaml
│   ├── mackerel-serviceaccount.yaml
│   └── secret-mackerel-apikey.yaml
└── nginx
    ├── configmap-mackerel.yaml
    ├── deployment.yaml
    ├── kustomization.yaml
    └── service.yaml

commonディレクトリについて

ServiceAccount , ClusterRoleBinding, Secret のmanifestをそれぞれ作成します。

ServiceAccountClusterRoleBindingマニフェストの作成は↓のMackerel公式ブログを参考にしています。

mackerel.io

  • kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - mackerel-rbac.yaml
  - mackerel-serviceaccount.yaml
  - secret-mackerel-apikey.yaml
  • $ kubectl kustomize . ( manifest全体 )
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mackerel-serviceaccount
  namespace: default
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: mackerel-container-agent-clusterrole
rules:
- apiGroups:
  - ""
  resources:
  - nodes/proxy
  - nodes/stats
  - nodes/spec
  verbs:
  - get
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: mackerel-clusterrolebinding
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: mackerel-container-agent-clusterrole
subjects:
- kind: ServiceAccount
  name: mackerel-serviceaccount
  namespace: default
---
apiVersion: v1
data:
  MACKEREL_APIKEY: <base64エンコードした値>
kind: Secret
metadata:
  name: mackerel-apikey
type: Opaque

kustomizeでmanifestを適用する。 $ kubectl apply -k . コマンドを実行。

MACKEREL_APIKEY の中身はbase64だとデコードできてしまうので、ブログ上では <base64エンコードした値> としています。

ServiceAccountとClusterRoleBindingについて

mackerel-container-agentがKubernetesクラスタからメトリクスを取得するために ServiceAccountとClusterRoleBinding を設定する必要があります。

  • mackerel公式ブログより

    kubeletで認証が有効な場合には、mackerel-container-agentがこれらのリソースを参照できるよう、ServiceAccountに対してRoleを設定する必要となります。

$ kubectl get sa | grep mackerel
mackerel-serviceaccount   1         8d

$ kubectl get clusterrole.rbac | grep mackerel
mackerel-container-agent-clusterrole

$ kubectl get clusterrolebinding.rbac | grep mackerel
mackerel-clusterrolebinding

nginxディレクトリについて

  • kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization

resources:
  - deployment.yaml
  - service.yaml
  - configmap-mackerel.yaml

ConfigMap, Service, Deployment のmanifestを作成します。

  • $ kubectl kustomize . ( manifest全体 )
apiVersion: v1
data:
  mackerel.yaml: |-
    plugin:
      checks:
        tcp:
          command: "check-tcp --hostname=localhost --port=80 --warning=5"

    readinessProbe:
      tcp:
        port: 80
kind: ConfigMap
metadata:
  name: mackerel-container-agent
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-test
spec:
  ports:
  - nodePort: 31080
    port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-test
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-test
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      containers:
      - image: nginx:latest
        name: nginx
        ports:
        - containerPort: 80
      - env:
        - name: MACKEREL_KUBERNETES_KUBELET_READ_ONLY_PORT
          value: "0"
        - name: MACKEREL_CONTAINER_PLATFORM
          value: kubernetes
        - name: MACKEREL_APIKEY
          valueFrom:
            secretKeyRef:
              key: MACKEREL_APIKEY
              name: mackerel-apikey
        - name: MACKEREL_ROLES
          value: dev:web
        - name: MACKEREL_AGENT_CONFIG
          value: /etc/mackerel/mackerel.yaml
        - 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
        image: mackerel/mackerel-container-agent:plugins
        imagePullPolicy: Always
        name: mackerel-container-agent
        resources:
          limits:
            memory: 128Mi
        volumeMounts:
        - mountPath: /etc/mackerel/
          name: mackerel-agent-volume
      serviceAccountName: mackerel-serviceaccount
      volumes:
      - configMap:
          name: mackerel-container-agent
        name: mackerel-agent-volume

ConfigMapについて ( pluginを利用した監視設定 )

agentのconfをConfigMapで作成します。80番ポートをcheck-tcpを利用します。 readinessProbe でportチェックOKだったらhostsに登録される設定をしています。

pluginの使い方の説明は↓のブログ記事に記載されています。 mackerel.io

apiVersion: v1
data:
  mackerel.yaml: |-
    plugin:
      checks:
        tcp:
          command: "check-tcp --hostname=localhost --port=80 --warning=5"

    readinessProbe:
      tcp:
        port: 80
kind: ConfigMap
metadata:
  name: mackerel-container-agent

mackerelの公式プラグインが同梱されているコンテナイメージは mackerelの公式イメージとしてDockerHubで公開されています。

  • プラグインを利用する場合の Dockerイメージ
    • mackerel/mackerel-container-agent:plugins
  • プラグインを利用しない場合のDockerイメージ
    • mackerel/mackerel-container-agent:latest

Docker Hub

Deploymentについて

Deploymentのマニフェストを作成するために、mackerel-container-agentをセットアップする必要があります。 そこで、↓の公式ブログを参照しました。

mackerel.io

  • deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-test
spec:
  selector:
    matchLabels:
      app: nginx-test
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx-test
    spec:
      serviceAccountName: mackerel-serviceaccount # mackerelで必要な serviceAccountNameを指定
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80
        - name: mackerel-container-agent
#          image: mackerel/mackerel-container-agent:latest # コンテナリソースだけ監視する場合はこのイメージ
          image: mackerel/mackerel-container-agent:plugins # pluginを利用して監視する場合はこのイメージ
          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
              valueFrom: # 登録したSecretからAPI-Keyを参照する
                secretKeyRef:
                  name: mackerel-apikey
                  key: MACKEREL_APIKEY
            - name: MACKEREL_ROLES # 管理コンソールで定義しているRoleを指定。 `サービス名 : ロール名`
              value: dev:web
            - name: MACKEREL_AGENT_CONFIG # mackerel-container-agentのconfを指定する
              value: /etc/mackerel/mackerel.yaml
            - 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
          volumeMounts: # mackerel-container-agentのconfを適用するために volumeMountsとvolumesを定義
            - name: mackerel-agent-volume
              mountPath: /etc/mackerel/
      volumes:
        - name: mackerel-agent-volume
          configMap:
            name: mackerel-container-agent

kustomizeでmanifestを適用する。 $ kubectl apply -k . コマンドを実行。

Mackerelの管理画面 ( モニタリング結果 )

Pod名でMackerel管理画面のHostsに追加された!

  • $ kubectl get po | grep nginx
nginx-test-6bfdcff679-4n7rz   2/2     Running   0          7h26m

f:id:yhidetoshi:20200126165048p:plain