Usługa Amazon Elastic Kubernetes dodaje obsługę sieci IPv6

17 stycznia 2022

Od początku stycznia, AWS umożliwił wdrażanie aplikacji korzystających z przestrzeni adresowej IPv6 w usłudze Amazon Elastic Kubernetes Service (EKS).

Wielu klientów standaryzuje Kubernetes jako platformę infrastruktury obliczeniowej dla aplikacji w chmurze on-premises. Amazon EKS ułatwia wdrażanie skonteneryzowanych obciążeń. Zapewnia klastry o wysokiej dostępności i automatyzuje zadania, takie jak instalowanie poprawek, dostarczanie węzłów i aktualizacje. Kubernetes używa płaskiego modelu sieci, który wymaga, aby każdy pod otrzymał adres IP. To uproszczone podejście umożliwia bezproblemowe przenoszenie aplikacji z maszyn wirtualnych do kontenerów, ale wymaga znacznej liczby adresów IP, do obsługi których nie jest przystosowanych wiele prywatnych sieci VPC IPv4. Niektórzy administratorzy klastrów obchodzą to ograniczenie przestrzeni IPv4, instalując wtyczki sieciowe kontenerów (CNI), które wirtualizują adresy IP w warstwie powyżej VPC, ale ta architektura ogranicza możliwość skutecznego obserwowania aplikacji i rozwiązywania problemów przez administratora oraz ma negatywny wpływ na wydajność sieci na dużą skalę . Ponadto, aby komunikować się z usługami internetowymi poza VPC, ruch z podów IPv4 jest kierowany przez wiele przeskoków sieci przed dotarciem do miejsca docelowego, co zwiększa opóźnienia i obciąża zespoły sieciowe, które muszą utrzymywać złożone konfiguracje routingu.

Aby uniknąć wyczerpania adresów IP, zminimalizować opóźnienia na dużą skalę i uprościć konfigurację routingu, rozwiązaniem jest użycie przestrzeni adresowej IPv6.

IPv6 nie jest nowy. W 1996 roku wydano książkę na ten temat pod tytułem „IPng, Internet Protocol Next Generation”. IPv6 zapewnia 128-bitową przestrzeń adresową, umożliwiającą 3,4 x 10^38 możliwych adresów IP dla naszych urządzeń, serwerów lub kontenerów. Moglibyśmy przypisać adres IPv6 do każdego atomu na powierzchni planety i wciąż mieć wystarczająco dużo adresów, aby zrobić kolejnych stu Ziemiach.

Korzystanie z klastrów Amazon EKS z siecią IPv6 ma kilka zalet. Po pierwsze, można uruchomić więcej podów na jednym hoście lub podsieci bez ryzyka wyczerpania wszystkich dostępnych adresów IPv4 dostępnych w VPC. Po drugie, pozwala to na komunikację z mniejszymi opóźnieniami z innymi usługami IPv6, działającymi na jednostkach typu on-premises w AWS lub w internecie, unikając dodatkowego przeskoku NAT. Po trzecie, odciąża to zespoły sieciowe od utrzymywania złożonych konfiguracji routingu.

Administratorzy klastrów Kubernetes mogą skoncentrować się na migracji i skalowaniu aplikacji bez dodatkowej pracy związanej z obchodzeniem limitów IPv4. Ostatecznie, sieć jest skonfigurowana tak, aby pody mogły komunikować się z aplikacjami opartymi na protokole IPv4 poza klastrem, co pozwala na zastosowanie zalet protokołu IPv6 w Amazon EKS bez konieczności wcześniejszej migracji wszystkich zależnych usług wdrożonych w organizacji do protokołu IPv6.

Poniżej zademonstrujemy krótkie demo, aby pokazać, jak to działa.

Sposób działania

Przed rozpoczęciem, tworzymy VPC IPv6. Używamy tego skryptu CDK, aby w kilka minut utworzyć VPC z obsługą IPv6 (kod opracowany przez Angus Lees). Wystarczy zainstalować CDK v2 npm install -g aws-cdk@next) i wdrożyć stos (cdk bootstrap && cdk deploy).

Kiedy tworzymy VPC z IPv6, używamy konsoli do konfiguracji automatycznego przypisywania adresów IPv6 do zasobów wdrożonych w podsieciach publicznych (robimy to dla każdej podsieci publicznej).

Amazon Elastic Kubernetes Service Adds IPv6 Networking

Zapisujemy wszystkie ID podsieci utworzone przez powyższy skrypt CDK (są one wymienione w danych wyjściowych skryptu) i definiujemy kilka zmiennych, których będziemy używali podczas demonstracji. Tworzymy również rolę IAM uprawnień klastra i rolę IAM uprawnień węzła, zgodnie z opisem w dokumentacji Amazon EKS. Jeśli twoje klastry są już wdrożone, te dwie role już istnieją.

 

 

Otwieramy terminal i wpisujemy:

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"

 

Następnie tworzymy klaster Amazon EKS IPv6. W terminalu wpisujemy:

 

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": {}

    }

}

 

Używamy describe-cluster podczas oczekiwania na utworzenie klastra. Gdy klaster jest gotowy, ma “status” : “ACTIVE”

 

aws eks describe-cluster --name "${CLUSTER_NAME}"

 

Dalej tworzymy grupę węzłów:

 

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 ...

 

}    

 

Po utworzeniu grupy węzłów w konsoli widzimy dwie instancje EC2. Używamy AWS Command Line Interface (CLI), aby sprawdzić, czy instancje otrzymały adres 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

 

Używamy polecenia kubectl, aby zweryfikować klaster z punktu widzenia Kubernetesa.

 

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

 

Następnie wdrażamy Pod. Postępujemy zgodnie z dokumentacją EKS. Wdraża ona przykładowy serwer 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>

Zapisujemy adresy IPv6 naszych podów i próbujemy się połączyć z laptopa. Ponieważ nasz dostawca usług nie zapewnia nam jeszcze IPv6 w domu, połączenie nie działa. Było to do przewidzenia, ponieważ pody w ogóle nie mają adresu IPv4. Zwróć uwagę na opcję -g mówiącą curl, aby nie brał pod uwagę znaku: w adresie IP jako separator dla numeru portu i -6, aby curl łączył się tylko przez IPv6 (jest to wymagane, gdy wprowadzisz curl  z nazwą hosta DNS).

curl -g -6 http://\[2600:0000:0000:35000000:46f9::1\]

curl: (7) Couldn't connect to server

Aby przetestować łączność IPv6, uruchamiamy instancję EC2 z dwoma stosami (IPv4 i IPv6) w tym samym VPC co klaster. Łączymy się przez SSH z instancją i ponownie próbujemy wykonać polecenie curl . Widzimy, że otrzymujemy domyślną stronę HTML obsługiwaną przez nginx. Łączność IPv6 z podem działa poprawnie.

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>

Jeśli to nie działa, należy sprawdzić trzy parametry nadające dostęp do internetu dla podsieci: czy Twój VPC ma bramę internetową? Czy tabela routingu dołączona do podsieci ma domyślną trasę do bramy internetowej? Czy grupa bezpieczeństwa dla węzłów klastra EC2 ma regułę zezwalającą na połączenia przychodzące na porcie TCP 80 z ::/0? Brama internetowa i tablica routingu są automatycznie konfigurowane przez podany wcześniej skrypt CDK.

Warto pamiętać

Oto kilka odpowiedzi na kilka częstych pytań otrzymywanych od klientów, którzy już eksperymentowali z tą nową funkcją:

Koszt i dostępność


Obsługa IPv6 dla klastra Amazon Elastic Kubernetes Service (EKS) jest już dostępna we wszystkich regionach AWS, w których dostępna jest usługa Amazon EKS, bez dodatkowych kosztów.

źródło:AWS

Case Studies
Referencje

Hostersi zrealizowali usługi konsultingowe z zakresu doboru odpowiedniej bazy danych w Amazon Web Services oraz pomyślnie przeprowadzili migrację bazy danych MySQL do Amazon Aurora. 

Tomasz Ślązok
CTO Landingi
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.