ACK Serverless kümelerinde pod düzeyindeki trafiği Poseidon eklentisi ile kontrol etmek için Network Policy özelliğini etkinleştirin.
Önkoşullar
-
Bir ACK managed cluster veya ACK dedicated cluster oluşturun. Bkz. ACK managed cluster oluşturma veya ACK dedicated cluster oluşturma (Kullanımdan Kaldırıldı).
ÖnemliACK managed cluster Pro ve ACK Serverless Pro kümelerinde Network Policy farklı eklentiler tarafından uygulanır.
ACK managed cluster Pro kümesinde (elastic container instances olmayan düğümler için) Network Policy, Terway ağ eklentisi tarafından uygulanır. Bkz. ACK kümelerinde Network Policy etkinleştirme.
ACK Serverless kümelerinde ve ACK managed Pro kümelerinde bulunan elastic container instances (ECI) üzerinde Network Policy, Poseidon eklentisi tarafından uygulanır.
ACK Virtual Node eklentisini v2.10.0 veya sonraki bir sürüme yükseltin. Bkz. Bileşenleri yönetme.
Küme için bir güvenlik grubu yapılandırın.
Sınırlamalar
Network Policy yalnızca ACK Serverless Pro ve ACK managed cluster Pro kümelerinde desteklenir.
Network Policy IPv6 adreslerini desteklemez.
NetworkPolicy içindeki
endPortalanı desteklenmez.NetworkPolicy kuralları ad alanlarını veya pod'ları eşleştirmek için etiket seçicileri kullanır. Çok sayıda NetworkPolicy kaynağı kural yayılımını yavaşlatır ve yönetimi ile sorun gidermeyi karmaşıklaştırır. Küme başına NetworkPolicy kaynağı sayısını 40'ın altında tutun.
1. Adım: Network Policy Etkinleştirme
Bir ACK Serverless Pro kümesinde Network Policy özelliğini etkinleştirmek için Poseidon eklentisini yükleyin.
-
Poseidon eklentisini yükleyin.
ACK konsolu oturumunu açın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.
Clusters sayfasında hedef kümenin adına tıklayın. Sol gezinme bölmesinde Components and Add-ons seçeneğine tıklayın.
Components and Add-ons sayfasında Install seçeneğine tıklayın. Networking sekmesinde Poseidon kartını bulun ve Next seçeneğine tıklayın.
-
Install Component iletişim kutusunda Enable NetworkPolicy for ACS/ECI Instances seçeneğini belirleyin, Next seçeneğine tıklayın ve ardından OK seçeneğine tıklayın.
Yükleme tamamlandıktan sonra kart üzerinde Installed durumu görünür.
2. Adım: Bir nginx uygulaması oluşturma ve test etme
Konsolu kullanma
ACK konsolu oturumunu açın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.
Clusters sayfasında hedef kümenin adına tıklayın ve sol gezinme bölmesinde seçeneğini belirleyin.
-
Deployments sayfasında Create from Image seçeneğine tıklayın. Create sihirbazında nginx adlı bir uygulama oluşturun ve bunu bir Service kullanarak dışa aktarın. Uygulamayı yapılandırdıktan sonra Create seçeneğine tıklayın.
Bu örnekte Nginx uygulaması için yalnızca aşağıdaki öğeleri yapılandırın ve diğer parametreler için varsayılan ayarları koruyun. Yapılandırmalar hakkında daha fazla bilgi için bkz. Durumsuz iş yükü oluşturma (Dağıtım).
Yapılandırma öğesi
Açıklama
Örnek değer
Basic Information
Name
Özel bir ad.
nginx
Replicas
Gereksinimlerinize göre seçin.
1
Container
Image Name
Konteyneri başlatmak için kullanılan görüntünün adı.
nginx:latest
Advanced
Services
Services öğesinin sağ tarafında hizmet yapılandırma öğelerini ayarlamak için Create seçeneğine tıklayın.
Name: nginx
Service Type:
Cluster IP
SLB
Node Port
Port Mapping:
Name: nginx
Service Port: 80
Container Port: 80
Protocol: TCP
-
Deployments sayfasında Create from Image seçeneğine tıklayın. Açılan Create sihirbazında önceki adımda oluşturduğunuz nginx Service öğesine erişimi test etmek için busybox adlı bir istemci uygulaması oluşturun.
Bu örnekte busybox istemci uygulaması için yalnızca aşağıdaki öğeleri yapılandırın ve diğer parametreler için varsayılan ayarları koruyun. Yapılandırmalar hakkında daha fazla bilgi için bkz. Durumsuz iş yükü oluşturma (Dağıtım).
Yapılandırma öğesi
Açıklama
Örnek değer
Basic Information
Name
Özel bir ad.
busybox
Replicas
Gereksinimlerinize göre bir değer girin.
1
Container
Image Name
Konteyneri başlatmak için kullanılan görüntünün adı.
busybox:latest
Container Start Parameter
Yok
stdin ve tty seçeneklerini belirleyin
-
busybox istemci uygulamasının Nginx Service öğesine erişebildiğini doğrulayın.
Deployments sayfasında busybox uygulamasının adına tıklayın.
-
Pods sekmesinde busybox-{hash değeri} pod'unu bulun ve Actions sütununda Terminal seçeneğine tıklayın.

-
busybox komut satırı terminalinde Nginx'e erişimi test etmek için
wget nginxkomutunu çalıştırın.
Çıktı, busybox uygulamasının Nginx Service öğesine erişebildiğini gösterir.
CLI'yı kullanma
-
Bir Nginx uygulaması oluşturmak ve bunu nginx adlı bir Service kullanarak dışa aktarmak için aşağıdaki komutları çalıştırın.
Nginx uygulaması oluşturun:
kubectl run nginx --image=nginxBeklenen çıktı:
pod/nginx createdPod'un başlatılıp başlatılmadığını kontrol edin:
kubectl get podBeklenen çıktı:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 45snginx adlı bir Service oluşturun:
kubectl expose pod nginx --port=80Beklenen çıktı:
service/nginx exposedService'i görüntüleyin:
kubectl get serviceBeklenen çıktı:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 172.XX.XX.1 <none> 443/TCP 30m nginx ClusterIP 172.XX.XX.48 <none> 80/TCP 12s -
busybox adlı bir pod oluşturmak ve nginx adlı Service'e erişmek için aşağıdaki komutu çalıştırın.
kubectl run busybox --rm -ti --image=busybox /bin/shBeklenen çıktı:
If you don't see a command prompt, try pressing enter. / # / #nginx'e erişin:
If you don't see a command prompt, try pressing enter. / # / # wget nginx # Enter wget nginx here.Beklenen çıktı:
Connecting to nginx (172.XX.XX.48:80) saving to 'index.html' index.html 100% |****************************************************************************************************************************************************| 612 0:00:00 ETA 'index.html' saved
3. Adım: Ağ ilkesi kullanma
Pod trafiğini etikete, CIDR bloğuna, gidiş hedefine veya genel ağ erişimine göre kısıtlamak için NetworkPolicy kaynaklarını uygulayın.
Senaryo 1: Belirli etiketlere sahip uygulamalara hizmet erişimini ağ ilkesi ile kısıtlama
-
vim policy.yamlkomutunu çalıştırarak policy.yaml adlı bir dosya oluşturun ve aşağıdaki YAML şablonunu dosyaya ekleyin.vim policy.yamlAşağıda YAML dosyasının içeriği verilmiştir.
kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: access: "true" -
policy.yaml dosyasından bir ağ ilkesi oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f policy.yamlBeklenen çıktı:
networkpolicy.networking.k8s.io/access-nginx created -
nginx Service öğesine erişimi test etmek için aşağıdaki komutları çalıştırın. Erişim etiketi tanımlanmadığından istek zaman aşımına uğrar.
kubectl run busybox --rm -ti --image=busybox /bin/shnginx Service öğesine erişimi test edin:
wget nginxBeklenen çıktı:
Connecting to nginx (172.19.XX.XX:80) wget: can't connect to remote host (172.19.XX.XX): Connection timed out -
Erişim etiketini tanımlamak için aşağıdaki komutları çalıştırın.
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shNginx Service öğesine erişimi test edin:
wget nginxBeklenen çıktı:
Connecting to nginx (172.21.XX.XX:80) saving to 'index.html' index.html 100% |****************************************************************************************************************************************************| 612 0:00:00 ETA 'index.html' savedÇıktı, bağlantı ilerlemesinin %100 olduğunu gösterir. Bu durum, isteğin başarılı olduğunu ve Nginx hizmetine erişilebildiğini ifade eder.
Senaryo 2: İnternet'e açık bir hizmete erişebilecek kaynak CIDR bloklarını ağ ilkesi ile kısıtlama
-
nginx uygulaması için bir Alibaba Cloud SLB örneği oluşturmak amacıyla aşağıdaki komutu çalıştırın. nginx hizmetini İnternet'e açmak için
type=LoadBalancerbelirtin.vim nginx-service.yamlAşağıda nginx-service.yaml dosyasının şablonu verilmiştir.
# Paste the following YAML content into nginx-service.yaml. apiVersion: v1 kind: Service metadata: labels: run: nginx name: nginx-slb spec: externalTrafficPolicy: Local ports: - port: 80 protocol: TCP targetPort: 80 selector: run: nginx type: LoadBalancernginx-service.yaml dosyasından bir ağ ilkesi oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f nginx-service.yamlBeklenen çıktı:
service/nginx-slb createdUygulamanın Nginx hizmetini dışa aktardığını kontrol edin:
kubectl get service nginx-slbBeklenen çıktı:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE nginx-slb LoadBalancer 172.19.xx.xxx 47.110.xxx.xxx 80:32240/TCP 8m -
Yeni oluşturulan SLB örneğinin IP adresine 47.110.xxx.xxx erişmek için aşağıdaki komutu çalıştırın. Erişim başarısız olur.
wget 47.110.xxx.xxxBeklenen çıktı:
--2018-11-21 11:46:05-- http://47.110.xx.xxx/ Connecting to 47.110.XX.XX:80... failed: Connection refused.NotErişimin başarısız olmasının nedenleri şunlardır:
Yapılandırılan nginx Service öğesine yalnızca
access=trueözel etiketine sahip uygulamalar erişebilir.SLB örneğinin IP adresine erişmek, Kubernetes'e yönelik harici erişim olarak kabul edilir. Bu durum, hizmet erişimini belirli etiketlere sahip uygulamalarla kısıtlama senaryosundan farklıdır.
Çözüm: İzin verilen kaynak CIDR bloğunu eklemek için ağ ilkesini değiştirin.
-
Yerel IP adresinizi görüntülemek için aşağıdaki komutu çalıştırın.
curl myip.ipip.netBeklenen çıktı:
Current IP: 10.0.x.x From: China Beijing Beijing # This is an example. Use the actual device information. -
policy.yaml dosyasını değiştirmek için aşağıdaki komutu çalıştırın.
vim policy.yamlpolicy.yaml dosyasını aşağıdaki içeriği içerecek şekilde değiştirin:
# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: access-nginx spec: podSelector: matchLabels: run: nginx ingress: - from: - podSelector: matchLabels: access: "true" - ipBlock: cidr: 100.64.0.0/10 - ipBlock: cidr: 10.0.0.1/24 # Local IP address. This is an example. Use the actual device information.policy.yaml dosyasından bir ağ ilkesi oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f policy.yamlBeklenen çıktı:
networkpolicy.networking.k8s.io/access-nginx unchangedNotBazı ağlarda birden çok gidiş IP adresi bulunur. /24 adres aralığı kullanmanız önerilir.
SLB sağlık denetimi adresleri
100.64.0.0/10CIDR bloğundadır. Bu nedenle100.64.0.0/10bloğunu izin listesine eklemeniz gerekir.
-
Nginx hizmetine erişmek için aşağıdaki komutu çalıştırın.
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shnginx hizmetine erişin:
wget 47.110.XX.XXBeklenen çıktı:
Connecting to 47.110.XX.XX (47.110.XX.XX:80) index.html 100% |***********************************************************| 612 0:00:00 ETAÇıktı, bağlantı ilerlemesinin %100 olduğunu gösterir. Bu durum, Nginx hizmetine başarıyla eriştiğiniz anlamına gelir.
Senaryo 3: Bir pod'un yalnızca belirtilen bir adrese erişmesini ağ ilkesi ile kısıtlama
-
www.aliyun.com alan adının çözümlendiği IP adreslerinin listesini almak için aşağıdaki komutu çalıştırın.
dig +short www.aliyun.comBeklenen çıktı:
www-jp-de-intl-adns.aliyun.com. www-jp-de-intl-adns.aliyun.com.gds.alibabadns.com. v6wagbridge.aliyun.com. v6wagbridge.aliyun.com.gds.alibabadns.com. 106.XX.XX.21 140.XX.XX.4 140.XX.XX.13 140.XX.XX.3 -
busybox-policy.yaml adlı bir dosya oluşturun.
vim busybox-policy.yamlbusybox-policy.yaml dosyası için aşağıdaki şablonu kullanın:
# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: busybox-policy spec: podSelector: matchLabels: run: busybox egress: - to: - ipBlock: cidr: 106.XX.XX.21/32 - ipBlock: cidr: 140.XX.XX.4/32 - ipBlock: cidr: 140.XX.XX.13/32 - ipBlock: cidr: 140.XX.XX.3/32 - to: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: {} ports: - protocol: UDP port: 53Notbusybox-policy.yaml dosyasında uygulamanın giden erişimini kısıtlamak için egress kuralları yapılandırılmıştır. Aksi takdirde DNS çözümlemesi başarısız olur; bu nedenle UDP isteklerine izin verecek kuralları yapılandırmanız gerekir.
-
busybox-policy.yaml dosyasından bir ağ ilkesi oluşturmak için aşağıdaki komutu çalıştırın.
kubectl apply -f busybox-policy.yamlBeklenen çıktı:
networkpolicy.networking.k8s.io/busybox-policy created -
Bir busybox pod'u oluşturmak ve erişimi test etmek için aşağıdaki komutu çalıştırın.
kubectl run busybox --rm -ti --image=busybox /bin/shwww.aliyun.com dışındaki bir web sitesine, örneğin www.taobao.com adresine erişin:
wget www.taobao.comBeklenen çıktı:
Connecting to www.taobao.com (64.13.XX.XX:80) wget: can't connect to remote host (64.13.XX.XX): Connection timed outcan't connect to remote host mesajı erişimin başarısız olduğunu gösterir.
-
www.aliyun.com adresine erişmek için aşağıdaki komutu çalıştırın.
wget www.aliyun.comBeklenen çıktı:
Connecting to www.aliyun.com (140.205.XX.XX:80) Connecting to www.aliyun.com (140.205.XX.XX:443) wget: note: TLS certificate validation not implemented index.html 100% |***********************************************************| 462k 0:00:00 ETAÇıktı, bağlantı ilerlemesinin %100 olduğunu gösterir. Bu durum, hizmete başarıyla erişildiği anlamına gelir.
Senaryo 4: Bir ad alanındaki pod'lar için genel ağ erişimini ağ ilkesi ile kontrol etme
Bu işlem, genel ağa erişen çevrimiçi hizmetleri etkileyebilir. Aşağıdaki işlemleri boş bir ad alanında gerçekleştirmeniz önerilir.
-
Bir test ad alanı oluşturmak için aşağıdaki komutu çalıştırın.
test-np adlı bir ad alanı oluşturun.
kubectl create ns test-npBeklenen çıktı:
namespace/test-np created -
Ad alanı için yalnızca özel ağlara giden erişime izin veren varsayılan bir ağ ilkesi oluşturmak amacıyla aşağıdaki komutu çalıştırın.
vim default-deny.yamlAşağıda default-deny.yaml dosyası için örnek bir şablon verilmiştir:
# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: namespace: test-np name: deny-public-net spec: podSelector: {} ingress: - from: - ipBlock: cidr: 0.0.0.0/0 egress: - to: - ipBlock: cidr: 192.168.0.0/16 - ipBlock: cidr: 172.16.0.0/12 - ipBlock: cidr: 10.0.0.0/8default-deny.yaml dosyasının oluşturulduğunu doğrulayın.
kubectl apply -f default-deny.yamlBeklenen çıktı:
networkpolicy.networking.k8s.io/deny-public-net createdAğ ilkesini görüntüleyin:
kubectl get networkpolicy -n test-npBeklenen çıktı:
NAME POD-SELECTOR AGE deny-public-net <none> 1m -
Belirli bir etikete sahip pod'ların genel ağa erişmesine izin veren bir ağ ilkesi oluşturmak için aşağıdaki komutu çalıştırın.
vim allow-specify-label.yamlBu örnekte etiket
public-network=trueşeklindedir.# The following is the content of the YAML file. kind: NetworkPolicy apiVersion: networking.k8s.io/v1 metadata: name: allow-public-network-for-labels namespace: test-np spec: podSelector: matchLabels: public-network: "true" ingress: - from: - ipBlock: cidr: 0.0.0.0/0 egress: - to: - ipBlock: cidr: 0.0.0.0/0 - namespaceSelector: matchLabels: ns: kube-system # Allows pods to access key services in kube-system (such as CoreDNS). This is an example. Configure as needed.Ağ ilkesini oluşturmak için aşağıdaki komutu çalıştırın:
kubectl apply -f allow-specify-label.yamlBeklenen çıktı:
networkpolicy.networking.k8s.io/allow-public-network-for-labels createdAğ ilkesini görüntüleyin:
kubectl get networkpolicy -n test-npBeklenen çıktı:
NAME POD-SELECTOR AGE allow-public-network-for-labels public-network=true 1m deny-public-net <none> 3m -
Özel etikete sahip olmayan bir pod'un genel ağa erişemediğini doğrulamak için aşağıdaki komutları çalıştırın.
kubectl run -it --namespace test-np --rm --image registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 busybox-intranetping aliyun.comBeklenen çıktı:
PING aliyun.com (106.11.2xx.xxx): 56 data bytes ^C --- aliyun.com ping statistics --- 9 packets transmitted, 0 packets received, 100% packet loss0 packets received mesajı erişimin başarısız olduğunu gösterir.
Nottest-np ad alanındaki pod'lar için genel ağ erişimini varsayılan olarak kısıtlayan deny-public-net ağ ilkesi nedeniyle erişim başarısız oldu. Bu nedenle, bu ad alanında varsayılan etiketlerle başlatılan pod'lar genel ağa erişemez.
-
public-network=true etiketine sahip bir pod'un genel ağa erişebildiğini doğrulamak için aşağıdaki komutu çalıştırın.
kubectl run -it --namespace test-np --labels public-network=true --rm --image registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 busybox-internetping aliyun.comBeklenen çıktı:
PING aliyun.com (106.11.1xx.xx): 56 data bytes 64 bytes from 106.11.1xx.xx: seq=0 ttl=47 time=4.235 ms 64 bytes from 106.11.1xx.xx: seq=1 ttl=47 time=4.200 ms 64 bytes from 106.11.1xx.xx: seq=2 ttl=47 time=4.182 ms ^C --- aliyun.com ping statistics --- 3 packets transmitted, 3 packets received, 0% packet loss round-trip min/avg/max = 4.182/4.205/4.235 ms0% packet loss mesajı hizmete başarıyla erişildiğini gösterir.
Notpublic-network=true etiketine sahip pod'lar için genel ağ erişimine izin veren allow-public-network-for-labels ağ ilkesi nedeniyle erişim başarılı oldu. Bu nedenle, bu etikete sahip olan busybox-internet pod'u genel ağa erişebilir.