All Products
Search
Document Center

Container Compute Service:Gunakan kebijakan jaringan di kluster ACS

Last Updated:Mar 06, 2026

Alibaba Cloud Container Compute Service (ACS) menyediakan kontrol jaringan berbasis kebijakan menggunakan Kubernetes NetworkPolicy. Untuk mengontrol network traffic pada level alamat IP atau port bagi aplikasi tertentu di kluster Anda, gunakan kebijakan jaringan. Topik ini menjelaskan cara menggunakan kebijakan jaringan di kluster ACS beserta skenario umum.

Batasan

  • Hanya Pod CPU bertipe instans general-purpose dan compute-optimized yang didukung.

  • Hanya IPv4 yang didukung. IPv6 tidak didukung.

Catatan

  • Aturan NetworkPolicy memilih namespace atau Pod menggunakan LabelSelector. Seiring bertambahnya jumlah NetworkPolicy yang diterapkan pada Pod, waktu yang dibutuhkan agar aturan diterapkan juga meningkat. Selain itu, banyaknya aturan NetworkPolicy dapat memperumit management dan troubleshooting kluster. Oleh karena itu, batasi jumlah NetworkPolicy dalam kluster Anda hingga di bawah 40.

Langkah 1: Aktifkan kebijakan jaringan

  1. Instal komponen Poseidon.

    1. Masuk ke Konsol ACS. Di panel navigasi sebelah kiri, klik Clusters.

    2. Pada halaman Clusters, temukan kluster target dan klik ID-nya. Di panel navigasi sebelah kiri, pilih Add-ons.

    3. Pada halaman Component Management, klik tab Network. Di pojok kanan bawah kartu komponen Poseidon, klik Install.

    4. Pada halaman Install Component Poseidon, pilih Enable NetworkPolicy lalu klik Confirm.

      image.png

      Setelah komponen terinstal, status Installed akan muncul di pojok kanan atas kartu.

  2. Aktifkan NetworkPolicy di anotasi Pod.

    Untuk kontainer yang memerlukan NetworkPolicy, tambahkan anotasi berikut: network.alibabacloud.com/enable-network-policy-agent: "true". Berikut contohnya:

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        network.alibabacloud.com/enable-network-policy-agent: "true"
      name: example
      namespace: default
    spec:
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: example

Langkah 2: Buat aplikasi uji coba Nginx yang dapat diakses oleh Pod lain

kubectl

  1. Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.

  2. Buat aplikasi nginx dan gunakan Service bernama nginx untuk berkomunikasi dengannya.

    Buat aplikasi nginx:

    kubectl run nginx --image=nginx

    Output yang diharapkan:

    pod/nginx created

    Periksa apakah Pod sudah berjalan:

    kubectl get pod

    Output yang diharapkan:

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

    Buat Service bernama nginx:

    kubectl expose pod nginx --port=80

    Output yang diharapkan:

    service/nginx exposed

    Lihat Service:

    kubectl get service

    Output yang diharapkan:

    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
  3. Buat Pod bernama busybox untuk mengakses Service bernama nginx.

    kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/sh

    Output yang diharapkan:

    If you don't see a command prompt, try pressing enter.
    / #
    / #

    Uji koneksi ke nginx:

    wget nginx

    Output yang diharapkan:

    Connecting to nginx (172.XX.XX.48:80)
    saving to 'index.html'
    index.html           100% |****************************************************************************************************************************************************|   612  0:00:00 ETA
    'index.html' saved

Langkah 3: Gunakan kebijakan jaringan

Anda dapat menggunakan kebijakan jaringan sesuai kebutuhan dalam skenario berikut.

Skenario 1: Gunakan kebijakan jaringan untuk mengizinkan akses hanya dari aplikasi dengan label tertentu

kubectl

  1. Gunakan template YAML berikut dan jalankan perintah vim policy.yaml untuk membuat file bernama policy.yaml.

    vim policy.yaml

    Berikut konten file YAML.

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: access-nginx
    spec:
      podSelector:
        matchLabels:
          run: nginx
      ingress:
      - from:
        - podSelector:
            matchLabels:
              access: "true"
  2. Buat kebijakan jaringan dari file policy.yaml.

    kubectl apply -f policy.yaml

    Output yang diharapkan:

    networkpolicy.networking.k8s.io/access-nginx created
  3. Ketika label access belum ditentukan, uji akses ke Service nginx. Request akan timeout dan akses gagal.

    kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/sh

    Uji akses ke Service nginx:

    wget nginx

    Output yang diharapkan:

    Connecting to nginx (172.19.XX.XX:80)
    wget: can't connect to remote host (172.19.XX.XX): Connection timed out
  4. Tentukan label access.

    kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/sh

    Uji akses ke Service nginx:

    wget nginx

    Output yang diharapkan:

    Connecting to nginx (172.21.XX.XX:80)
    saving to 'index.html'
    index.html           100% |****************************************************************************************************************************************************|   612  0:00:00 ETA
    'index.html' saved

Skenario 2: Gunakan kebijakan jaringan untuk membatasi blok CIDR sumber yang dapat mengakses layanan yang menghadap internet

kubectl

  1. Buat layanan SLB untuk aplikasi nginx. Tetapkan type=LoadBalancer untuk mengekspos Service nginx ke internet.

    Buat file bernama nginx-service.yaml dengan konten berikut:

    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

    Terapkan layanan:

    kubectl apply -f nginx-service.yaml

    Output yang diharapkan:

    service/nginx-slb created

    Periksa bahwa layanan mengekspos nginx ke internet:

    kubectl get service nginx-slb

    Output yang diharapkan:

    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. Akses alamat IP SLB. Koneksi gagal karena kebijakan jaringan yang ada membatasi akses.

    Catatan
    • Service nginx yang dikonfigurasi hanya dapat diakses oleh aplikasi dengan label access=true.

    • Mengakses alamat IP SLB merupakan akses eksternal ke Kubernetes, yang berbeda dari kebijakan tingkat Pod.

    Solusi: Ubah kebijakan jaringan untuk menambahkan blok CIDR sumber yang diizinkan.

    wget 47.110.xxx.xxx

    Output yang diharapkan:

    --2018-11-21 11:46:05--  http://47.110.xx.xxx/
    Connecting to 47.110.XX.XX:80... failed: Connection refused.
  3. Lihat alamat IP lokal Anda:

    curl myip.ipip.net

    Output yang diharapkan:

    Current IP: 10.0.x.x From: China Beijing Beijing        # Ini adalah contoh. Informasi perangkat aktual yang berlaku.
  4. Ubah policy.yaml untuk menambahkan blok CIDR sumber yang diizinkan:

    Catatan
    • Gunakan awalan /24 untuk alamat IP lokal karena beberapa jaringan memiliki beberapa alamat IP outbound.

    • Alamat health check SLB berada dalam rentang 100.64.0.0/10. Tambahkan rentang ini ke blok CIDR yang diizinkan.

    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      # alamat IP lokal. Ini adalah contoh. Informasi perangkat aktual yang berlaku.

    Terapkan kebijakan yang diperbarui:

    kubectl apply -f policy.yaml

    Output yang diharapkan:

    networkpolicy.networking.k8s.io/access-nginx unchanged
  5. Verifikasi bahwa Service nginx dapat diakses melalui SLB.

    kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/sh

    Di dalam terminal busybox:

    wget 47.110.XX.XX

    Output yang diharapkan:

    Connecting to 47.110.XX.XX (47.110.XX.XX:80)
    index.html           100% |***********************************************************|   612  0:00:00 ETA

Skenario 3: Gunakan kebijakan jaringan untuk membatasi Pod agar hanya mengakses alamat tertentu

Contoh ini menggunakan www.aliyun.com dan registry.aliyuncs.com untuk menunjukkan cara mengatur kebijakan jaringan agar Pod hanya dapat mengakses registry.aliyuncs.com.

kubectl

  1. Ambil alamat IP untuk www.aliyun.com:

    dig +short www.aliyun.com

    Output yang diharapkan:

    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. Buat file bernama busybox-policy.yaml dengan konten berikut:

    Catatan

    Aturan egress kedua mengizinkan UDP 53 (DNS) ke semua tujuan, yang diperlukan untuk resolusi DNS.

    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
  3. Terapkan kebijakan jaringan:

    kubectl apply -f busybox-policy.yaml

    Output yang diharapkan:

    networkpolicy.networking.k8s.io/busybox-policy created
  4. Buat Pod busybox dan uji akses ke domain yang diblokir.

    kubectl run busybox --rm -ti --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/sh

    Coba akses domain selain www.aliyun.com, misalnya www.taobao.com:

    wget www.taobao.com

    Output yang diharapkan:

    Connecting to www.taobao.com (64.13.XX.XX:80)
    wget: can't connect to remote host (64.13.XX.XX): Connection timed out
  5. Uji akses ke domain yang diizinkan (www.aliyun.com):

    wget www.aliyun.com

    Output yang diharapkan:

    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

Skenario 4: Gunakan kebijakan jaringan untuk mengontrol akses jaringan publik bagi Pod dalam namespace

Catatan

Operasi ini dapat memengaruhi layanan online yang mengakses jaringan publik. Lakukan langkah-langkah berikut di namespace kosong.

kubectl

  1. Buat namespace uji coba:

    kubectl create ns test-np

    Output yang diharapkan:

    namespace/test-np created
  2. Buat kebijakan jaringan default yang hanya mengizinkan akses outbound ke jaringan internal.

    Buat file bernama default-deny.yaml dengan konten berikut:

    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

    Terapkan kebijakan:

    kubectl apply -f default-deny.yaml

    Output yang diharapkan:

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

    Lihat kebijakan jaringan:

    kubectl get networkpolicy -n test-np

    Output yang diharapkan:

    NAME                              POD-SELECTOR          AGE
    deny-public-net                   <none>                1m
  3. Buat kebijakan yang mengizinkan akses internet untuk Pod dengan label public-network=true.

    Buat file bernama allow-specify-label.yaml dengan konten berikut:

    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

    Terapkan kebijakan:

    kubectl apply -f allow-specify-label.yaml

    Output yang diharapkan:

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

    Lihat kebijakan jaringan:

    kubectl get networkpolicy -n test-np

    Output yang diharapkan:

    NAME                              POD-SELECTOR          AGE
    allow-public-network-for-labels   public-network=true    1m
    deny-public-net                   <none>                 3m
  4. Verifikasi bahwa Pod tanpa label tidak dapat mengakses internet.

    kubectl run -it --namespace test-np --rm --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2  busybox-intranet

    Di dalam Pod:

    ping aliyun.com

    Output yang diharapkan:

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

    Hasil menunjukkan 0 paket diterima dan kehilangan paket 100%, yang berarti akses internet diblokir. Kebijakan deny-public-net menolak akses internet untuk semua Pod di namespace test-np secara default.

  5. Verifikasi bahwa Pod dengan label public-network=true dapat mengakses internet.

    kubectl run -it --namespace test-np --labels public-network=true --rm --image registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2  busybox-internet

    Di dalam Pod:

    ping aliyun.com

    Output yang diharapkan:

    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

    Hasil menunjukkan kehilangan paket 0%, yang berarti akses internet diizinkan. Kebijakan allow-public-network-for-labels menggantikan kebijakan penolakan untuk Pod dengan label public-network=true.