Usługa Amazon Elastic Kubernetes dodaje obsługę sieci IPv6
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).
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ą:
- IPv6 jest włączony przez tę samą wtyczkę VPC CNI Kubernetes, której używasz obecnie w IPv4. Wtyczka jest automatycznie konfigurowana dla IPv4 lub IPv6, w zależności od wyboru sieci pod, dokonanego podczas tworzenia klastra.
- Można również zainstalować wtyczkę VPC CNI skonfigurowaną dla IPv6 w samodzielnie zarządzanych klastrach. Jednak podczas zarządzania klastrem należy pamiętać o obowiązku skonfigurowania płaszczyzny sterowania do obsługi protokołu IPv6.
- Obsługa protokołu IPv6 jest włączana tylko w czasie tworzenia klastra. Na dzień dzisiejszy nie można migrować klastra z IPv4 na IPv6. Jeśli masz istniejący klaster, który chcesz migrować, może być konieczne ponowne wdrożenie workloadu do nowego klastra opartego na protokole IPv6 i stopniowa migracja ruchu z klastra IPv4 do klastra IPv6, tak jak opisano tutaj.
- Możesz wprowadzić własny zakres Postępuj zgodnie z tymi instrukcjami, aby wprowadzić własny zakres adresów IP na EC2.
- Możesz wdrożyć system Linux w klastrze IPv6. System Windows nie jest obecnie obsługiwany.
- Pamiętaj, aby zainstalować najnowszą wersję kontrolera AWS Load Balancer Controllerw klastrze, aby skierować ruch zewnętrzny do podów IPv6 przy użyciu Application Load Balancers i/lub modułów Network Load Balancers.
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