Tüm Ürünler
Search
Belge Merkezi

Container Service for Kubernetes:Use Network Policy

Son Güncelleme:Oct 06, 2026

ACK Serverless kümelerinde pod düzeyindeki trafiği Poseidon eklentisi ile kontrol etmek için Network Policy özelliğini etkinleştirin.

Önkoşullar

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 endPort alanı 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.

  1. Poseidon eklentisini yükleyin.

    1. ACK konsolu oturumunu açın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.

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

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

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

  1. ACK konsolu oturumunu açın. Sol gezinme bölmesinde Clusters seçeneğine tıklayın.

  2. Clusters sayfasında hedef kümenin adına tıklayın ve sol gezinme bölmesinde Workloads > Deployments seçeneğini belirleyin.

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

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

  5. busybox istemci uygulamasının Nginx Service öğesine erişebildiğini doğrulayın.

    1. Deployments sayfasında busybox uygulamasının adına tıklayın.

    2. Pods sekmesinde busybox-{hash değeri} pod'unu bulun ve Actions sütununda Terminal seçeneğine tıklayın.

      image.png

    3. busybox komut satırı terminalinde Nginx'e erişimi test etmek için wget nginx komutunu çalıştırın.

      connection

      Çıktı, busybox uygulamasının Nginx Service öğesine erişebildiğini gösterir.

CLI'yı kullanma

  1. 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=nginx

    Beklenen çıktı:

    pod/nginx created

    Pod'un başlatılıp başlatılmadığını kontrol edin:

    kubectl get pod

    Beklenen çıktı:

    NAME                     READY   STATUS    RESTARTS   AGE
    nginx                    1/1     Running   0          45s

    nginx adlı bir Service oluşturun:

    kubectl expose pod nginx --port=80

    Beklenen çıktı:

    service/nginx exposed

    Service'i görüntüleyin:

    kubectl get service

    Beklenen çı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
  2. 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/sh

    Beklenen çı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

  1. vim policy.yaml komutunu çalıştırarak policy.yaml adlı bir dosya oluşturun ve aşağıdaki YAML şablonunu dosyaya ekleyin.

    vim policy.yaml

    Aş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"
  2. policy.yaml dosyasından bir ağ ilkesi oluşturmak için aşağıdaki komutu çalıştırın.

    kubectl apply -f policy.yaml 

    Beklenen çıktı:

    networkpolicy.networking.k8s.io/access-nginx created
  3. 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/sh

    nginx Service öğesine erişimi test edin:

    wget nginx

    Beklenen çıktı:

    Connecting to nginx (172.19.XX.XX:80)
    wget: can't connect to remote host (172.19.XX.XX): Connection timed out
  4. 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/sh

    Nginx Service öğesine erişimi test edin:

    wget nginx

    Beklenen çı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

  1. 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=LoadBalancer belirtin.

    vim nginx-service.yaml

    Aş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: LoadBalancer

    nginx-service.yaml dosyasından bir ağ ilkesi oluşturmak için aşağıdaki komutu çalıştırın.

    kubectl apply -f nginx-service.yaml 

    Beklenen çıktı:

    service/nginx-slb created

    Uygulamanın Nginx hizmetini dışa aktardığını kontrol edin:

    kubectl get service nginx-slb

    Beklenen çı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
  2. 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.xxx

    Beklenen çıktı:

    --2018-11-21 11:46:05--  http://47.110.xx.xxx/
    Connecting to 47.110.XX.XX:80... failed: Connection refused.
    Not

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

  3. Yerel IP adresinizi görüntülemek için aşağıdaki komutu çalıştırın.

    curl myip.ipip.net

    Beklenen çıktı:

    Current IP: 10.0.x.x From: China Beijing Beijing        # This is an example. Use the actual device information.
  4. policy.yaml dosyasını değiştirmek için aşağıdaki komutu çalıştırın.

    vim policy.yaml

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

    Beklenen çıktı:

    networkpolicy.networking.k8s.io/access-nginx unchanged
    Not
    • Bazı ağlarda birden çok gidiş IP adresi bulunur. /24 adres aralığı kullanmanız önerilir.

    • SLB sağlık denetimi adresleri 100.64.0.0/10 CIDR bloğundadır. Bu nedenle 100.64.0.0/10 bloğunu izin listesine eklemeniz gerekir.

  5. 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/sh

    nginx hizmetine erişin:

    wget 47.110.XX.XX

    Beklenen çı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

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

    Beklenen çı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
  2. busybox-policy.yaml adlı bir dosya oluşturun.

    vim busybox-policy.yaml

    busybox-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: 53
    Not

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

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

    Beklenen çıktı:

    networkpolicy.networking.k8s.io/busybox-policy created
  4. 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/sh

    www.aliyun.com dışındaki bir web sitesine, örneğin www.taobao.com adresine erişin:

    wget www.taobao.com

    Beklenen çıktı:

    Connecting to www.taobao.com (64.13.XX.XX:80)
    wget: can't connect to remote host (64.13.XX.XX): Connection timed out

    can't connect to remote host mesajı erişimin başarısız olduğunu gösterir.

  5. www.aliyun.com adresine erişmek için aşağıdaki komutu çalıştırın.

    wget www.aliyun.com

    Beklenen çı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

Önemli

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.

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

    Beklenen çıktı:

    namespace/test-np created
  2. 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.yaml

    Aş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/8

    default-deny.yaml dosyasının oluşturulduğunu doğrulayın.

    kubectl apply -f default-deny.yaml

    Beklenen çıktı:

    networkpolicy.networking.k8s.io/deny-public-net created

    Ağ ilkesini görüntüleyin:

    kubectl get networkpolicy -n test-np

    Beklenen çıktı:

    NAME                              POD-SELECTOR          AGE
    deny-public-net                   <none>                1m
  3. 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.yaml

    Bu ö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.yaml

    Beklenen çıktı:

    networkpolicy.networking.k8s.io/allow-public-network-for-labels created

    Ağ ilkesini görüntüleyin:

    kubectl get networkpolicy -n test-np

    Beklenen çıktı:

    NAME                              POD-SELECTOR          AGE
    allow-public-network-for-labels   public-network=true    1m
    deny-public-net                   <none>                 3m
  4. Ö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-intranet
    ping aliyun.com

    Beklenen çıktı:

    PING aliyun.com (106.11.2xx.xxx): 56 data bytes
    ^C
    --- aliyun.com ping statistics ---
    9 packets transmitted, 0 packets received, 100% packet loss

    0 packets received mesajı erişimin başarısız olduğunu gösterir.

    Not

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

  5. 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-internet
    ping aliyun.com

    Beklenen çı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 ms

    0% packet loss mesajı hizmete başarıyla erişildiğini gösterir.

    Not

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