Open11
amazon-vpc-cni-k8s
ピン留めされたアイテム
cni-metrics-helper
- https://github.com/aws/amazon-vpc-cni-k8s/tree/v1.20.1/charts/cni-metrics-helper
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/scripts/dockerfiles/Dockerfile.metrics
概要
- https://github.com/aws/amazon-vpc-cni-k8s/tree/v1.20.1/cmd/cni-metrics-helper
- API Serverの
/api/v1/namespaces/{namespace}/pods/{podName}:{port}/proxy/metrics
のエンドポイントを使って 各CNI PodのCNIコンテナ(k8s-app: aws-node
なPodのcontainerPort: 61678
の/metrics
)からメトリクスデータを収集 - 収集データをCloud Watchに定期的に送ったり、cni-metrics-helper自体がPrometheusサーバーとしてデータを公開したりする
実装
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/main.go - メインファイル
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/main.go#L62-L151 - 前処理
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/main.go#L155-L163 - Cloud Watchに定期的にデータを送るサーバーを起動
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/main.go#L165-L168 - prometheus serverを起動
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/main.go#L170-L178 - 各Podから定期的にメトリクスを取得する処理を開始
個別のピックアップ実装
メトリクス取得
-
https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L449 - メトリクス更新処理
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L403-L404 - 保存対象メトリクスのフィルタリング用データ取得(固定値)
-
https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L406-L407 - 対象Pod一覧を取得(
k8s-app: aws-node
なPod一覧を取得) -
https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L408 - for loop
-
https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L409 - 対象Podのデータを取得(API Serverの
/api/v1/namespaces/{namespace}/pods/{podName}:{port}/proxy/metrics
のエンドポイントを使って対象PodのcontainerPort: 61678
の/metrics
からメトリクスデータを収集) - https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L415-L436 - 必要データをフィルタリング
-
https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L409 - 対象Podのデータを取得(API Serverの
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L455-L458 - Cloud Watch用のデータをローカルに保存
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/cni-metrics-helper/metrics/metrics.go#L460-L462 - Prometheusのメトリクスをアップデート
Cloud Watchへのデータ送信
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/pkg/publisher/publisher.go#L91-L143 - 初期化
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/pkg/publisher/publisher.go#L145-L150 - ループ処理開始
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/pkg/publisher/publisher.go#L174-L180 - データ送信処理
aws-vpc-cni(chart)
- https://github.com/aws/amazon-vpc-cni-k8s/tree/master/charts/aws-vpc-cni#adopting-the-existing-aws-node-resources-in-an-eks-cluster
- 利用イメージ
- initContainer
- initImage: amazon-k8s-cni-init - https://github.com/aws/amazon-vpc-cni-k8s/tree/v1.20.1/cmd/aws-vpc-cni-init
- main containers:
- image: amazon-k8s-cni - https://github.com/aws/amazon-vpc-cni-k8s/tree/v1.20.1/cmd/aws-vpc-cni
- nodeAgentImage: amazon/aws-network-policy-agent - https://github.com/aws/aws-network-policy-agent 別リポジトリ
- initContainer
ドキュメント
CRD
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/charts/aws-vpc-cni/crds/customresourcedefinition.yaml
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/cni-custom-network-tutorial.html
- https://simyung.github.io/aws-eks-best-practices/networking/custom-networking/
- リソース一覧
- ENIConfig
- PolicyEndpoint
その他のバイナリ?
- https://github.com/aws/amazon-vpc-cni-k8s/tree/v1.20.1/cmd/egress-cni-plugin
- https://github.com/aws/amazon-vpc-cni-k8s/tree/v1.20.1/cmd/grpc-health-probe
- https://github.com/aws/amazon-vpc-cni-k8s/tree/v1.20.1/cmd/routed-eni-cni-plugin
Dockerfile
aws-vpc-cni-init
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/scripts/dockerfiles/Dockerfile.init
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/Makefile#L291-L307
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/Makefile#L309-L320
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/Makefile#L150-L153
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni-init/main.go
要約
下記2つを行うinit container
- https://github.com/containernetworking/plugins のプラグインバイナリ群をホストマシンにインストール
- カーネルパラメータを設定
実装
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni-init/main.go#L151-L160 - CNIプラグインバイナリをホスト側にインストール(下記でインストールした https://github.com/containernetworking/plugins のプラグインバイナリ群)
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni-init/main.go#L162-L168 - metadata serverから取得した情報を元にプライマリなネットワークインターフェイスを取得
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni-init/main.go#L170-L183 - ホスト側のカーネル設定を行って処理終了
aws-vpc-cni
- https://github.com/aws/amazon-vpc-cni-k8s/tree/v1.20.1/cmd/aws-vpc-cni
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/scripts/dockerfiles/Dockerfile.release
実装
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni/main.go#L424-L430 - aws-cni, egress-cniという2つの独自のプラグインをインストール
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni/main.go#L432-L445 - aws-k8s-agent(L-IPAMD)コマンドをバックグラウンドで実行開始
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni/main.go#L447-L451 - grpc-health-probe コマンドを実行して、aws-k8s-agentのgRPCサーバーが正常に立ち上がるまで待機
-
https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni/main.go#L453-L466 - 設定ファイルを
/app/10-aws.conflist
を元に生成して/host/etc/cni/net.d/10-aws.conflist
に設置(これがcniの設定ファイルのよう - 自作以外で利用しているのは host-local, portmap の2つのプラグインのみ?) - https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-vpc-cni/main.go#L468-L474 - aws-k8s-agent(L-IPAMD)コマンドの終了を待機
aws-k8s-agent
ざっくり理解
今のところざっくり下記の理解
- Node内のIPアドレス管理をやってる
- Prefix Delegationを使ってたらPrefix単位でIP管理/使ってなければ1IPずつ管理
- パラメータ設定に基づいてNodeへのPrefix or IPのENIのアサインを管理(不要な場合の開放も行う)
- gRPCサーバーを起動していて、CNIからIPの払い出しなどに応じるようになっている
- Nodeに割り当てたIPとそのPodへの割当は
/var/run/aws-node/ipam.json
で永続化することで管理している
実装
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-k8s-agent/main.go#L94-L154 - 初期化処理
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-k8s-agent/main.go#L156-L159 - k8s API Serverに対するコネクティビティを5秒毎にチェックするバックグラウンド処理を起動
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/cmd/aws-k8s-agent/main.go#L161-L162 - IP Pool管理開始
amazon-vpc-resource-controller-k8s
- https://github.com/aws/amazon-vpc-resource-controller-k8s
- EKS 上で動いていて、VPC リソース(ENI とか IP アドレス)を Pod に割り当てるのを制御する役割を持つらしい
- amazon-vpc-resource-controller-k8s は「Pod 単位で ENI を直接割り当てたい場合(例: Security Groups for Pods, Trunk/Branch ENI モード)」にだけらしい
- https://docs.aws.amazon.com/ja_jp/eks/latest/userguide/security-groups-pods-deployment.html で事前に有効化が必要らしい
routed-eni-cni-plugin(aws-cni)
ざっくり理解(add)
- https://github.com/aws/amazon-vpc-cni-k8s/blob/v1.20.1/docs/cni-proposal.md#pod-to-pod-communication で説明されている内容はだいたいこのプラグインでやっている
- aws-k8s-agent(L-IPAMD)とgRPC経由でAddNetworkを呼び出しPod用IPアドレスを確保
- PodのMACアドレスを生成
- vethを設定(+IPアドレスを付与)
- static arpを設定
- route tableを設定
- route ruleを設定
egress-cni-plugin
ざっくり理解
- IPAMプラグインを実行(host-local)してegress用IPアドレスを設定: https://www.cni.dev/plugins/current/ipam/host-local/
- vethなどを設定
- snatを設定
portmap
- https://github.com/containernetworking/plugins/tree/main/plugins/meta/portmap
- https://www.cni.dev/plugins/current/meta/portmap/
ざっくり理解
- Pod の公開ポート(HostPort)を「ホストのIP:ポート → PodのIP:ポート」に転送する DNAT を設定とのこと
- k8s pod のhostPort マッピングするために必要らしい
aws-network-policy-agent
- https://github.com/aws/aws-network-policy-agent
- https://github.com/aws/aws-ebpf-sdk-go/
- https://github.com/aws/amazon-network-policy-controller-k8s
ざっくり理解
- rpcサーバーでリクエストを受付
- Reconcilation Loop: TODO
- リクエストなどに応じてeBPFプログラムの設定や eBPF Mapの設定を行ってNetwork Policy設定に基づくネットワークフィルタリング設定を行うように設定