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 以上の地球に対して同じように割り当てるのに十分なアドレスが残っています。

IPng 次世代 IP に関する書籍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 アドレスの自動割り当てを設定します (各パブリックサブネットについてこれを行います)。

サブネットで 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 での着信接続を許可するルールがあることを確認します。

覚えておくべきこと
まとめに入る前に、この新機能を既にお試しいただいたお客様から寄せられたよくある質問にお答えします。

利用可能なリージョンと料金
Amazon Elastic Kubernetes Service (EKS) クラスター向けの IPv6 サポートは、Amazon EKS が利用可能なすべての AWS リージョンで、追加料金なしで今すぐご利用いただけます。

今すぐお試しいただき、最初の IPv6 クラスターを構築しましょう

— seb

原文はこちらです。