1. Genel Bakış
Dinamik Bağlantı Noktası Ayırma (DPA), Cloud NAT'deki yeni bir özelliktir. DPA etkin olduğunda Cloud NAT, örnekler için bağlantı noktası ayırmalarını ihtiyaca göre dinamik olarak ölçeklendirir. DPA, minimum ve maksimum bağlantı noktası sınırlarıyla yapılandırılır. Bu yüzden, bağlantı noktalarını hiçbir zaman minimum değerin altına düşürmez veya maksimum değeri aşan ölçekleme yapmaz. Bu sayede NAT ağ geçitlerinin arkasındaki bazı örnekler, Cloud NAT'nin arkasındaki tüm örneklere daha fazla bağlantı noktası tahsis etmek zorunda kalmadan bağlantı sayılarını dinamik olarak ölçeklendirebilir.
DPA kullanılmadığında, Cloud NAT'nin arkasındaki tüm örneklere, minPortsPerVm
parametresiyle tanımlanan şekilde kullanım dikkate alınmaksızın aynı sayıda bağlantı noktası ayrılır .
Daha fazla bilgi için lütfen NAT DPA ile ilgili belgeler bölümünü inceleyin.
Neler öğreneceksiniz?
- DPA hazırlığı için Cloud NAT ağ geçidi ayarlama.
- DPA olmadan bağlantı noktası ayırmalarını inceleme.
- NAT ağ geçidi için DPA'yı etkinleştirme ve yapılandırma.
- Paralel çıkış bağlantıları çalıştırarak DPA'nın etkilerini gözlemleme.
- DPA etkin durumdayken NAT Ağ Geçidi'ne NAT kuralları ekleme.
- Birden fazla hedefe çıkış bağlantıları çalıştırarak DPA davranışını Kurallar ile görme.
Gerekenler
- Google Compute Engine ile ilgili temel bilgiler
- Temel ağ iletişimi ve TCP/IP bilgisi
- Temel Unix/Linux komut satırı bilgisi
- Networking in Google Cloud (Google Cloud'da Ağ İletişimi) laboratuvarı gibi Google Cloud'da bir ağ iletişimi turunu tamamlamış olmanız faydalı olacaktır.
- "Alfa Erişimi"ne sahip bir Google Cloud projesi etkin.
- Cloud NAT temellerini anlama
2. Google Cloud Console ve Cloud Shell'i kullanma
GCP ile etkileşime geçmek için bu laboratuvar boyunca hem Google Cloud Console hem de Cloud Shell'i kullanacağız.
Google Cloud Console
Cloud Console'a https://console.cloud.google.com adresinden erişilebilir.
Kendi hızınızda ortam kurulumu
- Google Cloud Console'da oturum açıp yeni bir proje oluşturun veya mevcut bir projeyi yeniden kullanın. Gmail veya Google Workspace hesabınız yoksa hesap oluşturmanız gerekir.
- Proje adı, bu projenin katılımcıları için görünen addır. Google API'leri tarafından kullanılmayan bir karakter dizesidir ve bunu istediğiniz zaman güncelleyebilirsiniz.
- Proje Kimliği, tüm Google Cloud projelerinde benzersiz olmalıdır ve değiştirilemez (belirlendikten sonra değiştirilemez). Cloud Console, otomatik olarak benzersiz bir dize oluşturur. bunun ne olduğunu umursamıyorsunuz. Çoğu codelab'de, Proje Kimliğine referans vermeniz gerekir (ve bu kimlik genellikle
PROJECT_ID
olarak tanımlanır). Beğenmezseniz başka bir rastgele kod oluşturun ya da kendi proje kimliğinizi deneyip mevcut olup olmadığına bakın. Sıcaklık "soğudu" takip etmeniz gerekir. - Bazı API'lerin kullandığı üçüncü bir değer, yani Proje Numarası daha vardır. Bu değerlerin üçü hakkında daha fazla bilgiyi belgelerde bulabilirsiniz.
- Ardından, Cloud kaynaklarını/API'lerini kullanmak için Cloud Console'da faturalandırmayı etkinleştirmeniz gerekir. Bu codelab'i çalıştırmanın maliyeti, yüksek değildir. Bu eğitim dışında faturalandırmayla karşılaşmamak için kaynakları kapatmak istiyorsanız tüm "temizleme" işlemlerini uygulayın buradaki talimatları uygulayın. Yeni Google Cloud kullanıcıları, 300 ABD doları değerindeki ücretsiz denemeden yararlanabilir.
Cloud Shell'i başlatma
Google Cloud dizüstü bilgisayarınızdan uzaktan çalıştırılabilse de bu codelab'de, Cloud'da çalışan bir komut satırı ortamı olan Google Cloud Shell'i kullanacaksınız.
GCP Console'da, sağ üstteki araç çubuğunda yer alan Cloud Shell simgesini tıklayın:
Ortamı sağlamak ve bağlamak yalnızca birkaç dakika sürer. Tamamlandığında şuna benzer bir sonuç görmeniz gerekir:
İhtiyacınız olan tüm geliştirme araçlarını bu sanal makinede bulabilirsiniz. 5 GB boyutunda kalıcı bir ana dizin sunar ve Google Cloud üzerinde çalışarak ağ performansını ve kimlik doğrulamasını büyük ölçüde iyileştirir. Bu laboratuvardaki tüm çalışmalarınızı yalnızca bir tarayıcıyla yapabilirsiniz.
3. Laboratuvar Kurulumu
Bu laboratuvar için bir Proje kullanacak ve her birinde alt ağ bulunan iki VPC oluşturacaksınız. Harici IP adreslerini ayıracak, ardından bir Cloud NAT ağ geçidi (Cloud Yönlendiricisi ile), iki üretici örneği ve iki tüketici örneği oluşturup yapılandıracaksınız. Varsayılan Cloud NAT davranışını doğruladıktan sonra Dinamik Bağlantı Noktası Ayırma'yı etkinleştirip davranışını doğrulayabilirsiniz. Son olarak, NAT kurallarını yapılandıracak ve DPA ile NAT kuralları arasındaki etkileşimi gözlemleyeceksiniz.
Ağ iletişimi mimarisine genel bakış:
4. Harici IP Adreslerini Ayırt
Tüm harici IP adreslerini bu laboratuvarda kullanılacak şekilde ayıralım. Bu, hem tüketici hem de üretici VPC'sinde ilgili tüm NAT ve güvenlik duvarı kurallarını yazmanıza yardımcı olur.
Cloud Shell'den:
gcloud compute addresses create nat-address-1 nat-address-2 \ producer-address-1 producer-address-2 --region us-east4
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1]. Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].
Ortam değişkeni olarak ayrılmış IP adreslerini doldurun.
export natip1=`gcloud compute addresses list --filter name:nat-address-1 --format="get(address)"` export natip2=`gcloud compute addresses list --filter name:nat-address-2 --format="get(address)"` export producerip1=`gcloud compute addresses list --filter name:producer-address-1 --format="get(address)"` export producerip2=`gcloud compute addresses list --filter name:producer-address-2 --format="get(address)"`
Herhangi bir çıkış beklenmiyor ancak adreslerin doğru şekilde doldurulduğundan emin olmak gerekiyor. Tüm ortam değişkenlerinin değerlerinin çıktısını oluşturalım.
env | egrep '^(nat|producer)ip[1-3]'
Çıkış:
producerip1=<Actual Producer IP 1> producerip2=<Actual Producer IP 2> natip1=<NAT IP 1> natip2=<NAT IP 2>
5. Üretici VPC'si ve Örnek Kurulumu.
Şimdi, yapımcı kaynakları için kaynaklar oluşturacağız. Üretici VPC'sinde çalışan örnekler, internete yönelik hizmeti iki genel IP "üretici-adresi-1" kullanarak sunar. ve "Generative-address-2" ,
Önce VPC'yi oluşturalım. Cloud Shell'den:
gcloud compute networks create producer-vpc --subnet-mode custom
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/networks/producer-vpc]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 producer-vpc CUSTOM REGIONAL Instances on this network will not be reachable until firewall rules are created. As an example, you can allow all internal traffic between instances as well as SSH, RDP, and ICMP by running: $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE> $ gcloud compute firewall-rules create <FIREWALL_NAME> --network producer-vpc --allow tcp:22,tcp:3389,icmp
Sonra, us-east4 bölgesinde alt ağı oluşturalım. Cloud Shell'den:
gcloud compute networks subnets create prod-net-e4 \ --network producer-vpc --range 10.0.0.0/24 --region us-east4
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/prod-net-e4]. NAME REGION NETWORK RANGE STACK_TYPE IPV6_ACCESS_TYPE IPV6_CIDR_RANGE EXTERNAL_IPV6_CIDR_RANGE prod-net-e4 us-east4 producer-vpc 10.0.0.0/24 IPV4_ONLY
Şimdi, NAT IP adreslerinin 8080 bağlantı noktası üzerindeki üretici örneklerine ulaşmasına izin vermek için VPC güvenlik duvarı kuralları oluşturalım.
Cloud Shell'den ilk kural için:
gcloud compute firewall-rules create producer-allow-80 \ --network producer-vpc --allow tcp:80 \ --source-ranges $natip1,$natip2
Çıkış:
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-80]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED producer-allow-80 producer-vpc INGRESS 1000 tcp:80 False
Sonraki adım, iki üretici örneğini oluşturmaktır.
Üretici örnekleri basit bir nginx proxy dağıtımı çalıştırır.
Örnekleri tüm gerekli yazılımlarla birlikte hızlıca sağlamak için Debian APT paket yöneticisini kullanarak nginx yükleyen bir başlangıç komut dosyasıyla örnekler oluşturacağız.
NAT kuralları yazabilmek için her bir örneğin farklı bir ayrılmış IP adresi sağlanır.
İlk örneği oluşturun. Cloud Shell'den:
gcloud compute instances create producer-instance-1 \ --zone=us-east4-a --machine-type=e2-medium \ --network-interface=address=producer-address-1,network-tier=PREMIUM,subnet=prod-net-e4 \ --metadata startup-script="#! /bin/bash sudo apt update sudo apt install -y nginx mkdir /var/www/html/nginx/ cat <<EOF > /var/www/html/nginx/index.html <html><body><h1>This is producer instance 1</h1> </body></html> EOF"
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/producer-instance-1]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS producer-instance-1 us-east4-a e2-medium 10.0.0.2 <Producer IP1> RUNNING
Ardından ikinci örneği oluşturun. Cloud Shell'den:
gcloud compute instances create producer-instance-2 \ --zone=us-east4-a --machine-type=e2-medium \ --network-interface=address=producer-address-2,network-tier=PREMIUM,subnet=prod-net-e4 \ --metadata startup-script="#! /bin/bash sudo apt update sudo apt install -y nginx mkdir /var/www/html/nginx/ cat <<EOF > /var/www/html/nginx/index.html <html><body><h1>This is producer instance 2</h1> </body></html> EOF"
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/producer-instance-2]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS producer-instance-2 us-east4-a e2-medium 10.0.0.3 <Producer IP2> RUNNING
6. Tüketici VPC'si, Cloud NAT ve Örnekleri Oluşturma
Üretici hizmetini oluşturduğunuza göre şimdi sıra tüketici VPC'sini ve Cloud NAT ağ geçidini oluşturmaya geldi.
VPC'yi ve alt ağı oluşturduktan sonra, TCP kaynak IP aralıkları için IAP'ye izin vermek amacıyla basit bir giriş güvenlik duvarı kuralı ekleyeceğiz. Bu sayede gcloud'u kullanarak doğrudan tüketici örneklerine SSH uygulayabiliyoruz.
Ardından, manuel ayırma modunda basit bir Cloud NAT ağ geçidi ve ayrılmış "nat-address-1" adresini oluşturacağız görüntülenebilir. Codelab'in sonraki bölümlerinde, ağ geçidinin yapılandırmasını Dinamik Bağlantı Noktası Ayırma'yı etkinleştirecek ve daha sonra özel kurallar ekleyecek şekilde güncelleyeceğiz.
Önce VPC'yi oluşturalım. Cloud Shell'den:
gcloud compute networks create consumer-vpc --subnet-mode custom
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc]. NAME SUBNET_MODE BGP_ROUTING_MODE IPV4_RANGE GATEWAY_IPV4 consumer-vpc CUSTOM REGIONAL Instances on this network will not be reachable until firewall rules are created. As an example, you can allow all internal traffic between instances as well as SSH, RDP, and ICMP by running: $ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp,udp,icmp --source-ranges <IP_RANGE> $ gcloud compute firewall-rules create <FIREWALL_NAME> --network consumer-vpc --allow tcp:22,tcp:3389,icmp
Sonra, us-east4 bölgesinde bir alt ağ oluşturalım. Cloud Shell'den:
gcloud compute networks subnets create cons-net-e4 \ --network consumer-vpc --range 10.0.0.0/24 --region us-east4
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/cons-net-e4]. NAME REGION NETWORK RANGE STACK_TYPE IPV6_ACCESS_TYPE IPV6_CIDR_RANGE EXTERNAL_IPV6_CIDR_RANGE cons-net-e4 us-east4 consumer-vpc 10.0.0.0/24 IPV4_ONLY
Şimdi, IAP aralık adreslerinin 22 numaralı bağlantı noktasındaki tüketici örneklerine ulaşmasına izin vermek için VPC güvenlik duvarı kuralları oluşturalım.
İlk güvenlik duvarı kuralı için Cloud Shell'den aşağıdaki komutu çalıştırın:
gcloud compute firewall-rules create consumer-allow-iap \ --network consumer-vpc --allow tcp:22 \ --source-ranges 35.235.240.0/20
Çıkış:
Creating firewall...⠹Created [https://www.googleapis.com/compute/v1/projects/<Project-ID>/global/firewalls/consumer-allow-iap]. Creating firewall...done. NAME NETWORK DIRECTION PRIORITY ALLOW DENY DISABLED consumer-allow-iap consumer-vpc INGRESS 1000 tcp:22 False
NAT ağ geçidi oluşturmadan önce, önce bir Cloud Router örneği oluşturmamız gerekir (özel bir ASN numarası kullanırız ancak bu numara bu laboratuvarın etkinlikleriyle ilgili değildir). Cloud Shell'den:
gcloud compute routers create consumer-cr \ --region=us-east4 --network=consumer-vpc \ --asn=65501
Çıkış:
Creating router [consumer-cr]...done. NAME REGION NETWORK consumer-cr us-east4 consumer-vpc
Ardından NAT ağ geçidi örneğini oluşturun. Cloud Shell'den:
gcloud compute routers nats create consumer-nat-gw \ --router=consumer-cr \ --router-region=us-east4 \ --nat-all-subnet-ip-ranges \ --nat-external-ip-pool=nat-address-1
Çıkış:
Creating NAT [consumer-nat-gw] in router [consumer-cr]...done.
Cloud NAT ağ geçidinin varsayılan olarak minPortsPerVm
değeri 64 olacak şekilde oluşturulduğunu unutmayın
Tüketici testi örneklerini oluşturma Daha sonra örnek içinde referans verebilmek için ayrılmış üretici IP'lerini burada doldururuz. Cloud Shell'den:
gcloud compute instances create consumer-instance-1 --zone=us-east4-a \ --machine-type=e2-medium --network-interface=subnet=cons-net-e4,no-address \ --metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2 gcloud compute instances create consumer-instance-2 --zone=us-east4-a \ --machine-type=e2-medium --network-interface=subnet=cons-net-e4,no-address \ --metadata=producer-service-ip1=$producerip1,producer-service-ip2=$producerip2
Çıkış:
Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/consumer-instance-1]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS consumer-instance-1 us-east4-a e2-medium 10.0.0.2 RUNNING Created [https://www.googleapis.com/compute/v1/projects/<Project ID>/zones/us-east4-a/instances/consumer-instance-2]. NAME ZONE MACHINE_TYPE PREEMPTIBLE INTERNAL_IP EXTERNAL_IP STATUS consumer-instance-2 us-east4-a e2-medium 10.0.0.3 RUNNING
7. Varsayılan Cloud NAT davranışını doğrulama
Bu noktada tüketici örnekleri, aynı ayrılmış IP "nat-address-1"i kullanan varsayılan Cloud NAT davranışını kullanır harici adreslerle iletişim kurmanızı sağlar. Ayrıca, Cloud NAT'de DPA henüz etkinleştirilmemiştir.
Aşağıdaki komutu çalıştırarak Cloud NAT'nin tüketici örneklerimizi hangi bağlantı noktalarını ayırdığını doğrulayalım
gcloud compute routers get-nat-mapping-info consumer-cr --region=us-east4
Örnek çıkış
--- instanceName: consumer-instance-1 interfaceNatMappings: - natIpPortRanges: - <NAT Consumer IP1>:1024-1055 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 - natIpPortRanges: - <NAT Consumer IP1>:32768-32799 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 --- instanceName: consumer-instance-2 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1056-1087 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3 - natIpPortRanges: - <NAT Address IP1>:32800-32831 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3
Yukarıdaki çıkıştan görebileceğiniz gibi Cloud NAT, aynı harici IP'den (nat-address-1
) örnek başına 64 bağlantı noktası ayırmıştır.
DPA'yı etkinleştirmeden önce paralel olarak kaç bağlantı açabileceğimizi doğrulayalım.
Birinci tüketici örneğine SSH uygulayın. Cloud Shell'den:
gcloud compute ssh consumer-instance-1 --zone=us-east4-a
Şimdi örnek kabuğunda olmalısınız.
Örnek Çıkış (tam çıkış kısa olması için kısaltıldı)
External IP address was not found; defaulting to using IAP tunneling. ... ... <username>@consumer-instance-1:~$
Tüketici örneğinden önce her iki üretici IP'sini de alıp ortam değişkenleri olarak dolduralım.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
Daha sonra, başarılı bir şekilde ulaşabileceğimizden emin olmak için her iki üretici örneğine kıvrılmaya çalışın.
<username>@consumer-instance-1:~$ curl http://$producerip1/nginx/ <html><body><h1>This is producer instance 1</h1> </body></html> <username>@consumer-instance-1:~$ curl http://$producerip2/nginx/ <html><body><h1>This is producer instance 2</h1> </body></html>
Şimdi, curl'ü bir döngü üzerinden çalıştırarak, üretici örneklerinden biriyle birçok paralel bağlantı oluşturmayı deneyelim. Cloud NAT'nin, kapalı yuvaların 2 dakika boyunca yeniden kullanılmasına izin vermediğini unutmayın. Bu nedenle, tüm bağlantı denemelerini 2 dakika içinde tekrar gözden geçirebildiğimiz sürece paralel bağlantıları bu şekilde simüle edebiliriz.
Örnek SSH oturumunda aşağıdaki komutu çalıştırın
while true; do for i in {1..64}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
64 paralel bağlantıyı başarıyla açmanız beklenir. Komut dosyası aşağıdakini yazdırmalıdır:
Connection # 64 successful Loop Done, Sleeping for 150s Connection # 64 successful Loop Done, Sleeping for 150s
64 paralel bağlantının ötesine geçemediğimizi görmek için, önce tüm eski yuvaların boşaltılması için 2 dakika bekleyin. Sonra aynı tek satırlık ifadeyi aşağıdaki şekilde ayarlayın ve tekrar çalıştırın
while true; do for i in {1..70}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Bu aşamada aşağıdaki çıkışı beklersiniz
Connection # 64 successful Connection # 65 failed Connection # 66 failed Connection # 67 failed Connection # 68 failed Connection # 69 failed Connection # 70 failed Loop Done, Sleeping for 150s
Bu, ilk 64 bağlantının başarılı olurken kalan 6 bağlantının, bağlantı noktalarının kullanılamaması nedeniyle başarısız olduğunu gösterir.
Şimdi SSH kabuğundan çıkıp aşağıdaki bölümde DPA'yı etkinleştirelim.
8. DPA'yı etkinleştirin ve davranışını doğrulayın
DPA'yı etkinleştiren, sanal makine başına minimum bağlantı noktası tahsisini 64 ve maksimum bağlantı noktası ayırmayı 1024 olarak ayarlayan aşağıdaki gcloud komutunu çalıştırın.
gcloud alpha compute routers nats update consumer-nat-gw --router=consumer-cr \ --region=us-east4 --min-ports-per-vm=64 --max-ports-per-vm=1024 \ --enable-dynamic-port-allocation
Şunun çıktısını verir:
Updating nat [consumer-nat-gw] in router [consumer-cr]...done.
Şimdi, her iki örneğin hâlâ yalnızca 64 bağlantı noktası ayrılmış olduğunu onaylamak için get-nat-mapping-info
aracını yeniden çalıştıralım
gcloud compute routers get-nat-mapping-info consumer-cr --region=us-east4
Örnek çıktı (kısa olması için kısaltılmıştır)
--- instanceName: consumer-instance-1 ... - <NAT Consumer IP1>:1024-1055 numTotalNatPorts: 32 ... - natIpPortRanges: - <NAT Consumer IP1>:32768-32799 numTotalNatPorts: 32 ... --- instanceName: consumer-instance-2 ... - <NAT Address IP1>:1056-1087 numTotalNatPorts: 32 ... - <NAT Address IP1>:32800-32831 numTotalNatPorts: 32 ...
Örnek henüz herhangi bir bağlantı noktasını etkin olarak kullanmadığından bağlantı noktası tahsisi açısından çok fazla değişiklik olmadı.
Örneğe SSH uygulayalım:
gcloud compute ssh consumer-instance-1 --zone=us-east4-a
Üretici IP ortamı değişkenlerini yeniden dışa aktarın.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
Paralel bağlantıları simüle etmek için önceki döngüyü tekrar çalıştırın:
while true; do for i in {1..70}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Şimdi aşağıdaki çıkışı görmemiz gerekir
Connection # 64 successful Connection # 65 failed Connection # 66 failed Connection # 70 successful Loop Done, Sleeping for 150s
Peki burada ne oldu? Cloud NAT, bağlantı noktası kullanımında bağlantı noktası tahsisini hızlandırır ancak bunun ağ katmanı genelinde programlanması biraz zaman alır. Bu nedenle, geri kalan bağlantı denemelerini başarıyla tamamlamadan önce 1-3 bağlantı zaman aşımıyla karşılaşıyoruz.
Curl için agresif bir zaman aşımı (5 saniye) belirttik, ancak DPA, bağlantı noktası tahsislerini artırırken daha uzun zaman aşımlarına sahip uygulamaların bağlantıları başarıyla tamamlayabilmesi gerekir.
Bu tür 1024 bağlantı denemeleri için döngü çalıştırıldığında bu yükseliş davranışı daha net görülebilir.
while true; do for i in {1..1024}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Şimdi aşağıdaki çıkışı görmeyi bekliyoruz.
Connection # 64 successful Connection # 65 failed Connection # 66 failed Connection # 129 successful Connection # 130 failed Connection # 131 failed Connection # 258 successful Connection # 259 failed Connection # 260 failed Connection # 515 successful Connection # 516 failed Connection # 1024 successful Loop Done, Sleeping for 150s
Cloud NAT, bağlantı noktalarını 2'nin üssüyle atadığından, her adımda ayırmaları iki katına çıkarır. Bu nedenle, 64 ile 1024 arasındaki 2'nin üsleri etrafında bağlantı zaman aşımlarının vurgulandığını görüyoruz.
maxPortsPerVM
değerini 1024 olarak ayarladığımızdan, 1024'ten fazla bağlantıya geçebileceğimizi düşünmüyoruz. Bunu, curl döngüsünü 1024'ten daha yüksek bir sayıyla yeniden çalıştırarak (eski bağlantı noktalarını sıfırlamak için 2 dakika bekledikten sonra) test edebiliriz.
while true; do for i in {1..1035}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip1/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Beklendiği gibi, çıkış 1024'ten sonraki bağlantıların başarısız olduğunu gösteriyor
<truncated output> ... Connection # 1028 successful Connection # 1029 failed Connection # 1030 failed Connection # 1031 failed Connection # 1032 failed Connection # 1033 failed Connection # 1034 failed Connection # 1035 failed ... Loop Done, Sleeping for 150s
maxPortsPerVM
değerini 1024 olarak ayarlayarak Cloud NAT'ye, bağlantı noktası ayırmalarını sanal makine başına 1024'ten fazla ölçeklendirmemesi talimatını verdik.
SSH oturumundan çıkıp get-nat-mapping-info
uygulamasını yeterince hızlı bir şekilde yeniden çalıştırırsak ayrılmış fazladan bağlantı noktalarını görebiliriz
gcloud compute routers get-nat-mapping-info consumer-cr --region=us-east4
Aşağıdaki çıkışı inceleyin
--- instanceName: consumer-instance-1 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1024-1055 - <NAT Address IP1>1088-1119 -<NAT Address IP1>:1152-1215 - <NAT Address IP1>:1280-1407 - <NAT Address IP1>:1536-1791 numTotalDrainNatPorts: 0 numTotalNatPorts: 512 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 - natIpPortRanges: - <NAT Address IP1>:32768-32799 - <NAT Address IP1>:32832-32863 - <NAT Address IP1>:32896-32959 - <NAT Address IP1>:33024-33151 - <NAT Address IP1>:33536-33791 numTotalDrainNatPorts: 0 numTotalNatPorts: 512 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 --- instanceName: consumer-instance-2 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1056-1087 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3 - natIpPortRanges: - <NAT Address IP1>:32800-32831 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3
consumer-instance-1
için ayrılmış 1024 bağlantı noktası bulunurken consumer-instance-2
için yalnızca 64 bağlantı noktası ayrılmış. DPA'dan önce kolay mümkün olmayan bu yöntem, Cloud NAT için DPA'nın gücünü tam olarak öne çıkarıyordu.
get-nat-mapping-info
komutunu yeniden çalıştırmadan önce 2 dakika beklerseniz consumer-instance-1
ürününün, yalnızca 64 bağlantı noktası ayrılmış olan minimum değerine geri döndüğünü görürsünüz. DPA'nın sadece bağlantı noktası tahsislerini artırma becerisini değil, aynı NAT Ağ Geçidi'nin arkasındaki diğer örneklerin potansiyel kullanımı için kullanılmadığında da serbest bırakma özelliğini gösterir.
9. Cloud NAT Kurallarını DPA ile test etme
Ayrıca kısa süre önce, müşterilerin belirli harici hedefler için belirli NAT IP'leri kullanan kurallar yazmasına olanak tanıyan Cloud NAT için NAT kuralları işlevini de kullanıma sunduk. Daha fazla bilgi için lütfen NAT Kuralları belgeleri sayfasına göz atın.
Bu alıştırmada DPA ve NAT kuralları arasındaki etkileşimi gözlemleyeceğiz. Öncelikle, producer-address-2
ürününe erişirken nat-address-2
kullanılacak bir NAT kuralı tanımlayalım.
Şu gcloud komutunu çalıştırın: Bu komut,
gcloud alpha compute routers nats rules create 100 \ --match='destination.ip == "'$producerip2'"' \ --source-nat-active-ips=nat-address-2 --nat=consumer-nat-gw \ --router=consumer-cr --router-region=us-east4
Aşağıdaki çıktıyı almanız gerekir
Updating nat [consumer-nat-gw] in router [consumer-cr]...done.
Şimdi yeni NAT kuralının etkisini görmek için get-nat-mapping-info
uygulamasını yeniden çalıştıralım.
gcloud alpha compute routers get-nat-mapping-info consumer-cr --region=us-east4
Hangisi şu sonucu verir:
--- instanceName: consumer-instance-1 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1024-1055 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleMappings: - natIpPortRanges: - <NAT Address IP2>:1024-1055 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleNumber: 100 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 - natIpPortRanges: - <NAT Address IP1>:32768-32799 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleMappings: - natIpPortRanges: - <NAT Address IP2>:32768-32799 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleNumber: 100 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2
Artık ruleMappings
hiyerarşisinde özellikle nat-address-2
için ayrılmış ek bağlantı noktalarımız olduğuna dikkat edin (belirtilen minimum değer 64'tür).
Peki bir örnek, NAT kuralı tarafından belirtilen hedefe çok sayıda bağlantı açarsa ne olur? Haydi öğrenelim.
Örneğe SSH uygulayalım:
gcloud compute ssh consumer-instance-1 --zone=us-east4-a
Üretici IP ortamı değişkenlerini yeniden dışa aktarın.
export producerip1=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip1" -H "Metadata-Flavor: Google"` export producerip2=`curl -s "http://metadata.google.internal/computeMetadata/v1/instance/attributes/producer-service-ip2" -H "Metadata-Flavor: Google"`
Şimdi curl döngüsünü bu kez producerip2
karşısında tekrar çalıştıralım
while true; do for i in {1..1024}; do curl -s -o /dev/null --connect-timeout 5 http://$producerip2/nginx/; if [ $? -ne 0 ] ; then echo -e "\nConnection # $i failed" ; else echo -en "\rConnection # $i successful"; fi; done; echo -e "\nLoop Done, Sleeping for 150s"; sleep 150; done
Şuna benzer bir çıkış alırsınız:
Connection # 64 successful Connection # 65 failed Connection # 66 failed Connection # 129 successful Connection # 130 failed Connection # 131 failed Connection # 258 successful Connection # 259 failed Connection # 260 failed Connection # 515 successful Connection # 516 failed Connection # 1024 successful Loop Done, Sleeping for 150s
Temel olarak önceki teste benzer. Örneğin SSH oturumundan çıkıp nat eşlemelerine tekrar bakalım.
gcloud alpha compute routers get-nat-mapping-info consumer-cr --region=us-east4
Hangisi şu sonucu verir:
--- instanceName: consumer-instance-1 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1024-1055 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleMappings: - natIpPortRanges: - <NAT Address IP2>:1024-1055 - <NAT Address IP2>:1088-1119 - <NAT Address IP2>:1152-1215 - <NAT Address IP2>:1280-1407 - <NAT Address IP2>:1536-1791 numTotalDrainNatPorts: 0 numTotalNatPorts: 512 ruleNumber: 100 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 - natIpPortRanges: - <NAT Address IP1>:32768-32799 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleMappings: - natIpPortRanges: - <NAT Address IP2>:32768-32799 - <NAT Address IP2>:32832-32863 - <NAT Address IP2>:32896-32959 - <NAT Address IP2>:33024-33151 - <NAT Address IP2>:33280-33535 numTotalDrainNatPorts: 0 numTotalNatPorts: 512 ruleNumber: 100 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 --- instanceName: consumer-instance-2 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1056-1087 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleMappings: - natIpPortRanges: - <NAT Address IP2>:1056-1087 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleNumber: 100 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3 - natIpPortRanges: - <NAT Address IP1>:32800-32831 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleMappings: - natIpPortRanges: - <NAT Address IP2>:32800-32831 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleNumber: 100 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.3 --- instanceName: consumer-instance-1 interfaceNatMappings: - natIpPortRanges: - <NAT Address IP1>:1024-1055 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleMappings: - natIpPortRanges: - <NAT Address IP2>:1024-1055 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleNumber: 100 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2 - natIpPortRanges: - <NAT Address IP1>:32768-32799 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleMappings: - natIpPortRanges: - <NAT Address IP2>:32768-32799 numTotalDrainNatPorts: 0 numTotalNatPorts: 32 ruleNumber: 100 sourceAliasIpRange: '' sourceVirtualIp: 10.0.0.2
Yukarıda gözlemleyebileceğiniz gibi consumer-instance-1
ürününün varsayılan NAT IP'sine ( nat-address-1
için IP) hâlâ yalnızca 64 bağlantı noktası ayrılmış ancak NAT kuralının IP'sine (nat-address-2
için IP) 1024 bağlantı noktası ayrılmış. Bu sırada consumer-instance-2
tüm NAT IP'leri için 64 bağlantı noktasının varsayılan ayırmalarını korudu.
Alıştırma olarak, tersi test edebilirsiniz. Cloud NAT'nin tüm ek bağlantı noktalarını ayırmasına izin verin, ardından curl döngüsünü producerip1
doğrultusunda çalıştırın ve get-nat-mapping-info
çıkışı üzerindeki etkilerini gözlemleyin.
10. Temizleme Adımları
Yinelenen ödemelerden kaçınmak için bu codelab ile ilişkili tüm kaynakları silmeniz gerekir.
Önce tüm örnekleri silin.
Cloud Shell'den:
gcloud compute instances delete consumer-instance-1 consumer-instance-2 \ producer-instance-1 producer-instance-2 \ --zone us-east4-a --quiet
Beklenen çıkış :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/consumer-instance-2]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project Id>/zones/us-east4-a/instances/producer-instance-2].
Ardından, Cloud Yönlendirici'yi silin. Cloud Shell'den:
gcloud compute routers delete consumer-cr \ --region us-east4 --quiet
Aşağıdaki çıktıyı almanız gerekir :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/routers/consumer-cr].
Tüm harici IP adreslerini serbest bırakın. Cloud Shell'den:
gcloud compute addresses delete nat-address-1 \ nat-address-2 producer-address-1 \ producer-address-2 --region us-east4 --quiet
Aşağıdaki çıktıyı almanız gerekir :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-2]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/nat-address-3]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-1]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/addresses/producer-address-2].
VPC güvenlik duvarı kurallarını silin. Cloud Shell'den:
gcloud compute firewall-rules delete consumer-allow-iap \ producer-allow-80 --quiet
Aşağıdaki çıktıyı almanız gerekir :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/consumer-allow-iap]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/firewalls/producer-allow-80].
Alt ağları silin. Cloud Shell'den:
gcloud compute networks subnets delete cons-net-e4 \ prod-net-e4 --region=us-east4 --quiet
Aşağıdaki çıktıyı almanız gerekir :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/cons-net-e4]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/regions/us-east4/subnetworks/prod-net-e4].
Son olarak VPC'leri silelim. Cloud Shell'den:
gcloud compute networks delete consumer-vpc \ producer-vpc --quiet
Aşağıdaki çıktıyı almanız gerekir :
Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/consumer-vpc]. Deleted [https://www.googleapis.com/compute/v1/projects/<Project ID>/global/networks/producer-vpc].
11. Tebrikler!
Cloud NAT DPA Lab'ini tamamladınız.
İşlediğiniz konular
- DPA hazırlığı için Cloud NAT ağ geçidi ayarlama.
- DPA olmadan bağlantı noktası ayırmalarını inceleme.
- NAT ağ geçidi için DPA'yı etkinleştirme ve yapılandırma.
- Paralel çıkış bağlantıları çalıştırarak DPA'nın etkilerini gözlemleme.
- DPA etkin durumdayken NAT Ağ Geçidi'ne NAT kuralları ekleme.
- Birden fazla hedefe çıkış bağlantıları çalıştırarak DPA davranışını Kurallar ile görme.
Sonraki Adımlar
- Dinamik Bağlantı Noktası Ayırma belgeleri sayfamıza göz atın
- Uygulamanızla NAT zaman aşımları ve bağlantı noktası ayırma değerlerini düzenleyerek denemeler yapın.
- Google Cloud Platform'da Ağ İletişimi hakkında daha fazla bilgi
©Google, Inc. veya satış ortakları. Tüm hakları saklıdır. Bu içeriği dağıtmayın.