この記事は、CyberAgent Group SRE Advent Calendar 2023の16日目の記事です。
はじめに
技術本部 サービスリライアビリティグループ(SRG)の石川 雲(@kumo_rn5s)です。
SRG(Service Reliability Group)は、主に弊社メディアサービスのインフラ周りを横断的にサポートしており、既存サービスの改善や新規立ち上げ、OSS貢献などを行っているグループです。
SRGでは以前から技術記事を執筆していますが、Google検索での最適化を施していないため、あまり知られていないようです。より多くの方に当社の記事を読んでいただくために、本記事の主要部分をSRGのサイトで是非ご覧ください。
この記事では、VPCCNIアドオンの動作と原理を解説し、Security Groups for Pod(SGP)を使用した際の注意点について説明します。また、2020年から発生し始めた「add cmd: failed to assign an IP address to container」というエラーに関して、ソースコードレベルの説明と分析を行う内容となっています。
AWS VPCアドオン
AWS VPC CNIは、EKSのネットワーキング構成において中心的な役割を果たしており、AWS VPCとネイティブな連携することで、EKS上でのネットワーク管理を効率化しています。
AWS VPC CNIは以下のコンポーネントによって構成されています。
-
CNI Plugin
CNIの仕様に沿って、gRPCでIPAMDと通信してIPを取得し、ネットワーク設定を行う
-
IPAMD Plugin
各NodeにおいてAWS ENIを管理し、迅速なPod起動のためにIPアドレスの事前付与を行う
それぞれの関係はProposalに示された図に基づいています(実際に呼ばれる名前と若干違います)。
仕組み
VPC CNIは、PodのIP割り当てとネットワークルーティングの機能を主に提供しています。
-
PodのIP割り当て
PodへのIPアドレス割り当ては、EC2 ENIとIPAMDを使用して行われます。一般的なフローは以下のようになります。
-
ネットワークルーティング
Pod間やPodから外部へのネットワークルーティングは、複数のルーティングテーブルとIPTABLEを使用して構成されています。その使い分けは以下の通りです。
-
Pod ↔ 外部ネットワーク: IPTABLE
通常のSNATのように、パケットが仮想ネットワークインターフェース(veth)とEC2 ENI(ethなど)を通過する際に実行されます。
-
Pod ↔ Pod: ルーティングテーブル
Pod間の通信やPodから外部への通信は、主にvethとethなどを介して行われ、さまざまなルーティングテーブルが暗黙的に適用されます。
-
ライフサイクル
VPCCNIのバイナリは、主に7種類があります
Binary | 説明 |
---|---|
aws-k8s-agent | IPAMDのgRPCサーバ |
aws-cni | CNI Pluginの実装、主にVPC内ENI/IPとLinux Networkなどの設定を管理する |
grpc-health-probe | IPAMD向けヘルスプローブの確認ツール |
cni-metrics-helper | メトリクスを収集し、CloudWatchへPutMetricsするサポートツール |
aws-vpc-cni-init | (initContainer)システムパラメータ、IPV6、各バイナリファイルの複製など、前提条件が整っていることを保証するための初期化コンポーネント |
aws-vpc-cni | 過去ではentrypoint.shとして存在し、現在はIPAMDの起動とライフサイクル管理を行うツール |
egress-cni | CNI Pluginの実装、主にSNATを使用して、アウトバウンドトラフィックのための特定のルーティングルールやポリシーを管理する |
aws-vpc-cni
: 過去では、entrypoint.sh
によって起動の順番などを制御していましたが、1.11以降にバイナリファイルの制御は主にGoファイルによって行われます。
......
IPADMとadd cmd
エラーについて
残りの内容については、ぜひSRGのサイトでご確認ください。