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
Sebuah klaster ACK dikelola atau klaster ACK khusus telah dibuat. Untuk informasi lebih lanjut, lihat Buat klaster ACK dikelola dan Buat klaster ACK khusus (tidak dilanjutkan).
PentingKlaster ACK Pro dan klaster ACK Serverless menggunakan komponen yang berbeda untuk mengimplementasikan kebijakan jaringan.
Dalam klaster ACK Pro yang tidak mengandung instans wadah elastis, kebijakan jaringan diimplementasikan dengan menggunakan Terway. Untuk informasi lebih lanjut, lihat Langkah 1: Aktifkan kebijakan jaringan.
Dalam instans wadah elastis dari klaster ACK Serverless atau klaster ACK Pro, kebijakan jaringan diimplementasikan dengan menggunakan Poseidon. Konten berikutnya menjelaskan detail tentang implementasi tersebut.
Anda harus memperbarui komponen ACK Virtual Node ke versi 2.10.0 atau yang lebih baru. Untuk informasi lebih lanjut, lihat Kelola komponen.
Sebuah kelompok keamanan telah dikonfigurasikan.
File kubeconfig klaster diperoleh dan digunakan untuk terhubung ke klaster melalui kubectl.
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.
Instal komponen Poseidon.
Masuk ke Konsol ACK. Di bilah navigasi kiri, klik Clusters.
Di halaman Clusters, temukan klaster yang ingin Anda kelola dan klik namanya. Di bilah navigasi kiri, klik Add-ons.
Di halaman Add-ons, klik tab Networking. Di kartu Poseidon, klik Install.
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
Masuk ke Konsol ACK. Di bilah navigasi kiri, klik Clusters.
Di halaman Clusters, klik nama klaster yang ingin Anda kelola dan pilih di bilah navigasi kiri.
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
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.
Periksa apakah aplikasi klien busybox dapat mengakses Layanan nginx.
Di halaman Deployments, temukan aplikasi busybox dan klik namanya.
Di halaman Pods, pilih pod bernama busybox-{nilai hash} dan klik Terminal di kolom Aksi.

Di terminal, jalankan perintah
wget nginxuntuk mengakses Layanan nginx.
Output sebelumnya menunjukkan bahwa busybox dapat mengakses Layanan nginx.
Use the CLI
Jalankan perintah berikut untuk membuat aplikasi bernama nginx. Kemudian, buat Layanan bernama nginx untuk memaparkan aplikasi.
Buat aplikasi bernama nginx:
kubectl run nginx --image=nginxOutput yang diharapkan:
pod/nginx createdPeriksa apakah pod aplikasi telah dimulai:
kubectl get podOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 45sBuat Layanan bernama nginx:
kubectl expose pod nginx --port=80Output yang diharapkan:
service/nginx exposedLihat Layanan:
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 12sJalankan perintah berikut untuk membuat pod bernama busybox dan gunakan pod tersebut untuk mengakses Layanan nginx:
kubectl run busybox --rm -ti --image=busybox /bin/shOutput 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
Jalankan perintah vim
policy.yamluntuk membuat file bernama policy.yaml dengan template YAML berikut.vim policy.yamlBlok 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"Jalankan perintah berikut untuk membuat kebijakan jaringan menggunakan file policy.yaml sebelumnya:
kubectl apply -f policy.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/access-nginx createdJalankan 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/shUji aksesibilitas Layanan 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 outJalankan perintah berikut untuk menambahkan label yang ditentukan ke pod:
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shUji aksesibilitas Layanan 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' savedOutput 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
Jalankan perintah berikut untuk membuat instans SLB untuk aplikasi nginx sebelumnya. Atur tipe Layanan ke
LoadBalanceruntuk membuat aplikasi dapat diakses melalui internet.vim nginx-service.yamlDalam 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: LoadBalancerJalankan perintah berikut untuk membuat kebijakan jaringan menggunakan file nginx-service.yaml:
kubectl apply -f nginx-service.yamlOutput yang diharapkan:
service/nginx-slb createdPeriksa apakah aplikasi dipaparkan menggunakan Layanan nginx:
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 8mJalankan perintah berikut untuk terhubung ke alamat IP instans SLB yang dibuat: 47.110.xxx.xxx. Output menunjukkan bahwa koneksi gagal.
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.CatatanKoneksi 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.
Jalankan perintah berikut untuk memeriksa alamat IP mesin lokal Anda:
curl myip.ipip.netOutput yang diharapkan:
Alamat IP: 10.0.x.x. Dari: China Beijing Beijing # Ini adalah contoh. Gunakan alamat IP aktual.Jalankan perintah berikut untuk memodifikasi file policy.yaml:
vim policy.yamlContoh 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.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/access-nginx unchangedCatatanPermintaan 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 menambahkan100.64.0.0/10ke aturan.
Jalankan perintah berikut untuk membuat sumber daya yang disediakan untuk Layanan nginx:
kubectl run busybox --rm -ti --labels="access=true" --image=busybox /bin/shAkses Layanan nginx:
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 ETAJika output menunjukkan 100%, ini menunjukkan bahwa Layanan nginx dapat diakses.
Skenario 3: Izinkan pod mengakses alamat tertentu
Jalankan perintah berikut untuk memeriksa alamat IP tempat www.aliyun.com diselesaikan:
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.3Jalankan perintah berikut untuk membuat file bernama busybox-policy:
vim busybox-policy.yamlContoh 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: 53CatatanAturan 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.
Jalankan perintah berikut untuk membuat kebijakan jaringan berdasarkan file busybox-policy:
kubectl apply -f busybox-policy.yamlOutput yang diharapkan:
networkpolicy.networking.k8s.io/busybox-policy createdJalankan perintah berikut untuk membuat aplikasi busybox:
kubectl run busybox --rm -ti --image=busybox /bin/shAkses situs web selain www.aliyun.com, seperti 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 outOutput menunjukkan pesan can't connect to remote host. Ini menunjukkan bahwa aplikasi gagal mengakses nama domain.
Jalankan perintah berikut untuk mengakses 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 ETAOutput 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
Operasi dalam bagian ini dapat memengaruhi layanan yang berkomunikasi dengan internet. Kami menyarankan Anda membuat namespace kosong untuk melakukan operasi berikut.
Jalankan perintah berikut untuk membuat namespace untuk pengujian.
Buat namespace bernama test-np.
kubectl create ns test-npOutput yang diharapkan:
namespace/test-np createdJalankan perintah berikut untuk membuat kebijakan jaringan default yang mengizinkan pod dalam namespace test-np untuk mengakses hanya layanan internal:
vim default-deny.yamlContoh 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/8Periksa apakah kebijakan jaringan dibuat menggunakan file default-deny.yaml.
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> 1mJalankan perintah berikut untuk mengizinkan pod dengan label tertentu mengakses internet.
vim allow-specify-label.yamlDalam contoh ini, label
public-network=truedigunakan.# 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 aktualJalankan perintah berikut untuk membuat kebijakan jaringan:
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> 3mJalankan 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-intranetping 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 lossOutput menunjukkan 0 packets received. Ini menunjukkan bahwa pod gagal mengakses internet.
CatatanPod 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.
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-internetping 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 msOutput menunjukkan 0% packet loss. Ini menunjukkan bahwa pod dapat mengakses internet.
CatatanPod 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.