Amazon EKS on EC2 で mackerel-container-agentを使ってPodを監視する
はじめに
今回は EKS on EC2の環境においてmackerelを使ってPod監視した方法について書いていきます。 本ブログの前提ですが、EKSのクラスターとワーカーノードが用意されている状態で進めていきます。では早速本題に!
今回の監視で利用する mackerel-container-agent
については↓のMackerel公式ブログについてまとめられています。
まずは、mackerel-container-agent
を動かすための環境を構築していきます。構築する環境はnginxコンテナとサイドカーにmackerel-container-agentが動くPodを作成します。
Manifestの管理ツールには kustomize
を利用します。
- 検証環境のバージョン
- AWS EKS: Kubernetes バージョン( 1.14 )
- kubectl: v1.14.8
環境構築
マニフェストを作成
. ├── 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をそれぞれ作成します。
ServiceAccount
とClusterRoleBinding
のマニフェストの作成は↓のMackerel公式ブログを参考にしています。
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
Deploymentについて
Deploymentのマニフェストを作成するために、mackerel-container-agentをセットアップする必要があります。 そこで、↓の公式ブログを参照しました。
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