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
Instal komponen Poseidon.
Masuk ke Konsol ACS. Di panel navigasi sebelah kiri, klik Clusters.
Pada halaman Component Management, klik tab Network. Di pojok kanan bawah kartu komponen Poseidon, klik Install.
Pada halaman Install Component Poseidon, pilih Enable NetworkPolicy lalu klik Confirm.

Setelah komponen terinstal, status Installed akan muncul di pojok kanan atas kartu.
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
Dapatkan file kubeconfig kluster dan gunakan kubectl untuk terhubung ke kluster.
Buat aplikasi nginx dan gunakan Service bernama nginx untuk berkomunikasi dengannya.
Buat aplikasi nginx:
kubectl run nginx --image=nginxOutput yang diharapkan:
pod/nginx createdPeriksa apakah Pod sudah berjalan:
kubectl get podOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 45sBuat Service bernama nginx:
kubectl expose pod nginx --port=80Output yang diharapkan:
service/nginx exposedLihat Service:
kubectl get serviceOutput 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 12sBuat 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/shOutput yang diharapkan:
If you don't see a command prompt, try pressing enter. / # / #Uji koneksi ke nginx:
wget nginxOutput 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
Gunakan template YAML berikut dan jalankan perintah
vim policy.yamluntuk membuat file bernama policy.yaml.vim policy.yamlBerikut 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"Buat kebijakan jaringan dari file policy.yaml.
kubectl apply -f policy.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/access-nginx createdKetika 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/shUji akses ke Service nginx:
wget nginxOutput yang diharapkan:
Connecting to nginx (172.19.XX.XX:80) wget: can't connect to remote host (172.19.XX.XX): Connection timed outTentukan label access.
kubectl run busybox --rm -ti --labels="access=true" --image=registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 /bin/shUji akses ke Service nginx:
wget nginxOutput 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
Buat layanan SLB untuk aplikasi nginx. Tetapkan
type=LoadBalanceruntuk 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: LoadBalancerTerapkan layanan:
kubectl apply -f nginx-service.yamlOutput yang diharapkan:
service/nginx-slb createdPeriksa bahwa layanan mengekspos nginx ke internet:
kubectl get service nginx-slbOutput 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 8mAkses alamat IP SLB. Koneksi gagal karena kebijakan jaringan yang ada membatasi akses.
CatatanService 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.xxxOutput yang diharapkan:
--2018-11-21 11:46:05-- http://47.110.xx.xxx/ Connecting to 47.110.XX.XX:80... failed: Connection refused.Lihat alamat IP lokal Anda:
curl myip.ipip.netOutput yang diharapkan:
Current IP: 10.0.x.x From: China Beijing Beijing # Ini adalah contoh. Informasi perangkat aktual yang berlaku.Ubah policy.yaml untuk menambahkan blok CIDR sumber yang diizinkan:
CatatanGunakan 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.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/access-nginx unchangedVerifikasi 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/shDi dalam terminal busybox:
wget 47.110.XX.XXOutput 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
Ambil alamat IP untuk www.aliyun.com:
dig +short www.aliyun.comOutput 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.3Buat file bernama busybox-policy.yaml dengan konten berikut:
CatatanAturan 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: 53Terapkan kebijakan jaringan:
kubectl apply -f busybox-policy.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/busybox-policy createdBuat 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/shCoba akses domain selain www.aliyun.com, misalnya www.taobao.com:
wget www.taobao.comOutput 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 outUji akses ke domain yang diizinkan (www.aliyun.com):
wget www.aliyun.comOutput 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
Operasi ini dapat memengaruhi layanan online yang mengakses jaringan publik. Lakukan langkah-langkah berikut di namespace kosong.
kubectl
Buat namespace uji coba:
kubectl create ns test-npOutput yang diharapkan:
namespace/test-np createdBuat 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/8Terapkan kebijakan:
kubectl apply -f default-deny.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/deny-public-net createdLihat kebijakan jaringan:
kubectl get networkpolicy -n test-npOutput yang diharapkan:
NAME POD-SELECTOR AGE deny-public-net <none> 1mBuat 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-systemTerapkan kebijakan:
kubectl apply -f allow-specify-label.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/allow-public-network-for-labels createdLihat kebijakan jaringan:
kubectl get networkpolicy -n test-npOutput yang diharapkan:
NAME POD-SELECTOR AGE allow-public-network-for-labels public-network=true 1m deny-public-net <none> 3mVerifikasi 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-intranetDi dalam Pod:
ping aliyun.comOutput 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 lossHasil 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.
Verifikasi bahwa Pod dengan label
public-network=truedapat 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-internetDi dalam Pod:
ping aliyun.comOutput 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 msHasil 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.