1. はじめに
AWS内のリソース間の通信状況をモニターできる「Amazon CloudWatch Network Flow Monitor」というサービスが2024/12にリリースされ、前回の記事「Amazon CloudWatch Network Flow Monitorを使ってみる」でEC2インスタンス用エージェント版の簡単な評価を行った。
今回は、EKS版(DeamonSetとしてエージェントが起動)の導入手順、および使用感を確認する。
2. やったこと
- 素のEKSクラスターを用意する。
- Network Flow Monitor (EKS用)のアドオンを追加する。
- Network Flow Monitorのモニターを設定する。
- EKS内に起動したnginx podに対して外部からアクセスし、Network Flow Monitorのメトリクスが取れることを確認する。
- nginx podの1つにパケロスを入れて、Network Flow Monitorのメトリクスが変化することを確認する。
3. 構成図
4. 設定手順
4.1 事前環境構築
EKSクラスターの構築
- 検証を行うためのVPCおよびEKSクラスターを構築する(手順は省略)。
- 今回はマネコンを用いて、設定値はほぼデフォルトで構築する。k8sバージョンは1.33。
- ノードグループとして、t3.mediumのワーカーノードを2台用意。
- アドオン「Amazon EKS Pod Identity Agent」を追加(Network Flow Monitorのために必要。デフォルトで自動で追加される)。
- 環境構築後のpodの起動状況は以下。
[ec2-user@ip-10-0-0-60 mysample]$ kubectl get pod -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
external-dns external-dns-754cf78755-ks8nc 1/1 Running 0 19h 10.0.10.131 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system aws-node-bwshx 2/2 Running 0 19h 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
kube-system aws-node-ckvdl 2/2 Running 0 19h 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system coredns-bdbfddcf5-54sbq 1/1 Running 0 19h 10.0.10.13 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system coredns-bdbfddcf5-zvdr9 1/1 Running 0 19h 10.0.10.115 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system eks-node-monitoring-agent-ltzc9 1/1 Running 0 19h 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system eks-node-monitoring-agent-nckx7 1/1 Running 0 19h 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
kube-system eks-pod-identity-agent-jz6kc 1/1 Running 0 19h 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
kube-system eks-pod-identity-agent-khq8q 1/1 Running 0 19h 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system kube-proxy-569w9 1/1 Running 0 19h 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system kube-proxy-cm94v 1/1 Running 0 19h 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
kube-system metrics-server-fdccf8449-2b2sj 1/1 Running 0 19h 10.0.10.110 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system metrics-server-fdccf8449-5584h 1/1 Running 0 19h 10.0.10.55 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
4.2 Network Flow Monitor アドオンの追加
Network Flow Monitorのアドオンをマネコンを用いて追加する。公式手順は「Install the EKS AWS Network Flow Monitor Agent add-on」。
- 構築済のEKSクラスターのAdd-onsのところから、「Get more add-ons」を選択。
- AWS Network Flow Monitor Agent を選択する。
- Network Flow Monitor Agentのpodに付与するIAMロールを作成する。「Create Recommended Role」を選択。
- そのままの設定でIAMロールを作成し、そのIAMロールをpodに付与するロールとして設定する。
- アドオンとして追加された後、daemonsetとして稼働していることを確認する。
[ec2-user@ip-10-0-0-60 mysample]$ kubectl get daemonsets -A
NAMESPACE NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
amazon-network-flow-monitor aws-network-flow-monitor-agent 2 2 2 2 2 kubernetes.io/os=linux 75s
kube-system aws-node 2 2 2 2 2 <none> 19h
kube-system dcgm-server 0 0 0 0 0 kubernetes.io/os=linux 19h
kube-system eks-node-monitoring-agent 2 2 2 2 2 kubernetes.io/os=linux 19h
kube-system eks-pod-identity-agent 2 2 2 2 2 <none> 19h
kube-system kube-proxy 2 2 2 2 2 <none> 19h
[ec2-user@ip-10-0-0-60 mysample]$ kubectl get pod -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
amazon-network-flow-monitor aws-network-flow-monitor-agent-7v24v 1/1 Running 0 64s 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
amazon-network-flow-monitor aws-network-flow-monitor-agent-rpqr6 1/1 Running 0 64s 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
external-dns external-dns-754cf78755-ks8nc 1/1 Running 0 20h 10.0.10.131 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system aws-node-bwshx 2/2 Running 0 19h 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
kube-system aws-node-ckvdl 2/2 Running 0 19h 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system coredns-bdbfddcf5-54sbq 1/1 Running 0 20h 10.0.10.13 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system coredns-bdbfddcf5-zvdr9 1/1 Running 0 20h 10.0.10.115 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system eks-node-monitoring-agent-ltzc9 1/1 Running 0 19h 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system eks-node-monitoring-agent-nckx7 1/1 Running 0 19h 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
kube-system eks-pod-identity-agent-jz6kc 1/1 Running 0 19h 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
kube-system eks-pod-identity-agent-khq8q 1/1 Running 0 19h 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system kube-proxy-569w9 1/1 Running 0 19h 10.0.10.159 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system kube-proxy-cm94v 1/1 Running 0 19h 10.0.11.7 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
kube-system metrics-server-fdccf8449-2b2sj 1/1 Running 0 20h 10.0.10.110 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
kube-system metrics-server-fdccf8449-5584h 1/1 Running 0 20h 10.0.10.55 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
4.3 Network Flow Monitor モニターの設定
VPC全体、VPCのAZ-3a側、VPCのAZ-3b側、の3つのモニターを作成する。
- CloudWatch - Flow Monitors から、「Create Monitor」を選択。
- EKS用VPC全体を対象としたモニターを作成する。
- EKS用VPCのAZ-3aのサブネットを選択したモニターを作成する(同様にAZ-3bのものも作成)。
4.4 nginx の準備
tcありnginxの準備
- 後でpodにパケロスを挿入するため、tcコマンドが使えるnginxコンテナイメージを用意し、ECRに登録しておく(手順は省略)。Dockerfileは以下。
# ベースイメージとしてnginxの公式イメージを使用
FROM nginx:alpine
# tcコマンドを含むiproute2パッケージをインストール
RUN apk update && apk add iproute2
# コンテナ起動時にnginxを起動
CMD ["nginx", "-g", "daemon off;"]
nginxのデプロイ
- 2つのワーカーノードに1つずつpodが乗るようにnginxをデプロイし、httpポートを外部に公開する。
- tcコマンドを実行するためにNET_ADMIN権限の追加が必要。
- 同じワーカーノードにpodが2つ起動しないようにAntiAffinityを設定。
mynginx-with-tc.yaml
kind: Deployment
metadata:
name: mynginx-with-tc-deployment
spec:
replicas: 2
selector:
matchLabels:
app: mynginx-with-tc
template:
metadata:
labels:
app: mynginx-with-tc
spec:
containers:
- name: mynginx-with-tc-container
image: xxxxxxxxxxxx.dkr.ecr.ap-northeast-3.amazonaws.com/mksamba/mynginx-with-tc-repo:latest
ports:
- containerPort: 80
securityContext:
capabilities:
add: ["NET_ADMIN"]
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- mynginx-with-tc
topologyKey: "kubernetes.io/hostname"
---
apiVersion: v1
kind: Service
metadata:
name: mynginx-with-tc-service
annotations:
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
type: LoadBalancer
selector:
app: mynginx-with-tc
ports:
- protocol: TCP
port: 80
targetPort: 80
- 各ワーカーノードにpodが起動していることを確認する。
[ec2-user@ip-10-0-0-60 mysample]$ kubectl apply -f mynginx-with-tc.yaml
deployment.apps/mynginx-with-tc-deployment created
service/mynginx-with-tc-service created
[ec2-user@ip-10-0-0-60 mysample]$ kubectl get pod -A -o wide | grep nginx
default mynginx-with-tc-deployment-68cb4fff79-qjw9q 1/1 Running 0 71s 10.0.10.8 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
default mynginx-with-tc-deployment-68cb4fff79-tfc8s 1/1 Running 0 71s 10.0.11.191 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
4.5 外部クライアントからnginxへのアクセス
curl で 10000回程度、CLB経由でnginxへアクセスする。CLBで2つのpodにトラフィックが分散される。
repeat-curl.sh
#!/bin/bash
# ターゲットURLを指定
URL="http://xxxxxxxxxx.ap-northeast-3.elb.amazonaws.com"
# ループ
for ((i=1; i<=10000; i++))
do
echo "Request #$i"
curl -o /dev/null -s -w "%{http_code}\n" "$URL"
done
4.6 nginxにパケロスを挿入
片方(AZ-3b)のpodのみに3%のパケロスを挿入する。
# 設定を入れるpod名を特定
[ec2-user@ip-10-0-0-60 ~]$ kubectl get pod -A -o wide |grep mynginx
default mynginx-with-tc-deployment-68cb4fff79-qjw9q 1/1 Running 0 27m 10.0.10.8 ip-10-0-10-159.ap-northeast-3.compute.internal <none> <none>
default mynginx-with-tc-deployment-68cb4fff79-tfc8s 1/1 Running 0 27m 10.0.11.191 ip-10-0-11-7.ap-northeast-3.compute.internal <none> <none>
# AZ-3b側のpodにパケロスを挿入
[ec2-user@ip-10-0-0-60 ~]$ kubectl exec -it mynginx-with-tc-deployment-68cb4fff79-tfc8s -- tc qdisc add dev eth0 root netem loss 3%
# (参考) パケロス設定を元に戻すコマンド
[ec2-user@ip-10-0-0-60 ~]$ kubectl exec -it mynginx-with-tc-deployment-68cb4fff79-tfc8s -- tc qdisc del dev eth0 root
4.7 Network Flow Monitor モニターの確認
通常時、および片方のpodにパケロス挿入時のモニターの値を確認する。
21:20頃が通常時、21:40頃がパケロス挿入時のトラフィック。
- VPC全体のモニター。21:40頃は再送が発生している。
- AZ-3aのモニター。VPC全体の半分のトラフィックが発生しているが、podが正常なため再送はなし。
- AZ-3bのモニター。VPC全体の半分のトラフィックが発生しており、21:40頃はpodにパケロスがあるため、再送が大量に発生。
- 今回の例だと、Network Flow Monitorのモニターを使って、「VPC全体で再送が増加」⇒「AZ-3a側では問題なし」⇒ 「AZ-3b側でのみ再送発生」⇒ 「AZ-3b側のNetwork health IndicatorはHealthyなのでAWS基盤の問題ではない」⇒ 「AZ-3b側のワーカーノードやpodなどの利用者側責任範囲の異常かな?」のように調査を進めていくことが考えられる。
5. 所感
- 導入手順は、マネコンでアドオン追加するだけであり非常に容易だった。
- 今回はパケロスを入れて再送を発生させることでメトリクスの違いを確認したが、このサービスを導入したことによりどういう監視レベル向上が図れるのかを考えていきたい。


















