All Products
Search
Document Center

Container Compute Service:Kebijakan jaringan di kluster ACS

Last Updated:Jun 22, 2026

Alibaba Cloud Container Compute Service (ACS) memungkinkan Anda menerapkan kontrol jaringan berbasis kebijakan dengan Kubernetes NetworkPolicy. Gunakan kebijakan jaringan untuk mengontrol lalu lintas jaringan pada level alamat IP atau port untuk aplikasi tertentu di kluster Anda. Topik ini menjelaskan cara menggunakan kebijakan jaringan di kluster ACS dan menyediakan kasus penggunaan umum.

Penerapan

  • Hanya Pod CPU general-purpose dan komputasi-teroptimalkan yang didukung.

  • Hanya IPv4 yang didukung.

Catatan

  • Aturan NetworkPolicy memungkinkan Anda memilih namespace atau Pod menggunakan LabelSelector. Namun, menerapkan lebih banyak NetworkPolicy pada sebuah Pod akan meningkatkan waktu yang diperlukan agar aturan tersebut berlaku. Banyaknya aturan NetworkPolicy juga dapat mempersulit manajemen dan troubleshooting kluster. Oleh karena itu, batasi jumlah NetworkPolicy di kluster Anda hingga kurang dari 40.

Langkah 1: Aktifkan NetworkPolicy

  1. Instal komponen Poseidon.

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

    2. Di halaman Clusters, klik nama kluster target. Di panel navigasi kiri, klik Add-ons.

    3. Di halaman Component management, klik tab Network. Pada kartu Poseidon, klik Install.

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

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

  2. Aktifkan NetworkPolicy dalam anotasi Pod.

    Untuk mengaktifkan NetworkPolicy pada sebuah Pod, tambahkan anotasi berikut ke metadata-nya: network.alibabacloud.com/enable-network-policy-agent: "true".

    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 Nginx

kubectl

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

  2. Buat aplikasi Nginx dan komunikasikan melalui Service bernama nginx.

    Buat aplikasi Nginx:

    kubectl run nginx --image=nginx

    Output yang diharapkan:

    pod/nginx created

    Periksa status pod:

    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 dan akses 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 akses ke Nginx:

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

    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 dalam skenario berikut sesuai kebutuhan.

Skenario 1: Izinkan akses berdasarkan label

kubectl

  1. Gunakan templat YAML berikut dan jalankan perintahvim policy.yaml untuk membuat filepolicy.yaml.

    vim policy.yaml

    Berikut adalah isi file YAML tersebut.

    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. Saat label akses tidak ditentukan, permintaan ke Service bernama nginx akan timeout dan gagal.

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

    Uji akses ke Service bernama 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 akses.

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

    Uji 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

    Progres 100% menunjukkan koneksi berhasil ke layanan Nginx.

Skenario 2: Batasi akses berdasarkan blok CIDR sumber

kubectl

  1. Buat layanan SLB Alibaba Cloud untuk aplikasi Nginx dan atur type=LoadBalancer untuk mengekspos layanan Nginx ke internet.

    vim nginx-service.yaml

    Berikut adalah isi untuk file nginx-service.yaml.

    # 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

    Buat layanan dari file nginx-service.yaml.

    kubectl apply -f nginx-service.yaml 

    Output yang diharapkan:

    service/nginx-slb created

    Periksa apakah aplikasi mengekspos layanan Nginx:

    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 instans SLB, 47.110.xxx.xxx. Koneksi gagal.

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

    Koneksi gagal karena alasan berikut:

    • Kebijakan jaringan hanya mengizinkan akses dari aplikasi dengan label access=true.

    • Traffic dari alamat IP SLB berasal dari luar kluster. Kebijakan jaringan saat ini hanya mengizinkan traffic dari pod dengan label tertentu, bukan traffic eksternal.

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

  3. Periksa alamat IP mesin lokal Anda.

    curl myip.ipip.net

    Output yang diharapkan:

    Current IP: 10.0.x.x From: China Beijing Beijing # This is an example. The actual output from your device may vary.
  4. Modifikasi file policy.yaml yang telah Anda buat.

    vim policy.yaml

    Modifikasi file policy.yaml sebagai berikut:

    # 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      # Your local IP address. This is an example. Your actual address may vary.

    Terapkan kebijakan yang diperbarui:

    kubectl apply -f policy.yaml 

    Output yang diharapkan:

    networkpolicy.networking.k8s.io/access-nginx unchanged
    Catatan
    • Beberapa jaringan memiliki beberapa alamat IP egress. Gunakan rentang alamat /24 dalam kasus ini.

    • Alamat pemeriksaan kesehatan SLB berada di blok alamat 100.64.0.0/10. Oleh karena itu, Anda harus mengonfigurasi 100.64.0.0/10.

  5. Jalankan pod uji untuk mengakses layanan Nginx.

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

    Akses layanan Nginx:

    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

    Progres 100% menunjukkan koneksi berhasil ke layanan Nginx.

Skenario 3: Batasi akses pod ke alamat tertentu

Kubectl

  1. Lakukan resolusi domain 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 busybox-policy.

    vim busybox-policy.yaml

    File busybox-policy.yaml berisi hal berikut:

    # 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
    Catatan

    Aturan egress dalam file busybox-policy.yaml membatasi akses arah keluar aplikasi. Untuk memastikan resolusi DNS berfungsi, kebijakan juga harus mengizinkan permintaan UDP pada port 53.

  3. Buat kebijakan jaringan dari file busybox-policy.yaml.

    kubectl apply -f busybox-policy.yaml 

    Output yang diharapkan:

    networkpolicy.networking.k8s.io/busybox-policy created
  4. Buat pod busybox untuk menguji kebijakan.

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

    Coba akses website 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

    Pesan can't connect to remote host menunjukkan bahwa akses ke layanan ditolak.

  5. Coba akses 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

    Status penyelesaian 100% menunjukkan koneksi berhasil.

Kasus Penggunaan 4: Kontrol akses jaringan publik untuk Pod

Catatan

Operasi ini dapat memengaruhi layanan online yang mengakses jaringan publik. Kami menyarankan Anda melakukan langkah-langkah berikut di namespace kosong.

kubectl

  1. Buat namespace uji untuk memverifikasi pembatasan.

    Buat namespace bernama test-np.

    kubectl create ns test-np

    Output yang diharapkan:

    namespace/test-np created
  2. Atur kebijakan jaringan default untuk namespace ini yang hanya mengizinkan traffic arah keluar ke jaringan pribadi.

    vim default-deny.yaml

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

    # 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

    Buat kebijakan jaringan dari file default-deny.yaml.

    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. Izinkan Pod dengan label tertentu untuk mengakses jaringan publik.

    vim allow-specify-label.yaml

    Contoh label adalah public-network=true.

    # 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

    Jalankan perintah berikut untuk membuat kebijakan jaringan:

    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 tertentu tidak dapat mengakses jaringan publik.

    kubectl run -it --namespace test-np --rm --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2  busybox-intranet
    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

    Pesan 0 packets received menunjukkan bahwa akses gagal.

    Catatan

    Akses gagal karena kebijakan jaringan deny-public-net secara default memblokir akses jaringan publik untuk semua Pod di namespace test-np.

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

    kubectl run -it --namespace test-np --labels public-network=true --rm --image registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2  busybox-internet
    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

    Pesan 0% packet loss menunjukkan akses berhasil ke jaringan publik.

    Catatan

    Akses berhasil karena kebijakan jaringan allow-public-network-for-labels memberikan akses jaringan publik kepada Pod dengan label public-network=true, seperti Pod busybox-internet.