EKSネットワーキング:VPC CNIとロードバランシング
Amazon VPC CNIプラグインを使用してポッドにネイティブVPC IPアドレスを割り当て、AWS Load Balancer Controllerでサービスを公開します。
「EKSネットワーキング:VPC CNIとロードバランシング」はCoddyKit上の無料Cloud & IT Cert Prepレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCloud & IT Cert Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
Kubernetes ネットワークの基礎
Kubernetes では、すべての Pod に一意でルーティング可能な IP アドレスを割り当て、NAT なしで Pod 同士が通信できるようにする必要があります。Container Network Interface(CNI)プラグインは、ワーカーノード上で IP を割り当て、ネットワークルートを設定する役割を担います。Kubernetes プラットフォームによって CNI の実装は異なりますが、AWS ではAmazon VPC CNI プラグインを使用して、Kubernetes のネットワークを VPC レイヤーに直接統合します。
Amazon VPC CNI プラグイン
Amazon VPC CNI プラグインは、各 Pod に VPC のサブネット CIDR 範囲から直接 IP アドレスを割り当てます。これにより Pod はVPC の一級市民となり、他の VPC リソース、VPN や Direct Connect 経由のオンプレミスシステム、セキュリティグループから、オーバーレイネットワークによる変換なしでアクセスできます。各 EC2 ワーカーノードはセカンダリプライベート IP のプール(ENI スロットごとに 1 つ)を保持し、Pod のスケジュール時に割り当てます。
# Check the VPC CNI version installed in your cluster
kubectl describe daemonset aws-node -n kube-system | grep Image
# View the secondary IPs assigned to a node
aws ec2 describe-network-interfaces \
--filters 'Name=attachment.instance-id,Values=i-0abcdef1234567890' \
--query 'NetworkInterfaces[].PrivateIpAddresses[].PrivateIpAddress'ENI と IP アドレスのウォームプール
VPC CNI プラグインは、Pod のスケジュールを高速化するため、各ノード上に事前割り当て済み IP アドレスのウォームプールを保持します。ノードの起動時に、CNI は複数の ENI をアタッチし、WARM_IP_TARGET または MINIMUM_IP_TARGET 環境変数で指定された数までセカンダリ IP を割り当てます。そのため、ノードで実行できる Pod の最大数は、インスタンスタイプによって異なる、インスタンスの ENI 数と ENI あたりの IP 数の積によって制限されます。
# Check maximum pods supported by an instance type
aws ec2 describe-instance-types \
--instance-types m5.large \
--query 'InstanceTypes[].NetworkInfo.{MaxENIs:MaximumNetworkInterfaces,IPv4sPerENI:Ipv4AddressesPerInterface}'
# Max pods formula: (MaxENIs x (IPv4sPerENI - 1)) + 2
# m5.large: 3 ENIs x (10-1) + 2 = 29 podsPod 用セキュリティグループ
デフォルトでは、ノード上のすべての Pod がノードのセキュリティグループを共有します。Security Groups for Pods 機能を使用すると、SecurityGroupPolicy カスタムリソースによって、特定の Pod に個別のセキュリティグループを割り当てられます。これにより、ネットワークアクセスをきめ細かく制御できます。たとえば、データベース Pod だけが API Pod のセキュリティグループからポート 5432 のトラフィックを受信できるように設定できます。この機能には VPC CNI バージョン 1.7.7 以降と、ノード上のトランク ENI が必要です。
# Define a SecurityGroupPolicy (custom resource)
apiVersion: vpcresources.k8s.aws/v1beta1
kind: SecurityGroupPolicy
metadata:
name: db-pod-sg-policy
namespace: production
spec:
podSelector:
matchLabels:
role: database
securityGroups:
groupIds:
- sg-0db1234567890abcdEKS における Kubernetes Service の種類
Kubernetes のServiceは、安定した DNS 名と IP の下に複数の Pod を公開します。EKS で関連する Service の種類は 3 つです。ClusterIP(クラスター内部の通信のみ)、NodePort(すべてのノードでポートを開くため、EKS ではほとんど使用されません)、LoadBalancer(AWS のロードバランサーを自動的にプロビジョニング)です。インターネットに公開する EKS サービスの多くでは、LoadBalancer タイプを使用します。
# Expose a deployment with a LoadBalancer service
kubectl expose deployment my-api \
--type=LoadBalancer \
--name=my-api-svc \
--port=80 \
--target-port=8080
# Check the assigned AWS load balancer hostname
kubectl get svc my-api-svc -o wideAWS Load Balancer Controller
AWS Load Balancer Controllerは、EKS クラスターに代わって ALB および NLB リソースを管理するオープンソースの Kubernetes コントローラーです。Kubernetes の Ingress オブジェクトを作成すると、コントローラーはApplication Load Balancerをプロビジョニングします。正しいアノテーションを付けた LoadBalancer タイプの Service を作成すると、Network Load Balancerをプロビジョニングします。このコントローラーは、以前の Kubernetes 組み込みロードバランサープロバイダーに代わるものです。
# Install AWS Load Balancer Controller with Helm
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=my-cluster \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=us-east-1 \
--set vpcId=vpc-0abc1234def567890ALB を使用した Kubernetes Ingress
Kubernetes の Ingress オブジェクトは、クラスターへの HTTP/HTTPS ルーティングルール(パスベースおよびホストベース)を定義します。AWS Load Balancer Controller は、kubernetes.io/ingress.class: alb のアノテーションが付いた Ingress オブジェクトを読み取り、一致するリスナールールを持つApplication Load Balancerを作成します。これにより、アプリケーションサービスごとに ALB とターゲットグループを手動で作成する必要がなくなります。
# Ingress YAML that creates an ALB
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
namespace: production
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
spec:
rules:
- http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-svc
port:
number: 80TCP/UDP ワークロード向け NLB
ゲームサーバー、gRPC サービス、データベースプロキシなど、TCP または UDP(HTTP 以外)が必要なワークロードでは、ALB ではなく NLB を使用します。Kubernetes Service に service.beta.kubernetes.io/aws-load-balancer-type: 'external' と service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: 'ip' のアノテーションを付けます。コントローラーは Pod の IP を直接ターゲットとして使用する NLB をプロビジョニングするため、ノードレベルのポート転送を回避し、レイテンシーを低減できます。
# Service YAML that creates an NLB with IP targets
apiVersion: v1
kind: Service
metadata:
name: grpc-svc
namespace: production
annotations:
service.beta.kubernetes.io/aws-load-balancer-type: 'external'
service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: 'ip'
service.beta.kubernetes.io/aws-load-balancer-scheme: internet-facing
spec:
type: LoadBalancer
selector:
app: grpc-server
ports:
- port: 50051
targetPort: 50051
protocol: TCPクラスター内の DNS 名前解決
EKS はCoreDNSをクラスターの DNS プロバイダーとして実行します。すべての Service には service-name.namespace.svc.cluster.local 形式の DNS 名が割り当てられ、Service の ClusterIP に解決されます。Pod も DNS で検出できます。CoreDNS は DaemonSet ではなく Deployment としてデプロイされ、レプリカ数はクラスターの規模に応じて調整する必要があります。EKS は CoreDNS をアドオンとして管理するため、バージョンを自動的にアップグレードできます。
# Verify DNS resolution from within a pod
kubectl run dns-test --image=busybox --rm -it --restart=Never -- \
nslookup kubernetes.default.svc.cluster.local
# Expected output: Name: kubernetes.default.svc.cluster.local
# Address: 10.100.0.1 (ClusterIP of the kubernetes service)EKS のネットワークポリシー
Kubernetes のNetworkPolicyオブジェクトは、Pod 間および Pod から外部へのトラフィックに対する許可ルールを定義します。デフォルトでは、クラスター内のすべての Pod が自由に通信できます。ゼロトラストネットワークを適用するには、Amazon VPC CNI network policy controller(VPC CNI v1.14 以降で利用可能)をインストールします。ネットワークポリシーは eBPF を使用して Linux カーネルレベルで評価されるため、オーバーレイネットワークなしで高パフォーマンスの適用が可能です。
# NetworkPolicy: allow traffic to api pods only from frontend pods
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: api-allow-frontend
namespace: production
spec:
podSelector:
matchLabels:
role: api
ingress:
- from:
- podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 8080VPC CNI のトラブルシューティングのヒント
EKS でよくあるネットワークの問題には、IP アドレスの枯渇(プレフィックス委任を有効にするか、より大きなサブネットを追加して解決)、ノードに使用可能なセカンダリ IP がないためにPod が Pending のままになる問題、CoreDNS のレプリカ不足による断続的な DNS 名前解決エラーがあります。kubectl describe pod でイベントを確認し、kubectl describe node で割り当て済み IP 数を確認してください。また、CloudWatch Container Insights を使用して、クラスター全体の DNS エラー率を監視できます。
# Enable prefix delegation to increase pod density per node
kubectl set env daemonset aws-node \
-n kube-system \
ENABLE_PREFIX_DELEGATION=true \
WARM_PREFIX_TARGET=1
# Check current IP usage on a node
kubectl describe node ip-10-0-1-100.ec2.internal | grep -A5 'Allocatable'クイックチェック
このレッスンで学んだ AWS Solutions Architect(SAA-C03)の概念について、理解度を確認しましょう。
レッスンのまとめ
このレッスンでは、Amazon VPC CNI プラグインがすべての Pod に VPC のネイティブ IP を割り当て、VPC とシームレスに統合すること、AWS Load Balancer Controllerが HTTP Ingress 用の ALB と TCP/UDP Service 用の NLB をプロビジョニングすること、そしてSecurity Groups for Podsによって Pod レベルのネットワークアクセス制御が可能になることを学びました。次は、IRSA を使用して Kubernetes service account にきめ細かな IAM ロールを関連付ける方法について学びます。
よくある質問
「EKSネットワーキング:VPC CNIとロードバランシング」レッスンは無料ですか?
はい。「EKSネットワーキング:VPC CNIとロードバランシング」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cloud & IT Cert Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cloud & IT Cert Prepコースには全4レッスンが含まれています。
「EKSネットワーキング:VPC CNIとロードバランシング」で何を学びますか?
Amazon VPC CNIプラグインを使用してポッドにネイティブVPC IPアドレスを割り当て、AWS Load Balancer Controllerでサービスを公開します。 ブラウザで直接実行するハンズオンコードでCloud & IT Cert Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cloud & IT Cert Prepを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCloud & IT Cert Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「EKSネットワーキング:VPC CNIとロードバランシング」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCloud & IT Cert Prepレッスンでコードを書いて実行できますか?
はい。すべてのCloud & IT Cert Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- EKSコントロールプレーンとワーカーノード
- サーバーレスポッド向けFargateプロファイル
- EKSネットワーキング:VPC CNIとロードバランシング
- サービスアカウントのIAMロール(IRSA)