0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Amazon CloudWatch Network Flow Monitorを使ってみる (2) EKS環境での利用

0
Posted at

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. 構成図

image.png

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」を選択。

image.png

  • AWS Network Flow Monitor Agent を選択する。

image.png

image.png

  • Network Flow Monitor Agentのpodに付与するIAMロールを作成する。「Create Recommended Role」を選択。

image.png

  • そのままの設定でIAMロールを作成し、そのIAMロールをpodに付与するロールとして設定する。

image.png

image.png

  • アドオンとして追加された後、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」を選択。

image.png

  • EKS用VPC全体を対象としたモニターを作成する。

image.png

  • EKS用VPCのAZ-3aのサブネットを選択したモニターを作成する(同様にAZ-3bのものも作成)。

image.png

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頃は再送が発生している。

image.png

image.png

image.png

  • AZ-3aのモニター。VPC全体の半分のトラフィックが発生しているが、podが正常なため再送はなし。

image.png

image.png

image.png

  • AZ-3bのモニター。VPC全体の半分のトラフィックが発生しており、21:40頃はpodにパケロスがあるため、再送が大量に発生。

image.png

image.png

image.png

  • 今回の例だと、Network Flow Monitorのモニターを使って、「VPC全体で再送が増加」⇒「AZ-3a側では問題なし」⇒ 「AZ-3b側でのみ再送発生」⇒ 「AZ-3b側のNetwork health IndicatorはHealthyなのでAWS基盤の問題ではない」⇒ 「AZ-3b側のワーカーノードやpodなどの利用者側責任範囲の異常かな?」のように調査を進めていくことが考えられる。

5. 所感

  • 導入手順は、マネコンでアドオン追加するだけであり非常に容易だった。
  • 今回はパケロスを入れて再送を発生させることでメトリクスの違いを確認したが、このサービスを導入したことによりどういう監視レベル向上が図れるのかを考えていきたい。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?