全部产品
Search
文档中心

Container Service for Kubernetes:Gunakan kebijakan jaringan

更新时间:Jul 06, 2025

Anda dapat menggunakan kebijakan jaringan Kubernetes untuk mengimplementasikan kontrol akses berbasis kebijakan. Untuk mengontrol lalu lintas jaringan ke aplikasi tertentu berdasarkan alamat IP atau port, Anda dapat mengonfigurasi kebijakan jaringan. Topik ini menjelaskan skenario penggunaan kebijakan jaringan dalam klaster ACK Serverless.

Prasyarat

Catatan Penggunaan

  • Anda hanya dapat menggunakan kebijakan jaringan dalam klaster ACK Serverless Pro dan klaster ACK Pro.

  • Kebijakan jaringan tidak mendukung alamat IPv6.

  • Kebijakan jaringan tidak mendukung bidang endPort.

  • Anda dapat menggunakan pemilih label dalam kebijakan jaringan untuk memilih namespace dan pod. Jika Anda membuat sejumlah besar kebijakan jaringan dalam sebuah klaster, proses pencocokan permintaan terhadap aturan dalam kebijakan jaringan akan memakan waktu. Selain itu, manajemen klaster dan pemecahan masalah menjadi rumit jika klaster memiliki banyak kebijakan jaringan. Kami menyarankan Anda membuat kurang dari 40 kebijakan jaringan dalam sebuah klaster.

Langkah 1: Aktifkan kebijakan jaringan

Untuk mengaktifkan kebijakan jaringan untuk klaster ACK Serverless Pro, lakukan operasi berikut.

  1. Instal komponen Poseidon.

    1. Masuk ke Konsol ACK. Di bilah navigasi kiri, klik Clusters.

    2. Di halaman Clusters, temukan klaster yang ingin Anda kelola dan klik namanya. Di bilah navigasi kiri, klik Add-ons.

    3. Di halaman Add-ons, klik tab Networking. Di kartu Poseidon, klik Install.

    4. Di kotak dialog Install Poseidon, pilih Enable the NetworkPolicy feature for elastic container instances dan klik OK.

      Setelah komponen diinstal, Installed ditampilkan di pojok kanan atas kartu.

Langkah 2: Buat aplikasi NGINX yang mengizinkan akses dari pod lain

Use the ACK console

  1. Masuk ke Konsol ACK. Di bilah navigasi kiri, klik Clusters.

  2. Di halaman Clusters, klik nama klaster yang ingin Anda kelola dan pilih Workloads > Deployments di bilah navigasi kiri.

  3. Di tab Deployments, klik Create from Image. Di halaman Create, buat aplikasi bernama nginx dan paparkan aplikasi tersebut menggunakan Layanan. Setelah Anda menyelesaikan konfigurasi aplikasi, klik Create.

    Anda dapat mengonfigurasi parameter berikut berdasarkan deskripsi dalam tabel berikut dan menggunakan pengaturan default untuk parameter lainnya. Untuk informasi lebih lanjut, lihat Parameter.

    Parameter

    Deskripsi

    Contoh

    Informasi Dasar

    Nama

    Tentukan nama aplikasi kustom.

    nginx

    Replika

    Tentukan nilai berdasarkan kebutuhan bisnis Anda.

    1

    Wadah

    Nama Gambar

    Tentukan nama gambar wadah.

    nginx:latest

    Lanjutan

    Layanan

    Klik Create di sebelah kanan Services. Dalam kotak dialog Buat Layanan, atur parameter.

    Nama: nginx

    Jenis:

    • Server Load Balancer

    • Akses Publik

    • Buat Instans SLB

    Pemetaan Port:

    • Nama: nginx

    • Port Layanan: 80

    • Port Wadah: 80

    • Protokol: TCP

  4. Kembali ke halaman Deployments dan klik Create from Image. Di halaman Create, buat aplikasi klien bernama busybox untuk menguji aksesibilitas Layanan nginx yang dibuat pada langkah sebelumnya.

    Anda dapat mengonfigurasi parameter berikut untuk aplikasi klien busybox berdasarkan deskripsi dalam tabel berikut dan menggunakan pengaturan default untuk parameter lainnya. Untuk informasi lebih lanjut, lihat Parameter.

    Parameter

    Deskripsi

    Contoh

    Informasi Dasar

    Nama

    Tentukan nama aplikasi kustom.

    busybox

    Replika

    Tentukan nilai berdasarkan kebutuhan bisnis Anda.

    1

    Parameter Mulai Wadah

    Nama Gambar

    Tentukan nama gambar wadah.

    busybox:latest

    Parameter Mulai Wadah

    Tidak ada.

    Pilih stdin dan tty.

  5. Periksa apakah aplikasi klien busybox dapat mengakses Layanan nginx.

    1. Di halaman Deployments, temukan aplikasi busybox dan klik namanya.

    2. Di halaman Pods, pilih pod bernama busybox-{nilai hash} dan klik Terminal di kolom Aksi.

      image.png

    3. Di terminal, jalankan perintah wget nginx untuk mengakses Layanan nginx.

      connection

      Output sebelumnya menunjukkan bahwa busybox dapat mengakses Layanan nginx.

Use the CLI

  1. Jalankan perintah berikut untuk membuat aplikasi bernama nginx. Kemudian, buat Layanan bernama nginx untuk memaparkan aplikasi.

    Buat aplikasi bernama nginx:

    kubectl run nginx --image=nginx

    Output yang diharapkan:

    pod/nginx created

    Periksa apakah pod aplikasi telah dimulai:

    kubectl get pod

    Output yang diharapkan:

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

    Buat Layanan bernama nginx:

    kubectl expose pod nginx --port=80

    Output yang diharapkan:

    service/nginx exposed

    Lihat Layanan:

    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
  2. Jalankan perintah berikut untuk membuat pod bernama busybox dan gunakan pod tersebut untuk mengakses Layanan nginx:

    kubectl run busybox --rm -ti --image=busybox /bin/sh

    Output yang diharapkan:

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

    Peroleh Layanan nginx:

    If you don't see a command prompt, try pressing enter.
    / #
    / # wget nginx  # Masukkan 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: Konfigurasikan kebijakan jaringan

Konfigurasikan kebijakan jaringan berdasarkan skenario berikut.

Skenario 1: Izinkan hanya aplikasi dengan label tertentu untuk mengakses Layanan

  1. Jalankan perintah vim policy.yaml untuk membuat file bernama policy.yaml dengan template YAML berikut.

    vim policy.yaml

    Blok kode berikut menunjukkan konten template YAML:

    kind: NetworkPolicy
    apiVersion: networking.k8s.io/v1
    metadata:
      name: access-nginx
    spec:
      podSelector:
        matchLabels:
          run: nginx
      ingress:
      - from:
        - podSelector:
            matchLabels:
              access: "true"
  2. Jalankan perintah berikut untuk membuat kebijakan jaringan menggunakan file policy.yaml sebelumnya:

    kubectl apply -f policy.yaml 

    Output yang diharapkan:

    networkpolicy.networking.k8s.io/access-nginx created
  3. Jalankan perintah berikut untuk mengakses Layanan nginx. Kesalahan timeout koneksi dikembalikan karena pod tidak memiliki label yang ditentukan:

    kubectl run busybox --rm -ti --image=busybox /bin/sh

    Uji aksesibilitas Layanan 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. Jalankan perintah berikut untuk menambahkan label yang ditentukan ke pod:

    kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/sh

    Uji aksesibilitas Layanan 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

    Output menunjukkan bahwa kemajuan koneksi adalah 100%. Ini menunjukkan bahwa pod dapat mengakses Layanan nginx seperti yang diharapkan.

Skenario 2: Izinkan hanya alamat IP sumber tertentu untuk mengakses Layanan melalui instans SLB yang menghadap internet

  1. Jalankan perintah berikut untuk membuat instans SLB untuk aplikasi nginx sebelumnya. Atur tipe Layanan ke LoadBalancer untuk membuat aplikasi dapat diakses melalui internet.

    vim nginx-service.yaml

    Dalam contoh ini, file bernama nginx-service.yaml digunakan.

    # Salin konten YAML berikut ke file 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

    Jalankan perintah berikut untuk membuat kebijakan jaringan menggunakan file nginx-service.yaml:

    kubectl apply -f nginx-service.yaml 

    Output yang diharapkan:

    service/nginx-slb created

    Periksa apakah aplikasi dipaparkan menggunakan 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. Jalankan perintah berikut untuk terhubung ke alamat IP instans SLB yang dibuat: 47.110.xxx.xxx. Output menunjukkan bahwa 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:

    • Layanan nginx hanya dapat diakses oleh aplikasi yang memiliki label access=true.

    • Saat Anda terhubung ke alamat IP instans SLB dari mesin lokal Anda, Anda mengakses Layanan nginx dari luar klaster Kubernetes. Ini tidak sama dengan saat Anda menggunakan kebijakan jaringan untuk mengizinkan hanya aplikasi dengan label tertentu untuk mengakses Layanan nginx.

    Solusi: Modifikasi kebijakan jaringan untuk mengizinkan alamat IP sumber mengakses Layanan nginx.

  3. Jalankan perintah berikut untuk memeriksa alamat IP mesin lokal Anda:

    curl myip.ipip.net

    Output yang diharapkan:

    Alamat IP: 10.0.x.x. Dari: China Beijing Beijing        # Ini adalah contoh. Gunakan alamat IP aktual.

  4. Jalankan perintah berikut untuk memodifikasi file policy.yaml:

    vim policy.yaml

    Contoh file policy.yaml:

    # Konten berikut adalah contoh file YAML. 
    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      # Ini adalah contoh. Gunakan alamat IP aktual.

    Jalankan perintah berikut untuk membuat kebijakan jaringan menggunakan file policy.yaml sebelumnya:

    kubectl apply -f policy.yaml 

    Output yang diharapkan:

    networkpolicy.networking.k8s.io/access-nginx unchanged
    Catatan
    • Permintaan mungkin berasal dari alamat IP yang berbeda. Oleh karena itu, tentukan blok CIDR dengan panjang masker 24.

    • Alamat IP yang digunakan oleh SLB untuk pemeriksaan kesehatan berada dalam blok CIDR 100.64.0.0/10. Oleh karena itu, pastikan Anda menambahkan 100.64.0.0/10 ke aturan.

  5. Jalankan perintah berikut untuk membuat sumber daya yang disediakan untuk Layanan nginx:

    kubectl run busybox --rm -ti --labels="access=true" --image=busybox /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

    Jika output menunjukkan 100%, ini menunjukkan bahwa Layanan nginx dapat diakses.

Skenario 3: Izinkan pod mengakses alamat tertentu

  1. Jalankan perintah berikut untuk memeriksa alamat IP tempat www.aliyun.com diselesaikan:

    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. Jalankan perintah berikut untuk membuat file bernama busybox-policy:

    vim busybox-policy.yaml

    Contoh file busybox-policy:

    # Konten berikut adalah contoh file YAML. 
    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 keluar dikonfigurasi dalam file busybox-policy untuk membatasi akses keluar dari aplikasi. Anda harus mengizinkan aplikasi untuk mengakses port UDP 53. Jika tidak, resolusi Domain Name System (DNS) tidak akan berfungsi.

  3. Jalankan perintah berikut untuk membuat kebijakan jaringan berdasarkan file busybox-policy:

    kubectl apply -f busybox-policy.yaml 

    Output yang diharapkan:

    networkpolicy.networking.k8s.io/busybox-policy created
  4. Jalankan perintah berikut untuk membuat aplikasi busybox:

    kubectl run busybox --rm -ti --image=busybox /bin/sh

    Akses situs web selain www.aliyun.com, seperti 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

    Output menunjukkan pesan can't connect to remote host. Ini menunjukkan bahwa aplikasi gagal mengakses nama domain.

  5. Jalankan perintah berikut untuk mengakses 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

    Output menunjukkan bahwa kemajuan koneksi adalah 100%. Ini menunjukkan bahwa aplikasi dapat mengakses nama domain seperti yang diharapkan.

Skenario 4: Kontrol akses pod ke internet dalam namespace tertentu

Catatan

Operasi dalam bagian ini dapat memengaruhi layanan yang berkomunikasi dengan internet. Kami menyarankan Anda membuat namespace kosong untuk melakukan operasi berikut.

  1. Jalankan perintah berikut untuk membuat namespace untuk pengujian.

    Buat namespace bernama test-np.

    kubectl create ns test-np

    Output yang diharapkan:

    namespace/test-np created
  2. Jalankan perintah berikut untuk membuat kebijakan jaringan default yang mengizinkan pod dalam namespace test-np untuk mengakses hanya layanan internal:

    vim default-deny.yaml

    Contoh file default-deny.yaml:

    # Konten berikut adalah contoh file YAML. 
    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

    Periksa apakah kebijakan jaringan dibuat menggunakan 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. Jalankan perintah berikut untuk mengizinkan pod dengan label tertentu mengakses internet.

    vim allow-specify-label.yaml

    Dalam contoh ini, label public-network=true digunakan.

    # Konten berikut adalah contoh file YAML. 
    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  # Pod dapat mengakses layanan penting di kube-system (misalnya CoreDNS). Ini adalah konfigurasi contoh saja, sesuaikan menurut kebutuhan aktual

    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. Jalankan perintah berikut untuk memverifikasi bahwa pod tanpa label yang ditentukan tidak dapat mengakses internet:

    kubectl run -it --namespace test-np --rm --image registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/busybox:1.28 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

    Output menunjukkan 0 packets received. Ini menunjukkan bahwa pod gagal mengakses internet.

    Catatan

    Pod gagal mengakses internet karena kebijakan jaringan deny-public-net tidak mengizinkan pod dalam namespace test-np untuk mengakses internet. Oleh karena itu, pod dengan label default tidak dapat mengakses internet.

  5. Jalankan perintah berikut untuk memverifikasi 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.ack.aliyuncs.com/ack-demo/busybox:1.28 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

    Output menunjukkan 0% packet loss. Ini menunjukkan bahwa pod dapat mengakses internet.

    Catatan

    Pod dapat mengakses internet karena kebijakan jaringan allow-public-network-for-labels mengizinkan pod dengan label public-network=true untuk mengakses internet. Pod busybox-internet memiliki label ini dan oleh karena itu dapat mengakses internet.