Amazon Web Services ブログ
Amazon Elastic Kubernetes Service が IPv6 ネットワークを追加
2022 年 1 月 6 日(米国時間)より、IPv6 アドレス空間を使用するアプリケーションを Amazon Elastic Kubernetes Service (EKS) にデプロイできるようになりました。
当社のお客様の多くは、クラウドおよびオンプレミスのアプリケーション用のコンピューティングインフラストラクチャプラットフォームとして Kubernetes を標準化しています。Amazon EKS を使用すると、コンテナ化されたワークロードを簡単にデプロイできます。可用性の高いクラスターを提供し、パッチ適用、ノードのプロビジョニング、更新などのタスクを自動化します。
Kubernetes は、各ポッドが IP アドレスを受け取ることを要求するフラットネットワークモデルを使用します。このシンプルなアプローチを使用すれば、フリクションを低く抑えつつ、仮想マシンからコンテナにアプリケーションを移植できますが、多くのプライベート VPC IPv4 ネットワークでは処理できない、非常に多くの IP アドレスが必要になります。VPC よりも 1 つ上の階層の IP アドレスを仮想化するコンテナネットワークプラグイン (CNI) をインストールすることで、この IPv4 空間の制限を回避しているクラスター管理者もいますが、このアーキテクチャでは、管理者がアプリケーションを効果的に監視およびトラブルシューティングする能力が制限されるとともに、ネットワークパフォーマンスに対する悪影響が大規模に生じます。さらに、VPC 外のインターネットサービスと通信するために、IPv4 ポッドからのトラフィックは宛先に到達する前に複数のネットワークホップを経由してルーティングされるため、レイテンシーが増大し、複雑なルーティング設定を維持する必要があるネットワークエンジニアリングチームに負担がかかります。
IP アドレスの枯渇を防ぎ、レイテンシーを大きな規模で最小限に抑え、ルーティング設定を簡素化するための解決策は、IPv6 アドレス空間を使用することです。
IPv6 は以前から存在しています。私は、1996 年に「IPng, Internet Protocol Next Generation」(25 年前にはこう呼ばれていました) に関する書籍を初めて購入しました。これは、64 ビットのアドレス空間を提供し、デバイス、サーバー、コンテナ向けに 3.4 x 10^38 の IP アドレスの利用を可能にします。地球の表面上のすべての原子に IPv6 アドレスを割り当てても、100 以上の地球に対して同じように割り当てるのに十分なアドレスが残っています。
Amazon EKS クラスターを IPv6 ネットワークで使用することには、いくつかのメリットがあります。1 つ目は、VPC で利用可能なすべての IPv4 アドレスを使い果たすリスクなしに、1 つのホストまたはサブネットでより多くのポッドを実行できることです。2 つ目は、余分な NAT ホップを回避することで、オンプレミス、AWS、またはインターネットで実行される他の IPv6 サービスとの通信のレイテンシーを低く抑えることができることです。3 つ目は、ネットワークエンジニアが複雑なルーティング設定を維持する負担を軽減できることです。
Kubernetes クラスター管理者は、IPv4 の制限を回避することに労力をかけることなく、アプリケーションの移行とスケーリングに集中できます。最後に、ポッドがクラスター外の IPv4 ベースのアプリケーションと通信できるようにポッドネットワークが設定されているため、組織全体でデプロイされたすべての従属サービスを事前に IPv6 に移行しなくても、Amazon EKS で IPv6 のメリットを享受できます。
いつもどおり、その仕組みを確認するために短いデモを用意しました。
仕組み
開始する前に、IPv6 VPC を作成します。この CDK スクリプトを使用して、IPv6 対応の VPC を数分で作成します (コードを提供してくれた Angus Lees に感謝します)。CDK v2 (npm install -g aws-cdk@next
) をインストールして、スタック (cdk bootstrap && cdk deploy
) をデプロイします。
IPv6 を使用する VPC が作成されたら、コンソールを使用して、パブリックサブネットでデプロイされたリソースに対する IPv6 アドレスの自動割り当てを設定します (各パブリックサブネットについてこれを行います)。
上記の CDK スクリプトで作成されたサブネット ID (スクリプトの出力にリストされています) を書き留め、デモ全体で使用する変数をいくつか定義します。Amazon EKS ドキュメントで説明されているように、クラスター IAM ロールとノード IAM ロールも作成します。クラスターが既にデプロイされている場合、これらの 2 つのロールは既に存在しています。
ターミナルを開いて、次のように入力します。
CLUSTER_ROLE_ARN="arn:aws:iam::0123456789:role/EKSClusterRole"
NODE_ROLE_ARN="arn:aws:iam::0123456789:role/EKSNodeRole"
SUBNET1="subnet-06000a8"
SUBNET2="subnet-03000cc"
CLUSTER_NAME="AWSNewsBlog"
KEYPAIR_NAME="my-key-pair-name"
次に、Amazon EKS IPv6 クラスターを作成します。ターミナルで、次のように入力します。
aws eks create-cluster --cli-input-json "{
\"name\": \"${CLUSTER_NAME}\",
\"version\": \"1.21\",
\"roleArn\": \"${CLUSTER_ROLE_ARN}\",
\"resourcesVpcConfig\": {
\"subnetIds\": [
\"${SUBNET1}\", \"${SUBNET2}\"
],
\"endpointPublicAccess\": true,
\"endpointPrivateAccess\": true
},
\"kubernetesNetworkConfig\": {
\"ipFamily\": \"ipv6\"
}
}"
{
"cluster": {
"name": "AWSNewsBlog",
"arn": "arn:aws:eks:us-west-2:486652066693:cluster/AWSNewsBlog",
"createdAt": "2021-11-02T17:29:32.989000+01:00",
"version": "1.21",
...redacted for brevity...
"status": "CREATING",
"certificateAuthority": {},
"platformVersion": "eks.4",
"tags": {}
}
}
クラスターが作成されるのを待機する間、describe-cluster
を使用します。クラスターの準備が整うと、"status" : "ACTIVE"
となります。
aws eks describe-cluster --name "${CLUSTER_NAME}"
その後、ノードグループを作成します。
aws eks create-nodegroup \
--cluster-name ${CLUSTER_NAME} \
--nodegroup-name AWSNewsBlog-nodegroup \
--node-role ${NODE_ROLE_ARN} \
--subnets "${SUBNET1}" "${SUBNET2}" \
--remote-access ec2SshKey=${KEYPAIR_NAME}
{
"nodegroup": {
"nodegroupName": "AWSNewsBlog-nodegroup",
"nodegroupArn": "arn:aws:eks:us-west-2:0123456789:nodegroup/AWSNewsBlog/AWSNewsBlog-nodegroup/3ebe70c7-6c45-d498-6d42-4001f70e7833",
"clusterName": "AWSNewsBlog",
"version": "1.21",
"releaseVersion": "1.21.4-20211101",
"status": "CREATING",
"capacityType": "ON_DEMAND",
... redacted for brevity ...
}
ノードグループが作成されると、コンソールに 2 つの EC2 インスタンスが表示されます。AWS Command Line Interface (CLI) を使用して、インスタンスが IPv6 アドレスを受け取ったことを確認します。
aws ec2 describe-instances --query "Reservations[].Instances[? State.Name == 'running' ][].NetworkInterfaces[].Ipv6Addresses" --output text
2600:1f13:812:0000:0000:0000:0000:71eb
2600:1f13:812:0000:0000:0000:0000:3c07
kubectl
コマンドを使用して、Kubernetes の観点からクラスターを検証します。
kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
ip-10-0-0-108.us-west-2.compute.internal Ready <none> 2d13h v1.21.4-eks-033ce7e 2600:1f13:812:0000:0000:0000:0000:2263 18.0.0.205 Amazon Linux 2 5.4.149-73.259.amzn2.x86_64 docker://20.10.7
ip-10-0-1-217.us-west-2.compute.internal Ready <none> 2d13h v1.21.4-eks-033ce7e 2600:1f13:812:0000:0000:0000:0000:7f3e 52.0.0.122 Amazon Linux 2 5.4.149-73.259.amzn2.x86_64 docker://20.10.7
その後、ポッドをデプロイします。EKS ドキュメントの次の手順に従います。これにより、サンプルの nginx ウェブサーバーがデプロイされます。
kubectl create namespace aws-news-blog
namespace/aws-news-blog created
# sample-service.yml is available at https://docs.aws.amazon.com/eks/latest/userguide/sample-deployment.html
kubectl apply -f sample-service.yml
service/my-service created
deployment.apps/my-deployment created
kubectl get pods -n aws-news-blog -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
my-deployment-5dd5dfd6b9-7rllg 1/1 Running 0 17m 2600:0000:0000:0000:405b::2 ip-10-0-1-217.us-west-2.compute.internal <none> <none>
my-deployment-5dd5dfd6b9-h6mrt 1/1 Running 0 17m 2600:0000:0000:0000:46f9:: ip-10-0-0-108.us-west-2.compute.internal <none> <none>
my-deployment-5dd5dfd6b9-mrkfv 1/1 Running 0 17m 2600:0000:0000:0000:46f9::1 ip-10-0-0-108.us-west-2.compute.internal <none> <none>
ポッドの IPv6 アドレスを書き留めて、ノートパソコンから接続してみます。私が利用している素晴らしいサービスプロバイダーはまだ私の自宅に IPv6 を提供していないので、接続は失敗します。ポッドは IPv4 アドレスをまったく利用していないため、これは想定済みです。-g
オプションがポート番号の区切り文字として IP アドレスの :
を考慮しないように curl
に指示しており、-6
が IPv6 のみを介して接続するよう curl
に指示していること (curl
に DNS ホスト名を提供する場合に必要です) に留意してください。
curl -g -6 http://\[2600:0000:0000:35000000:46f9::1\]
curl: (7) Couldn't connect to server
IPv6 接続をテストするために、クラスターと同じ VPC でデュアルスタック (IPv4 および IPv6) EC2 インスタンスを起動します。インスタンスに SSH 接続し、curl
コマンドをもう一度試します。nginx が提供するデフォルトの HTML ページが表示されます。ポッドへの IPv6 接続は機能しています!
curl -g -6 http://\[2600:0000:0000:35000000:46f9::1\]
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
... redacted for brevity ...
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
正常に機能しない場合は、クラスター EC2 ノードのセキュリティグループを検証し、::/0
からのポート TCP 80
での着信接続を許可するルールがあることを確認します。
覚えておくべきこと
まとめに入る前に、この新機能を既にお試しいただいたお客様から寄せられたよくある質問にお答えします。
- IPv6 は、今日 IPv4 で使用しているのと同じ VPC CNI Kubernetes プラグインを使用しています。クラスターの作成時に選択したポッドネットワークに応じて、プラグインは IPv4 または IPv6 用に自動的に設定されます。
- IPv6 用に設定された VPC CNI プラグインをセルフマネージドクラスターにインストールすることもできます。ただし、クラスターの管理において、IPv6 をサポートするようにコントロールプレーンを設定するのはお客様の責任です。
- IPv6 サポートは、クラスターの作成時にのみ有効になります。現在、クラスターを IPv4 から IPv6 に移行することはできません。移行を希望する既存のクラスターがある場合は、このテクニカルノートで説明されているように、新しい IPv6 ベースのクラスターにワークロードを再デプロイし、IPv4 から IPv6 クラスターにトラフィックを段階的に移行する必要がある場合があります。
- 独自の IPv6 範囲を使用できます。EC2 で独自の IP アドレス範囲を使用するには、次の手順に従います。
- Linux を IPv6 クラスターにデプロイすることができます。現在、Windows はサポートされていません。
- Application Load Balancer や Network Load Balancer を使用して外部トラフィックを IPv6 ポッドにルーティングするには、最新バージョンの AWS Load Balancer Controller がクラスターにインストールされているようにしてください。
利用可能なリージョンと料金
Amazon Elastic Kubernetes Service (EKS) クラスター向けの IPv6 サポートは、Amazon EKS が利用可能なすべての AWS リージョンで、追加料金なしで今すぐご利用いただけます。
今すぐお試しいただき、最初の IPv6 クラスターを構築しましょう。
原文はこちらです。